大虾们帮帮忙啦 我在用LM3S1512做一个定时器红外捕捉解码的project 使用的是Rowley CrossStudio开发环境
我按照数据手册的介绍写了如下面的相关代码 问题是当我逐步执行代码的时候 定时器初始化什么的都没问题 而且程序不会运行到中断服务函数(PulseCaptureIntHandler)
但是当我在中断服务函数里设置了断点然后全速执行的时候程序就会进入中断服务函数 按理说我没有按下红外发射器的按键 在PH1/CCP7端口没有上升沿脉冲信号 所以他不应该进入中断服务函数 这里不知道为什么 是不是我的中断服务函数定义的不正确? 我在startup代码里将中断向量表里的默认的Timer3B_ISR 赋值给了我的中断服务函数PulseCaptureIntHandler (在项目的Preprocessor Definitions 里 PulseCaptureIntHandler = Timer3B_ISR)
另外我观察到一个问题是当在终端服务函数里设置了断点程序运行到中断服务函数里 我单步执行发现当执行了 TimerIntClear(TIMER3_BASE,TIMER_CAPB_EVENT);后, 中断清除寄存器(GPTM_3_MICR )里的捕获事件中断清除位(CBECINT(CaptureB Event Interrupt Clear) )没有被清掉 他一直是0 这是什么原因呢?
谢谢各位前辈赐教!
代码:
SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ );
//Using Pin PH1/CCP7
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER3);
GPIOPinTypeTimer( GPIO_PORTH_BASE, GPIO_PIN_1);
//Timer Initial Function
void USER_Timer_Capture_Init(void)
{
//configure TimerB as a 16-bit edge time capture
TimerConfigure(TIMER3_BASE, TIMER_CFG_16_BIT_PAIR|TIMER_CFG_B_CAP_TIME);
//configure the counter (TimerB) to count the rising edge
TimerControlEvent(TIMER3_BASE, TIMER_B,TIMER_EVENT_POS_EDGE);
//load the start value of the timer
TimerLoadSet(TIMER3_BASE, TIMER_B, 0xFFFF);
//enable the timer interrupt
TimerIntEnable(TIMER3_BASE, TIMER_CAPB_EVENT);
//TimerIntRegister(TIMER3_BASE, TIMER_B, Timer3B_ISR);
////enable the TimerB
TimerEnable(TIMER3_BASE, TIMER_B);
}
//Interrupt Handler Function
void PulseCaptureIntHandler(void)
{
// Clear all Timer0_B interrupt flag
TimerIntClear(TIMER3_BASE,TIMER_CAPB_EVENT);
AT_UINT8_T Data=0, IR_PULSE_TRAIN_DECODED;
AT_UINT8_T Count = 0;
AT_UINT16_T Current_TnR_Value, Period;
Current_TnR_Value = TimerValueGet(TIMER3_BASE, TIMER_B);
Period = Pre_TnR_Value - Current_TnR_Value;
Pre_TnR_Value = Current_TnR_Value;
if((Period>(2480))&&(Period<(2520))) //start bit (20*1000)/8=2500us, offset 20us
{
Count = 0;
}
else if ((Period>(980))&&(Period<(1020))) //bit "0" (8*1000)/8=1000, offset 20 us
{
Data &= ~(1<<(Count++));
}
else if ((Period>(1730))&&(Period<(1770))) //bit "1" (14*1000)/8=1750, offset 20 us
{
Data |= (1<<(Count++));
}
if (Count == 4)
{
IR_PULSE_TRAIN_DECODED = Data;
}
}
int main(void)
{
......
IntEnable(INT_TIMER3B);
IntMasterEnable();
......
}
此帖出自
小平头技术问答
一周热门 更多>