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

Posted hintlee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

之后才正常中断

以上是关于STM32F030 定时器多次溢出才触发中断的问题的主要内容,如果未能解决你的问题,请参考以下文章

STM32F030系列实现仿位带操作

STM32F7 定时器触发定时器

求教stm32f030 HAL库,怎么关闭和打开所有中断

STM32F030 IO口外部中断应用

STM32F030F4P6 仅在从闪存启动时运行中断处理程序。从引导加载程序启动时重置

基于STM32F030F4P9和STM32 CUBEMX 输出PWM波形