lpc1114通用定时器_计数功能
下面,以“16位定时器0”为例,做一个实验,在“16位定时器0”的捕获引脚上,获取脉冲的个数。“16位定时器0”的捕获引脚即P0.2脚,在Ration开发板上,可以将P0.2引脚与P1.9脚相连,因为P1.9脚是按键KEY1的输入引脚,所以,只要按一下按键,计数就会增加1。
新建一个工程,结构如下图所示:
在timer.h文件中,加入T16B0_cnt_init()函数声明,如下图所示:
- #ifndef __NXPLPC11xx_TIME_H__
- #define __NXPLPC11xx_TIME_H__
- extern void T16B0_init(void);
- extern void T16B0_delay_ms(uint16_t ms);
- extern void T16B0_delay_us(uint16_t us);
- extern void T16B0_cnt_init(void);
- #endif
timer.c文件中,加入T16B0_cnt_init()函数的定义,如下图所示:
- void T16B0_cnt_init(void)
- {
- ???LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);? // 使能IOCON时钟
- ???LPC_IOCON->PIO0_2 &= ~0x07;
- ???LPC_IOCON->PIO0_2 |= 0x02;? /* CT16B0 CAP0 */
- ???LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16);? // 禁能IOCON时钟
- ???LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);??? //使能TIM16B0时钟
- ???LPC_TMR16B0->TCR = 0x02;????????? //复位定时器(bit1:写1复位)
- ???LPC_TMR16B0->CTCR = 0x02; // 计数器模式 引脚CT16B0_CAP0下降沿计数
- ???LPC_TMR16B0->TCR = 0x01;????????? //启动定时器:TCR[0]=1;
- }
第3~6行,目的是为了把P0.2脚设置成CT16B0CAP0功能,即16位定时器0的捕获引脚,改变引脚功能,就需要打开IOCON模块的时钟,所以给SYSAHBCLKCTRL寄存器的bit16写1,使能IOCON时钟。引脚功能设置好以后,IOCON模块就没有用了,所以把它的时钟再关闭,还能降低单片机的功耗。
第9行,给CTCR寄存器写0x02,把定时器设置为计数模式,并设置CAP0接收下降沿信号。
CTCR:计数控制寄存器
位 | 符号 | 值 | 描述 | 复位值 |
1:0 | CTM | 定时/计数模式。 | 00 | |
0x0 | 定时模式:每个PCLK的上升沿 | |||
0x1 | 计数模式:TC在CAP引脚上的上升沿递增 | |||
0x2 | 计数模式:TC在CAP引脚上的下降沿递增 | |||
0x3 | 计数模式:TC在CAP引脚上的双边沿递增 | |||
3:2 | CIS | 计数输入引脚选择 | 00 | |
0x0 | CT32Bn_CAP0 | |||
0x1 | 保留 | |||
0x2 | 保留 | |||
0x3 | 保留 | |||
31:4 | 保留位,不能给这些位写1 | – |
CTCR寄存器用来决定定时器是做定时还是计数,并且可以设置上升沿、下降沿和双边沿计数。
在main.c文件中,输入以下代码:
- #include “lpc11xx.h”
- #include “timer.h”
- #include “uart.h”
- int main()
- {
- ???uint16_t temp1,temp2;
- ???UART_init(9600);
- ???T16B0_cnt_init();
- ???temp1 = LPC_TMR16B0->TC;
- ???while(1)
- ???{
- ??????temp2 = LPC_TMR16B0->TC;
- ??????if(temp2!=temp1)
- ??????{
- ?????????temp1 = LPC_TMR16B0->TC;
- ?????????UART_send_byte(temp1);
- ??????}
- ???}
- }
main函数实现的功能是,如果发现计数器递增,就把现在记下的数发到串口,打开串口调试助手,选好串口号,波特率设置为9600,按动开发板上的按键KEY1,即可看到效果。