定时器Timer基础

本文最后更新于:2 个月前

概念

定时器(Timer),又叫计时器,顾名思义,它的主要功能就是计时。因为CPU计时会占用大量资源,而定时器独立于CPU,专门用来计时。单核CPU好比人的大脑,一心不可二用,它只能知道自己当前要干什么。人可以用闹钟来提醒自己某个时间需要做某件事,而CPU就需要定时器来完成这样的工作。

当定时器被开启后,里面的计数器就以计数器时钟的频率开始运行,内部的计数值不断增加。例如一个时钟为1MHz的定时器,被开启后每隔1us计数值就会加1。但计数值不可能无限增加,最大值比如65535。将这个十进制数转为二进制数后应该是一个16位的二进制数1111 1111 1111 1111。所以我们需要有一个16位大小的存储空间来存储它。那这就是一个16位定时器。

功能

定时器可以让SOC在执行主程序的同时,可以(通过定时器)具有计时功能,到了一定时间(计时结束)后,定时器会产生中断提醒CPU,CPU会去处理中断并执行定时器中断的ISR,从而去执行预先设定好的事件。打个比方,定时器就像一个秘书,CPU就是老板。老板每天都有很多事要做,具体时间安排不想操心,就安排给秘书。秘书每天就是盯着表,到点就提醒老板要做某事。

原理

外设的工作频率是与它所挂载在的外设总线的时钟频率相同的。但工作频率不是时钟频率,工作频率到时钟频率需要进行一次分频。这个可调节的分频值使得定时器的计时更加灵活。这个分频值就是需要设置的第一个参数预分频系数

$$
计数器时钟频率 = 工作频率/(预分频系数+1)
$$

$$
定时频率 = 计时器时钟频率/(自动重载值+1)
$$

假设定时器时钟频率为1MHz,那定时1ms该如何做?计数1000次即可。最大的计数值就是自动重载值,是我们需要设置的第二个参数。定时器被打开后,计数值就增加,一旦达到自动重载值就会出发定时器溢出中断,就实现了定时1ms

计数模式

  • 中心计数:计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,0然后向下计数到1并且产生一个计数器溢出事件,然后再从0开始重新计数。

  • 向上计数:计数器从0计数到自动加载值(TIMx_ARR) ,然后重新从0开始计数并且产生一个计数器溢出事件。

  • 向下计数:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。