TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320C6748: timer 问题咨询

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:

好的,这边尝试一下,感谢

赞(0)
未经允许不得转载:TI中文支持网 » TMS320C6748: timer 问题咨询
分享到: 更多 (0)