和其他 MCU 处理器一样,在 nRF52832 中定时器的功能是十分强大的。其内部包含了 5 个定 时器 TIMER 模块:TIMER0、TIMER1、TIMER2、TIMER3、TIMER4,如下表:
定时器有着不同的位宽选择,位宽的大小直接决定了计数器的最大溢出时间。处理器可以通过 BITMODE 选择不同的位宽,该寄存器位于计数器内部。如下图所示。
BITMODE 寄存器:配置计数器使用的位宽。
下图为定时器内部结构图,下面结合结构图来详细分析下其基本工作原理以及相关概念:
-
时钟源
首先定时器 TIMER 工作在高频时钟源(HFLCK)下,同时包含了一个 4bit(1 / 2X)的分频 (PRESCALER),可以对高频时钟源(HFLCK)进行分频。框图入口处给了两个时钟源表示两种时 钟输入模式:1MHz 模式(PCLK1M)和 16MHz 模式(PCLK16M)。时钟源通过分频器分频后输出一 个频率 fTIMER ,系统将会通过这个参数来自动选择时钟源,而不需要工程师设置寄存器。- 当 fTIMER 1MHZ 时,系统自动选择 PCLK16M 作为时钟源。
- 当 fTIMER 1MHZ 时,系统会自动用 PCLK1M 替代 PCLK16M 作为时钟源以减少功耗。
-
分频器
分频器对输入的时钟源进行分频。输出的频率计算公式如下:
公式中的 HFLCK 不管是使用哪种时钟源输入,计算分频值的时候都使用 16MHz。PRESCALER 为一个 4bit 的分频器,分频值为 0~15。当 PRESCALER 的值大于 9 后,其计算值仍然为 9,即 fTIMER 的最小值为 16/29 。通过设置寄存器 PRESCALER 可以控制定时器的频率。
PRESCALER 寄存器:预分频寄存器 -
工作模式
定时器 TIMER 可以工作在两种模式下:定时器模式(timer)和计数器模式(counter)。工作模式通过寄存器 MODE 进行选择。- 当 MODE 设置为 0 的时候为定时器模式,
- 设置为 1 的时 候为计数器模式,
- 设置为 2 时,选择低功耗的计算器模式。
MODE 寄存器:定时器模式设置寄存器
-
比较/捕获功能
定时模式下设定比较(Compare)/捕获(Capture)寄存器 CC[n]的值,可以设置定时的时间(Timer value)
当定时时间的值跟 CC[n]寄存器的值相等时,将触发一个 COMPARE [n] event。COMPARE [n] event 可以触发中断。如果是周期性的触发,则需要在触发后清除计数值,否则会一直计数,直到溢出。 计数模式下,每次触发 COUNT 任务时,TIMER 的内部计数器 Counter 寄存器都会递增 1,同时,计数器模式下是不使用定时器的频率和预分频器,COUNT 任务在定时器模式下无效。通过设定一个 CAPTURE Task,捕获的计数器的值存储到 CC[n]寄存器内,然后对 CC[n]寄存器进行读取计数的值。 -
任务延迟和优先级
- 任务延迟:TIMER 启动后,CLEAR 任务,COUNT 任务和 STOP 任务将保证在 PCLK16M 的一 个时钟周期内生效。
- 任务优先级:如果同时触发 START 任务和 STOP 任务,即在 PCLK16M 的同一时段内,则优先执行STOP 任务。 下表是定时器的寄存器列表,详细说明如下