LM3S1512 定时器 中断 红外解码

2019-03-24 16:19发布

大虾们帮帮忙啦  我在用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();    ...... }
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
academic
2019-03-25 04:49
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章