lpc1114通用定時器_計數(shù)功能
下面,以“16位定時器0”為例,做一個實驗,在“16位定時器0”的捕獲引腳上,獲取脈沖的個數(shù)?!?6位定時器0”的捕獲引腳即P0.2腳,在Ration開發(fā)板上,可以將P0.2引腳與P1.9腳相連,因為P1.9腳是按鍵KEY1的輸入引腳,所以,只要按一下按鍵,計數(shù)就會增加1。
新建一個工程,結(jié)構(gòu)如下圖所示:
在timer.h文件中,加入T16B0_cnt_init()函數(shù)聲明,如下圖所示:
#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()函數(shù)的定義,如下圖所示:
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; //復(fù)位定時器(bit1:寫1復(fù)位)
LPC_TMR16B0->CTCR = 0x02; // 計數(shù)器模式 引腳CT16B0_CAP0下降沿計數(shù)
LPC_TMR16B0->TCR = 0x01; //啟動定時器:TCR[0]=1;
}
第3~6行,目的是為了把P0.2腳設(shè)置成CT16B0CAP0功能,即16位定時器0的捕獲引腳,改變引腳功能,就需要打開IOCON模塊的時鐘,所以給SYSAHBCLKCTRL寄存器的bit16寫1,使能IOCON時鐘。引腳功能設(shè)置好以后,IOCON模塊就沒有用了,所以把它的時鐘再關(guān)閉,還能降低單片機的功耗。
第9行,給CTCR寄存器寫0x02,把定時器設(shè)置為計數(shù)模式,并設(shè)置CAP0接收下降沿信號。
CTCR:計數(shù)控制寄存器
位符號值描述復(fù)位值1:0CTM定時/計數(shù)模式。000x0定時模式:每個PCLK的上升沿0x1計數(shù)模式:TC在CAP引腳上的上升沿遞增0x2計數(shù)模式:TC在CAP引腳上的下降沿遞增0x3計數(shù)模式:TC在CAP引腳上的雙邊沿遞增3:2CIS
計數(shù)輸入引腳選擇000x0CT32Bn_CAP00x1保留0x2保留0x3保留31:4
保留位,不能給這些位寫1–
CTCR寄存器用來決定定時器是做定時還是計數(shù),并且可以設(shè)置上升沿、下降沿和雙邊沿計數(shù)。
在main.c文件中,輸入以下代碼:
#include “l(fā)pc11xx.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函數(shù)實現(xiàn)的功能是,如果發(fā)現(xiàn)計數(shù)器遞增,就把現(xiàn)在記下的數(shù)發(fā)到串口,打開串口調(diào)試助手,選好串口號,波特率設(shè)置為9600,按動開發(fā)板上的按鍵KEY1,即可看到效果。