stm32的定时器功能十分强大,包括TIME1TIM8高级定时器,TIME2~TIME5通定时器,TIME6和TIME7普通定时器,2个看门狗定时器和一个滴答定时器。作为32中菜鸟的的菜鸟,今天就只能聊聊我对通用定时器知道的二三事。
其实无论是51还是32的定时器,其本质都是对内部时钟频率计数(定时)或者是对外部脉冲计数,区别在于内部或者外部的时钟来源不同。
定时器的工作原理就是将要定时的值放在16位的寄存器中,每来一个脉冲(由内部或者外部时钟源提供),寄存器中的值就会减一,直到减为0为止,这样就产生了一个中断。首先我们还是先看一个公式吧 (以TIME3为例)
Tout=arr*(psc/Tclk)
Tout:TIM3溢出时间(单位为ms)
arr:放在自动重装寄存器中的值(即放在16位寄存器中的值)
psc:预分频系数的值(TIME3挂在APB1时钟总线上(36MHz),再经过一个倍频器,频率乘以2为72MHz(详见时钟树),因为72MHz的时钟频率太大,不方便长时间定时,所以就要降低时钟频率,通过预分频器PSC(为16为寄存器,故分频系数为1/65536~1),经psc预分频器分频之后的时钟就是TIM3的时钟了。
程序示例
void Timer3_Init(u16 arr,u16 psc) //TIME3的时钟初始化函数
{
RCC->APB1ENR|=1<<1; //TIME3时钟使能
TIM3->ARR=arr; //设定定时器自动重装初值
TIM3->PSC=psc; //设定psc分频器分频因子
TIM3->DIER|=1<<0; //使能更新中断
TIM3->DIER|=1<<6; //使能触发中断
TIM3->CR1|=0x01; //开启定时器
MY_NVIC_Init(1,3,TIM3_IRQn,2); //设置中断分组
}