LM3S811定时器捕获

Other Parts Discussed in Thread: LM3S811

我们用贵公司的LM3S811开发了一款接收机,现在需要在上面加一个红外遥控器,看datasheet上说LM3S811的定时器捕获prescaler不能用,所以我判断定时器一次捕获的最大宽度为1.5ms左右(时钟配的是40M),但我需要检测的遥控器的引导码宽度就有12ms左右。请问LM3S811在检测边沿宽度大于1.5ms时有什么方法?

  • 根据你所测量的信号需要的时间精度,选择合适的时钟分频值。如果测量的最大宽度仍小于信号可能出现的最大宽度,还可以利用定时器的溢出中断做周期计数,然后计算累计时间值。

  • LM3S811的datasheet上说输入捕获定时器不提供时钟分频功能。如果在中断服务函数中等待检测溢出中断,当一个中断来时,中断服务函数就要耗费10ms左右的时间,我不想再中断服务函数里耗费这么长的时间

  • LM3S811的datasheet上说输入捕获定时器不提供时钟分频功能。如果在中断服务函数中等待检测溢出中断,当一个中断来时,中断服务函数就要耗费10ms左右的时间,我不想再中断服务函数里耗费这么长的时间

  • 不知道你的中断消耗10ms是怎么来的

  • Gao先生,你好

    我的定时器中断服务函数是这样的,在检验下一个信号边沿的过程中等待TIMER_TIMA_TIMEOUT

    void Timer2AIntHandler(void)  

    {

    u8 ccd;

    u8 g_ulTimer2ATimeoutCount;

    u8 id;

    unsigned long irtime, ulFirstEdgeTime, ulSecondEdgeTime, step;

    ulFirstEdgeTime = TimerValueGet(TIMER2_BASE,TIMER_A);

    g_ulTimer2ATimeoutCount = 0; //清零g_ulTimer2ATimeoutCount

    TimerIntClear(TIMER2_BASE,TIMER_CAPA_EVENT|TIMER_TIMA_TIMEOUT); //清除溢出以及输入捕捉中断标志位

    //等待下一个输入事件到达

    while(!(TimerIntStatus(TIMER2_BASE,false)&TIMER_CAPA_EVENT))

    {

    //如果Timer1A产生溢出,g_ulTimer1ATimeoutCount++并清除Timer1A溢出标志位

    if((TimerIntStatus(TIMER2_BASE,false)&TIMER_TIMA_TIMEOUT))

    {

    TimerIntClear(TIMER2_BASE,TIMER_TIMA_TIMEOUT);

    g_ulTimer2ATimeoutCount++;

    }

    }

    ulSecondEdgeTime = TimerValueGet(TIMER2_BASE,TIMER_A);

    TimerIntClear(TIMER2_BASE,TIMER_CAPA_EVENT);

    //返回两个输入事件的时间间隔(系统时钟数目)

    irtime = g_ulTimer2ATimeoutCount*65536 + ulSecondEdgeTime - ulFirstEdgeTime;

    }

  • Gao先生,你好

    这是定时器的配置

    oid Timer2_Configuration(void)

    {

    TimerDisable(TIMER2_BASE, TIMER_A);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

    GPIOPinTypeTimer(GPIO_PORTC_BASE, GPIO_PIN_7);

    TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR |  

                                  TIMER_CFG_A_CAP_TIME); //  配置Timer为16位事件定时器

        TimerControlEvent(TIMER2_BASE, TIMER_A, TIMER_EVENT_NEG_EDGE);     //  控制TimerA捕获CCP负边沿

    IntEnable(INT_TIMER2A);                                 //  使能TimerA中断

    TimerIntEnable(TIMER2_BASE, TIMER_CAPA_EVENT);          //  使能TimerA事件捕获中断  

    TimerEnable(TIMER2_BASE, TIMER_A);

    }

    谢谢指教!!!

  • 能否考虑将中断中的等待事件移到中断外,设定为中断触发方式,这样会节省你的资源消耗。这样你的中断消耗的时间可以做到US级。这样才能满足你的接收机的实时要求。