Part Number:TMS320C6748
请问如何将定时器在主程序中关掉呢?
程序为一段循环执行流程:
开定时器定时5s,如果5s内收到了uart中断,点亮LED灯同时将标志位Respond置为1,退出定时器中断。
如果5s内未收到uart中断,退出等待uart中断函数,关闭定时器。
判断Respond是否置位1(也就是判断这5s内是否收到uart中断),若不为1,则LED灯灭。
重新将respond置位0,再次进入循环。
目前观察到的现象是:流程开始之后,即便uart中断每次都是在5s内到来,每5s后LED灯都会熄灭一次。也就是说在主流程中定时器没能关掉,导致Timer12Isr函数依然以每5s运行一次。
程序如下:
Timer12Flag=0;
Respond=0;
while(1)
{
TimerPeriodSet(SOC_TMR_1_REGS, TMR_TIMER12, TMR_PERIOD12); // 设置周期5s
TimerIntEnable(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE); //开定时器5s
while(!Timer12Flag)
{
if(UartFlag) // 检查是否有Uart中断
{
val0 = *(volatile unsigned int *)(SOC_UART_0_REGS + 0x14);
GPIOPinWrite(SOC_GPIO_0_REGS, 16, GPIO_PIN_LOW); //拉低,亮灯
Respond=1;
TimerIntDisable(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE); //关闭定时器
IntEventClear(SYS_INT_T64P1_TINT12);
TimerIntStatusClear(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
Timer12Flag=1;
}
UartFlag=0;
}
TimerIntDisable(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE); //关闭定时器
IntEventClear(SYS_INT_T64P1_TINT12);
TimerIntStatusClear(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
Timer12Flag=0;
if(!Respond) //5s内一直未收到回复,回复上位机0x40之后的操作
{
Respond=0;
GPIOPinWrite(SOC_GPIO_0_REGS, 16, GPIO_PIN_HIGH); //拉高,灭灯
}
Respond=0;
}
void Timer12Isr(void) // 定时器12中断服务函数
{
TimerIntDisable(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE); // 禁用定时器 / 计数器中断
// 清除中断标志
IntEventClear(SYS_INT_T64P1_TINT12);
TimerIntStatusClear(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
Timer12Flag=1;
TimerPeriodSet(SOC_TMR_1_REGS, TMR_TIMER12, TMR_PERIOD12); // 设置周期
// TimerIntEnable(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE); // 使能 定时器 / 计数器 中断
}
Nancy Wang:
您调试看一下INTCTLSTAT的状态,是不是每次执行TimerIntDisable之前中断已经触发了,将全局中断disable是否可行?暂时没有想到其它方式。
,
user6549373:
好的,这边尝试一下,感谢