STM32F1的通用定时器包括:TIM2、TIM3、TIM4和TIM5。
掌握主要的通用定时器的寄存器:控制寄存器1(TIMx_CR1)、DMA/中断使能寄存器(TIMx_DIER)、预分频寄存器(TIMx_PSC)(它的作用是对时钟进行分频,然后提供给计数器,作为计数器的时钟)、TIMx_CNT寄存器(该寄存器是定时器的计数器,该寄存器存储了当前定时器的计数值)、自动重装载寄存器(TIMx_ARR)、状态寄存器(TIMx_SR)。
计数器的时钟频率CK_CNT等于fCK_PSC/(PSC[15:0]+1)。
CK_INT(内部时钟)是从APB1倍频来的,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的两倍,时钟分频由CFGR寄存器控制。另外高级定时器的时钟来自APB2。
初始化定时器的步骤:
(1)定时器时钟使能.例如拿TIM4来讲:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
(2)初始化定时器参数,设置自动重装载值,分频的系数,计数方式等;
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值(或者可以简单理解为计数次数)
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频的值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //分频因子为1,表示72/1
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//如果arr是5000-1,psc是7199的话那么得到的fDTS为10kHz,tDTS为0.1ms,那么5000个0.1ms等于500ms,每500ms溢出。
(3)设置TIMx_DIER允许更新中断
调用库函数里的TIM_ITConfig函数来实现
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断
(4)定时器中断优先级设置
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
(5)使能定时器
TIM_Cmd(TIM4, ENABLE); //使能TIM4
最后就可以编写中断服务函数啦
void TIM4_IRQHandler(void) //TIM4中断
{
static unsigned char tt=0;
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != 0) //检查TIM4更新中断发生与否
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx更新中断标志
tt++;
if(tt==1)
{
tt=0;
}
}
}