You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TIM2作为霍尔传感器接口定时器触发TIM1 COM事件失败求助

TIM2作为霍尔传感器接口定时器触发TIM1 COM事件失败求助

嗨,我看了你按照RM0008霍尔传感器接口部分做的配置,不过TIM1的COM事件没触发,大概率是定时器配置里的几个细节没踩对,我帮你梳理一下关键问题点:

一、TIM2配置的核心错误

  1. 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自然收不到正确的触发信号。

  2. 触发源未正确选择
    你设置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) = 0x54
    
  3. OC2预装载未开启
    你配置OC2为PWM模式,但没开启CCR2的预装载功能,这可能导致OC2REF信号不稳定。需要在CCMR1里置位OC2PE(位10):

    TIM2->CCMR1 |= 0x7403; // 原来的0x7003加上OC2PE(0x400) = 0x7403
    

二、TIM1配置的补充检查

  1. 触发模式确认
    你设置了TIM1->CR2 |= CCPC | CCUS,这是正确的——CCUS位(位0)会让COM事件由触发输入(也就是TIM2的TRGO)来触发,而不是默认的更新事件。保持TIM1的SMCR的SMS位为默认000(触发模式)即可,这样定时器会响应触发输入的事件。

  2. 强制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);
}

后续检查步骤

  1. 先测试TIM1的COM中断是否能通过EGR_COMG强制触发,确认中断链路没问题;
  2. 用示波器观察TIM2的TRGO引脚(不同型号引脚不同,比如PA0是TIM2的TRGO),看是否有OC2REF的信号输出;
  3. 确认霍尔传感器的输入是否正常,TI1S是否正确把三个输入XOR到TI1通道(可以通过TIM2的SR寄存器的CC1IF位来判断是否有边沿触发)。

备注:内容来源于stack exchange,提问作者NicolaiHell

火山引擎 最新活动