STM32F1的定时器分为TIME1/8等高级定时器,TIME2~5等通用定时器,TIME6/7基本定时器。三者的区别主要参考《STM32中文参考手册》里特性的每种定时器主要特性的异同。
先看中文手册中通用定时器的简介:
通用定时器的寄存器有一个比较有趣的地方。
该寄存器在物理上实际对应着2个寄存器。
一个是程序员可以直接操作的,另外一个是程序员看不到的。
看不到的寄存器叫做影子寄存器,事实上真正起作用的是影子寄存器。
根据TIMx_CR1寄存器中APRE位的设置:APRE=0时,预装载寄存器的内容可以随时传送到影子寄存器,此时2者是连通的;而APRE=1时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。
通用定时器配置示例:
void TIM3_Init(u16 period, u16 prescaler)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_TimeBaseStructure.TIM_Period = period; TIM_TimeBaseStructure.TIM_Prescaler = prescaler;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM3, ENABLE);
}
TIM3_Int_Init(9,7199);//1ms
定时器时间计算:T = ( (1 + period) * (1 + prescaler) ) / 72000000 = ((1+ 9)*(1 + 7199))/72000000= 0.001s = 1ms
定时器中断服务函数示例:
void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}
因为配置中是向上计数,所以中断内是判断向上计数中断是否发生。