LPC178x/177x 系列 Cortex-M3 拥有 4 个 32 位可编程定时器/计数器,均具有捕获、比较匹配功能。定时器用来对外设时钟(PCLK)进行计数,而计数器对外部脉冲信号进行计数,可以选择在规定的时间处产生中断或执行其它操作,这都由 4 个匹配寄存器的值决定。它也包含4 个捕获输入,用来在输入信号变化时捕捉定时器的瞬时值,也可以选择产生中断。
注: 4 个定时器 / 计数器,除了外设基址之外其他完全相同。 4 个定时器最少有 2 个捕获输入和 2 个匹配输出,并且有多个引脚可以选择。定时器 2 引出了全部 4 个匹配输出。
32 位的定时器/计数器,带有一个可编程的 32 位预分频器;
计数器或定时器操作;
每个定时器包含 2 个 32 位的捕获通道,当输入信号变化时捕捉定时器的瞬时值。也可
以选择产生中断;
4 个 32 位匹配寄存器,允许执行以下操作:
- 匹配时连续工作,在匹配时可选择产生中断;
- 在匹配时停止定时器运行,可选择产生中断;
- 在匹配时复位定时器,可选择产生中断;
有 4 个与匹配寄存器相对应的外部输出,这些输出具有以下功能:
- 匹配时设为低电平;
- 匹配时设为高电平;
- 匹配时翻转电平;
- 匹配时不执行任何操作。
LPC178x/177x 系列Cortex-M3 的定时器/计数器功能部件主要由三部分构成:
1. 计数部分
定时器的时钟源可以是 PCLK,对 PCLK 进行分频后,输入计数器,对其进行计数。另外LPC178x/177x 系列 Cortex-M3 可以对外部的脉冲进行计数,外部脉冲从 CAP 引脚输入。
2. 匹配功能部分
匹配寄存器 0~3 中保存匹配值,当某一个匹配值与当前的计数值匹配时,根据匹配控制寄存器(MCR)的设置,控制定时器的工作,也可以产生中断信号。当发生匹配时,寄存器 EMR还会控制对应的匹配引脚 MATn 输出特定的信号。
3. 捕获功能部分
当捕获引脚 CAPn 上出现有效信号(即捕获信号)时,会将计数器的当前值保存到捕获寄存器 CRn 中,并可产生中断
1. 中断寄存器 T[0/1/2/3]IR
中断寄存器包含 4 个位用于匹配中断,4 个位用于捕获中断。如果有中断产生,IR 中的对应位会置位,否则为 0。向对应的 IR 位写入 1 会复位中断。写入 0 无效。清除定时器匹配中断也会清除对应的 DMA 请求。
LPC_TIM0->IR = 0xff; /* 清除定时器 0 的全部中断标志 */
2. 定时器控制寄存器 T[0/1/2/3]TCR
定时器控制寄存器(TCR)用来控制定时器/计数器的操作
LPC_TIM0->TCR = 0x01; /* 启动定时器 0
3. 计数控制寄存器 T[0/1/2/3]CTCR
计数控制寄存器(CTCR)用来在定时器模式和计数器模式之间进行选择,在计数器模式中选择计数的引脚和边沿
当选择计数器模式作为工作模式时,在每个 PCLK 时钟的上升沿对 CAP 输入(由 CTCR的位 3:2 来选择)进行采样。在对这个 CAP 输入的连续两次采样值进行比较之后,可以识别出下面其中一种事件:上升沿、下降沿、上升/下降沿或所选 CAP 输入的电平不变。如果识别出的事件与 CTCR 寄存器[1:0]选择的一个事件相对应,定时器计数器寄存器的值将增加 1。
当计数器计数外部脉冲时,处理的效率会收到一些限制。由于识别 CAP 所选输入的一个边沿需要使用 PCLK 时钟 2 个连续的上升沿,因此 CAP 输入的频率不能大于 PCLK 频率的二分之一。所以,在这种情况下同一个 CAP 引脚的高/低电平持续时间不能小于 1/(2PCLK)。
LPC_TIM0->CTCR = ( 0x02 << 0 ) | /* 计数器,在 CAP 的下降沿递增 TC /
( 0x01 << 2 ); / 选择 CAP0.1
4. 定时器计数器 T[0/1/2/3]TC
TC(Timer Counter)既是定时器的定时计数器又是外部计数器的计数器,这里简称定时器计数器
5. 预分频寄存器 T[0/1/2/3]PR
6. 预分频计数器 T[0/1/2/3]PC
(LPC默认主频为100MHZ)
(使用二分法分频将100MHZ降至25MHZ)
(一般在config文件中进行更改)
(定时器0和定时器1默认开启,无需启动电平)
程序中代码应专门写在定时器的初始化中:
LPC_SC->PCONP |= 1<<23; // 开启定时器3的管脚设置
匹配控制寄存器。 MCR 用来控制在匹配出现时是否产生中断和是否复位 TC
程序中代码应专门写在定时器的初始化中:
LPC_TIM3->MCR = 0x00; //关闭所有mcr功能,方便配置定时器
/…配置…/
#define Enable_T3MR1 LPC_TIM3->MCR |= 0x08 // 之后会重新开启相应定时器来开启中断
定时器控制寄存器。 TCR 用来控制定时器计数器功能。定时器计数器可以通过 TCR 来禁能或复位
LPC_TIM3->TCR = 0x02; //处于计数器复位模式,复位T3TC
/配置*/
LPC_TIM3->TCR = 0x01; //重新开启计时器
TC:保存定时器计数器的计数值。 32 位的 TC 每隔( PR+1)个 PCLK 周期递增一次。 TC 通过 TCR 来控制
PR:预分频寄存器。当预分频计数器的值与这个寄存器的值相等时,下个时钟 TC 加 1, PC清零
LPC_TIM3->TC = 0; //TC配置为0,默认不分频.
LPC_TIM3->PR = TPR_1ms; // 根据时钟频率配置默认单位,也就是数多少位为一个单位
附上24MHZ主频的默认时间单位
TPR_1 = 1,
TPR_1us = 23,
TPR_10us = 239,
TPR_100us = 2399,
TPR_1ms = 23999,
TPR_5ms = 119999,
TPR_10ms = 239999
下图中由于其代码MCR配置的会复位,因此TC数到6即复位,而在实际中TC往往不复位一直数下去,以此来充当一个开机后的计时器的效果.
MR0:匹配寄存器 0。 MR0 可通过 MCR 设定为在匹配时复位 TC,停止 TC 和 PC 和/或产生中断
LPC_TIM3->MR2 = 500; //设定初始定时值,数500ms后进入中断函数并停止TC计时
Enable_T3MR2; //LPC_TIM3->MCR |= 0x08 使得中断开启,使其匹配中断但不复位T2TC
IR:中断寄存器。可向 IR 写入相应的值来清除中断。也可读 IR 来确定 8 个中断源中哪个中断源被挂起
LPC_TIM3->IR = 0xFF; //为IR全部赋予高电平,清除标志位
IR:中断寄存器。可向 IR 写入相应的值来清除中断。也可读 IR 来确定 8 个中断源中哪个中断源被挂起
LPC_TIM3->MR2 = LPC_TIM3->TC+100; //为MR2赋值,下次TC再中断100ms即中断
可随意更改所需时间来达到计时目的
LPC_TIM3->IR = 0x04;
不清除会导致永远停在这个中断中