我使用的是PC7作为CCP4的输入捕获功能,但是无论我PC7怎么变化,始终进不了中断函数,附上timer的设置程序,请那位大侠指点下原因
我注册了中断并使能了中断函数。程序死在 while (!CPP4_Flag) // 等待捕获输入脉冲
这里,经检查未进中断
/*
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
"); 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
"); }
TimerDisable(TIMER2_BASE, TIMER_A); // 禁止Timer计数 sprintf(ss, "%d ms
", (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; // 置位捕获标志 }}
此帖出自小平头技术问答
我已经在pulseMeasure()函数里写了这一句。
TimerEnable(TIMER2_BASE, TIMER_A); // 使能Timer计数
所以不应该是这里吧。谢谢你
[ 本帖最后由 shower.xu 于 2012-3-8 11:21 编辑 ]一周热门 更多>