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:0CTM定时/计数模式。000x0定时模式:每个PCLK的上升沿0x1计数模式:TC在CAP引脚上的上升沿递增0x2计数模式:TC在CAP引脚上的下降沿递增0x3计数模式:TC在CAP引脚上的双边沿递增3:2CIS
计数输入引脚选择000x0CT32Bn_CAP00x1保留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,即可看到效果。