• 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;
    

    之后才正常中断

  • 相关阅读:
    『GoLang』接口
    『GoLang』结构体与方法
    『GoLang』包
    『GoLang』字典Map
    『GoLang』数组与切片
    利用griddata进行二维插值
    HTML 标签的 for 属性
    python之成像库pillow
    Python之模块IO
    StringIO和BytesIO
  • 原文地址:https://www.cnblogs.com/HintLee/p/9499456.html
Copyright © 2020-2023  润新知