LPC1752 定时计数器#
详情请参阅 LPCxx用户手册 的第21章
注意
计数模式下不能捕获,输入捕获不能在计数模式
定时计数器操作流程#
在
系统控制寄存器(LPC_SC)
中的外设功率控制寄存(PCONP)
使能定时计数器。 详见 LPCxx用户手册 的第4.8.9小节配置
计数器控制寄存器
来设置定时计数器的工作模式及时钟源。 详见 LPCxx用户手册 的第21.6.3小节配置
预分频计数器寄存器
来设置定时计数器的工作时钟分频值,实际分频为该寄存器值+1。 内核时钟(CCLK)先经过系统控制寄存器(LPC_SC)
中的外设时钟选择寄存器(PCLKSEL)
分频后得到外设时钟(PCLK)。 再经过该寄存器分频的时钟还是定时计数器的实际工作时钟。如果 PCLK_TIMER0 = CCLK/4 , PR = 11 :
CCLK = 48MHzPCLK = 48MHz/4 = 12MHzCLK = 12MHz/12 = 1MHz定时计数器的实际工作时钟为1MHz
- 匹配输出:
配置
匹配寄存器(MR)
的值配置
匹配控制寄存器(MCR)
当匹配发生时是: 中断 , 复位 还是 停止配置
外部匹配寄存器(EMR)
当匹配发生时 MATx.x 对应的变化信号。 若要输出该信号到引脚的话,则需要将引脚内跟该信号连接
- 捕获输入:
待补全
设置
定时器控制寄存器
的 使能 位来启动或停止定时计数器
示例代码#
#define TIM_0_PRESCALE 12
#define TIM_0_MATCH_1 156
#define TIM_0_EXTEND_MATCH_OUTPUT 0
CCLK = 48MHz
PCLK = CCLK/4 = 48MHz/4 = 12MHz
CLK = PCLK/TIM_0_PRESCALE = 12MHz/12 = 1MHz
此时如果匹配值为: 156则每隔156us MAT0.1 电平发生1次翻转,
此时 MAT0.1 的周期为312us,其上升沿的频率为: 1000000us/312us = 3205.128205128205 Hz = 3.205 KHz
1void TIM_0_init(void)
2{
3 // 开启TIM0外设时钟
4 LPC_SC->PCONP |= (1 << 1);
5 // 定时器工作在定时模式,在PCLK的上升沿计数器值增加
6 LPC_TIM0->CTCR = 0;
7 // 设置定时器的分频值
8 LPC_TIM0->PR = TIM_0_PRESCALE - 1;
9 // 设置匹配寄存器1的值
10 LPC_TIM0->MR1 = TIM_0_MATCH_1 - 1;
11 // 当匹配1发生时计数器复位
12 LPC_TIM0->MCR = 1 << (1 * 3 + 1);
13 // 匹配1发生时MAT0.1引脚发生翻转,MAT0.1引脚初始值为0
14 LPC_TIM0->EMR = 3 << (1 * 2 + 4);
15
16 #if TIM_0_EXTEND_MATCH_OUTPUT
17 // 如果要输出MAT0.1信号,则将P1.29跟MAT0.1连接
18 PIN_Configure(PinMAT0_1.Portnum,PinMAT0_1.Pinnum,PIN_FUNC_3,PIN_PINMODE_TRISTATE,PIN_PINMODE_NORMAL);
19 #endif
20}
1static void TIM_0_reset(void)
2{
3 uint32_t reg = LPC_TIM0->TCR;
4 // 设置计数器的控制寄存器的复位位,计数器在下一个上升沿开始复位
5 LPC_TIM0->TCR = 1 << 1;
6 // 复位时TC,PC值都会归零
7 LPC_TIM0->TC = 1;
8 // 等待复位完成
9 while (LPC_TIM0 ->TC);
10 // 恢复计数器原来的使能状态
11 LPC_TIM0->TCR = reg;
12}
1void TIM_0_start(void)
2{
3 TIM_0_reset();
4 // 使能TM0计数开始计数
5 LPC_TIM0->TCR = 1;
6}
7
8void TIM_0_stop(void)
9{
10 LPC_TIM0->TCR &= ~1U;
11}