我们用贵公司的LM3S811开发了一款接收机,现在需要在上面加一个红外遥控器,看datasheet上说LM3S811的定时器捕获prescaler不能用,所以我判断定时器一次捕获的最大宽度为1.5ms左右(时钟配的是40M),但我需要检测的遥控器的引导码宽度就有12ms左右。请问LM3S811在检测边沿宽度大于1.5ms时有什么方法?
根据你所测量的信号需要的时间精度,选择合适的时钟分频值。如果测量的最大宽度仍小于信号可能出现的最大宽度,还可以利用定时器的溢出中断做周期计数,然后计算累计时间值。
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级。这样才能满足你的接收机的实时要求。