TIM2作为霍尔传感器接口定时器触发TIM1 COM事件失败求助
嗨,我看了你按照RM0008霍尔传感器接口部分做的配置,不过TIM1的COM事件没触发,大概率是定时器配置里的几个细节没踩对,我帮你梳理一下关键问题点:
一、TIM2配置的核心错误
TRGO输出源选错了
你设置的TIM2->CR2 |= 0x00D0,分解二进制是0000 1101 0000,其中MMS位(CR2的[6:4])是101,对应OC4REF信号,但你需要的是OC2REF作为TRGO输出给TIM1。根据STM32F1的RM0008,MMS位设置为011才是OC2REF,所以CR2应该改成:TIM2->CR2 |= 0x00E0; // TI1S(0x80) + MMS=011(0x60) = 0xE0这是最关键的错误——之前TRGO输出的根本不是OC2REF,TIM1自然收不到正确的触发信号。
触发源未正确选择
你设置TIM2->SMCR |= 0x00000044,这里TI1F_ED(位2)是边沿检测,但TS位(SMCR的[6:4])是000,等于没选择触发源。因为你已经通过TI1S把三个霍尔输入XOR到TI1通道,所以需要把TS设置为010(对应TI1FP1,经过滤波和边沿检测后的TI1信号),这样复位模式才能正确响应霍尔信号的边沿。修改后的SMCR应该是:TIM2->SMCR |= 0x00000054; // TS=010(0x40) + TI1F_ED(0x04) = 0x54OC2预装载未开启
你配置OC2为PWM模式,但没开启CCR2的预装载功能,这可能导致OC2REF信号不稳定。需要在CCMR1里置位OC2PE(位10):TIM2->CCMR1 |= 0x7403; // 原来的0x7003加上OC2PE(0x400) = 0x7403
二、TIM1配置的补充检查
触发模式确认
你设置了TIM1->CR2 |= CCPC | CCUS,这是正确的——CCUS位(位0)会让COM事件由触发输入(也就是TIM2的TRGO)来触发,而不是默认的更新事件。保持TIM1的SMCR的SMS位为默认000(触发模式)即可,这样定时器会响应触发输入的事件。强制COM事件测试
你代码里的TIM1->EGR |= EGR_COMG是强制生成一次COM事件,用来测试中断是否正常工作的,如果中断能触发,说明NVIC和DIER的配置没问题,问题就出在触发信号的传递上。
修改后的完整代码示例
void interfacing_timer(void) { /*TIM2 AS INTERFACING TIMER 3 HALL SENSOR INPUT XORED*/ RCC->APB1ENR |= 0x0001; /*TIM2 CLOCK ENABLE*/ TIM2->ARR = 0xFFFF ; TIM2->CCR2 = 0x7fff ; TIM2->CR2 |= 0x00E0 ; /*TI1S(0x80), MMS=011 --> OC2REF(0x60)*/ TIM2->CCMR1 |= 0x7403; /*CC1S AS TRC , OC2 PWM MODE 1, OC2PE enabled*/ TIM2->SMCR |= 0x00000054 ; /*TS=010(TI1FP1), TI1F_ED, RESET MODE*/ TIM2->CR1 |= 0x0001; /*counter enabled*/ } void tim1_init(void) { RCC->APB2ENR = 0x0001 ; /*CLOCK ENABLE TIM1*/ TIM1->PSC = 160-1 ; TIM1->ARR= 1000-1 ; TIM1->CCR1 = 500-1 ; TIM1->CCR2 = 300-1 ; TIM1->CCR3 = 750-1 ; TIM1->DIER |= COMIE; TIM1->SMCR |= 0x00000010; /*ITR1--TIM2_TRGO SELECTED*/ TIM1->EGR |= EGR_COMG ; // 测试用,正常运行可移除 TIM1->CR2 |= CCPC | CCUS ; NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn); }
后续检查步骤
- 先测试TIM1的COM中断是否能通过
EGR_COMG强制触发,确认中断链路没问题; - 用示波器观察TIM2的TRGO引脚(不同型号引脚不同,比如PA0是TIM2的TRGO),看是否有OC2REF的信号输出;
- 确认霍尔传感器的输入是否正常,TI1S是否正确把三个输入XOR到TI1通道(可以通过TIM2的SR寄存器的CC1IF位来判断是否有边沿触发)。
备注:内容来源于stack exchange,提问作者NicolaiHell




