STM32F030 定时器多次溢出才触发中断的问题

前言

最近在调试项目过程中,用了 STM32F030 的定时器 16 作为系统时钟,1ms 触发一次中断,过程中遇到一些值得记录的问题。

记录

STM32F030 中定时器 16 的初始化配置如下

void TIM16_Init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16, ENABLE);
    
    TIM_TimeBaseStructure.TIM_Prescaler = 48 - 1;  //预分频系数为48-1,这样计数器计数频率为48MHz/48 = 1MHz
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //设置时钟分割
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //设置计数器模式为向上计数模式
    TIM_TimeBaseStructure.TIM_Period = 1000;  //设置计数溢出大小,每计1000个数就产生一个更新事件,1ms一次中断
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;  //重复n次计数才触发中断
    TIM_TimeBaseInit(TIM16, &TIM_TimeBaseStructure);  //将配置应用到TIM16中
    TIM_ITConfig(TIM16, TIM_IT_Update, ENABLE);  //使能TIM16的更新中断
    TIM_Cmd(TIM16, ENABLE);  //开启定时器16

    //Enable the TIM16 Interrupt
    NVIC_InitStructure.NVIC_IRQChannel = TIM16_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

对应的中断配置

void TIM16_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM16, TIM_IT_Update) != RESET)
    {
        systime_ms++;
    }
    TIM_ClearITPendingBit(TIM16, 0x00ff);
}

配置使用了 Update 中断,也就是更新事件中断。值得注意的是初始化中的 TIM_RepetitionCounter,这个代表重复溢出多少次才触发一个中断,在一开始的配置中我忽略了这个参数,但仍然是 1ms 触发一次中断。但在后面开启了 I2C 功能和初始化 I2C 后,这个定时器就变成了 2 次溢出才触发一次中断,只有配置

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

之后才正常中断

猜你喜欢

转载自www.cnblogs.com/HintLee/p/9499456.html