lpc1114通用定时器_计数功能

  • 学习4844次

下面,以“16位定时器0”为例,做一个实验,在“16位定时器0”的捕获引脚上,获取脉冲的个数。“16位定时器0”的捕获引脚即P0.2脚,在Ration开发板上,可以将P0.2引脚与P1.9脚相连,因为P1.9脚是按键KEY1的输入引脚,所以,只要按一下按键,计数就会增加1。

新建一个工程,结构如下图所示:

计数程序

在timer.h文件中,加入T16B0_cnt_init()函数声明,如下图所示:

  1. #ifndef __NXPLPC11xx_TIME_H__
  2. #define __NXPLPC11xx_TIME_H__
  1. extern void T16B0_init(void);
  2. extern void T16B0_delay_ms(uint16_t ms);
  3. extern void T16B0_delay_us(uint16_t us);
  4. extern void T16B0_cnt_init(void);
  1. #endif

timer.c文件中,加入T16B0_cnt_init()函数的定义,如下图所示:

  1. void T16B0_cnt_init(void)
  2. {
  3. ???LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);? // 使能IOCON时钟
  4. ???LPC_IOCON->PIO0_2 &= ~0x07;
  5. ???LPC_IOCON->PIO0_2 |= 0x02;? /* CT16B0 CAP0 */
  6. ???LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16);? // 禁能IOCON时钟
  7. ???LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);??? //使能TIM16B0时钟
  8. ???LPC_TMR16B0->TCR = 0x02;????????? //复位定时器(bit1:写1复位)
  9. ???LPC_TMR16B0->CTCR = 0x02; // 计数器模式 引脚CT16B0_CAP0下降沿计数
  10. ???LPC_TMR16B0->TCR = 0x01;????????? //启动定时器:TCR[0]=1;
  11. }

第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文件中,输入以下代码:

  1. #include “lpc11xx.h”
  2. #include “timer.h”
  3. #include “uart.h”
  1. int main()
  2. {
  3. ???uint16_t temp1,temp2;
  1. ???UART_init(9600);
  2. ???T16B0_cnt_init();
  3. ???temp1 = LPC_TMR16B0->TC;
  1. ???while(1)
  2. ???{
  3. ??????temp2 = LPC_TMR16B0->TC;
  4. ??????if(temp2!=temp1)
  5. ??????{
  6. ?????????temp1 = LPC_TMR16B0->TC;
  7. ?????????UART_send_byte(temp1);
  8. ??????}
  9. ???}
  10. }

main函数实现的功能是,如果发现计数器递增,就把现在记下的数发到串口,打开串口调试助手,选好串口号,波特率设置为9600,按动开发板上的按键KEY1,即可看到效果。

发表评论