overflow
溢出中断,在最初学习单片机时,使用AVR的芯片,其中断有比较中断,溢出中断等。因此,到现在也没有忘记这些Key words。在AVR单片机里,定时器通过分频器分频后就开始向上增长,有且只有这一种方式。因此,设置好计数器的初始值后,定时器就等着计数器溢出。然后执行中断程序,这里用户需要自行再重置计数器的值。但是同样的机制会不会存在于stm32的芯片不?
TIM_IT_Update溢出中断在Cortex-M3单片机里貌似并没有减少,而是灰常灰常的丰富了。与之相对应的stm32固件库里的参数即为:TIM_IT_Update。使用的方式也比AVR简单,而且其处理的方式也更加完善、完美。下面也简单的介绍一下其使用方式:
首先需要打开RCC时钟,然后配置prescaler,最后设置TIM_Period值。Tim_counter会以分频后时间间隔增加counter值。计数的方式是向上生长,从0开始,当计数值到达auto-reload值后,下一个时钟周期产生中断,将对应中断标志位置位。然后再将计数清零,并再次从零生长。中断里需要用户自行清除掉相应中断标志位。
查看了一下STM32的官方示例,并没有相关的示例。自己写了一个,以供大家参考:
//示例以72MHz的主频,以1MHz计数,当counter数到999后,产生TIM_IT_Update中断,即1ms的间隔
void delay_init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
Int16U PrescalerValue = 0;
/* PCLK1 = HCLK/4 */
RCC_PCLK1Config(RCC_HCLK_Div4);
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* Enable the TIM2 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Compute the prescaler value */
PrescalerValue = (Int16U) (SystemCoreClock / 2000000) - 1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* Prescaler configuration */
TIM_PrescalerConfig(TIM2, PrescalerValue, TIM_PSCReloadMode_Immediate);
/* TIM IT enable */
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/* TIM2 enable counter */
TIM_Cmd(TIM2, ENABLE);
}
//中断函数
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if(gTimer1 != 0)
{
gTimer1--;
}
}
}