/*
IR_Din -- PC7
*/
#include "IR_CPP4.h"
#include "uartGetPut.h"
#include <stdio.h>
volatile tBoolean CPP4_Flag;
volatile tBoolean T2A_TimerOut;
void Timer2A_ISR(void);
// 定时器16位输入边沿定时捕获功能初始化
void timerInitCapTime(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2); // 使能Timer模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能CCP4所在的GPIO端口PC7/CCP4
GPIOPinTypeTimer(GPIO_PORTC_BASE,GPIO_PIN_7); // 配置CCP4管脚为脉冲输入
GPIOPadConfigSet(GPIO_PORTC_BASE,GPIO_PIN_7, GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR | // 配置Timer为16位事件定时器
TIMER_CFG_A_CAP_TIME);
TimerControlEvent(TIMER2_BASE, // 控制TimerA捕获负边沿
TIMER_A,
TIMER_EVENT_NEG_EDGE);
TimerControlStall(TIMER2_BASE, TIMER_A, true); // 允许在调试时暂停定时器计数
TimerIntRegister(TIMER2_BASE, TIMER_A,Timer2A_ISR); // 注册中断服务程序
TimerIntEnable(TIMER2_BASE, TIMER_CAPA_EVENT|
TIMER_TIMA_TIMEOUT); // 使能TimerA事件捕获中断和超时中断
IntEnable(INT_TIMER2A); // 使能TimerA中断
IntMasterEnable(); // 使能处理器中断
}
// 测量输入脉冲频率并显示
extern void lcd_write_stringxy(unsigned char x,unsigned char y,unsigned char *p);
void pulseMeasure(unsigned char* s)
{
unsigned short i;
unsigned short usVal[2];
char ss[40];
CPP4_Flag = false;
T2A_TimerOut = false;
TimerLoadSet(TIMER2_BASE, TIMER_A, 0xFFFF); // 设置计数器初值
TimerEnable(TIMER2_BASE, TIMER_A); // 使能Timer计数
uartPuts("into loop\r\n");
for (i = 0; i < 2; i++)
{
while (!CPP4_Flag) // 等待捕获输入脉冲
if(T2A_TimerOut) break;
CPP4_Flag = false; // 清除捕获标志
usVal = TimerValueGet(TIMER2_BASE, TIMER_A); // 读取捕获值
uartPuts("get value\r\n");
}
TimerDisable(TIMER2_BASE, TIMER_A); // 禁止Timer计数
sprintf(ss, "%d ms\r\n", (usVal[0] - usVal[1]) / 6); // 输出测定的脉冲频率
uartPuts(ss);
// if(!T2A_TimerOut) lcd_write_stringxy(0,2,s);
}
// Timer2的中断服务函数
void Timer2A_ISR(void)
{
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER2_BASE, true); // 读取当前中断状态
TimerIntClear(TIMER2_BASE, ulStatus); // 清除中断状态,重要!
if (ulStatus & TIMER_CAPA_EVENT) // 若是TimerA事件捕获中断
{
CPP4_Flag = true; // 置位捕获标志
}
if (ulStatus & TIMER_TIMA_TIMEOUT) // 若是TimerA计时溢出中断
{
T2A_TimerOut = true; // 置位捕获标志
}
}