嵌入式开发学习日志29——stm32之定时器中断
在了解完时钟系统之后,终于可以正式进入定时器中断的学习了,而stm32的定时器数量和功能也非常多,分基本,通用,高级三类定时器,每类定时器的功能层层递进,不过在此以通用定时器为主。
stm32的通用定时器首先包含一个16位自动重载计数器(简称CNT),这是之后经常会出现的非常重要的一个东西,,它可以进行向上或者向下的自动重载,而这个计数器可以由可编程预分频器驱动,一般设置的参数在1-65535之间,这在后面设置预分频系数时会用到。
通用定时器还有四个完全独立的定时器通道,可以用来进行输入捕获,输出比较,PWM生成以及单脉冲输出,当然,在进行代码编写时,如果用到了这些通道,记住尽量不要重复,否则会编译出错。
通用定时器的中断方式有四种,最常见的也是最常用的就是计数器更新,计数器会进行计数,此时会设定一个计数阈值,一旦向上计数或者向下计数达到或者超出阈值,那么就会引发计数器初始化,产生中断。剩下三种分别是触发事件,输入捕获,输出比较。
既然是定时器中断,那肯定也有时钟频率的来源,最直接的就是内部时钟,当然,外部时钟也可以接入使用。如果使用内部时钟作为时钟源,那么这个时钟是通过APB1倍频得来的,APB1讲过,一般会对系统时钟进行二分频处理,所以定时器获得的时钟频率最大是72MHz。
要注意的是,更高级的定时器时钟来源是APB2。
通用定时器包含三个非常重要的寄存器,除了上面提到的计数器寄存器,还有预分频器寄存器(简称PSC)以及自动重载寄存器(简称ARR)。
计数寄存器就是负责在你设定好的计数模式下向上或者向下计数,达到或者超过阈值时,就会产生更新事件(UEV),导致中断产生。
自动重载寄存器就是设定计数阈值的寄存器,它会时刻与CNT中的数值进行比较,当达到设定的ARR值时,同样会初始化,重新装载初值。
至于预分频器寄存器,它会对计数器时钟频率进行分频,分频系数就在1-65535之间,这常会用来计算周期。
至于通用定时器输入捕获以及输出比较的能力,这会在学PWM的过程放一起。
最后还是经典的定时器配置步骤:
(1)使能定时器时钟。
(2)初始化定时器参数,如自动重载值,计数方式,分频系数。
(3)设置定时器中断类型并且使能。
(4)设置定时器中断优先级,并使能中断通道。
(5)手动开启定时器。
(6)编写中断服务程序。