定时器 Timer 基础

概念

定时器(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,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。