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;

之后才正常中断

posted @ 2018-08-19 00:52  HintLee  阅读(3330)  评论(0编辑  收藏  举报