在我们的代码中、我们设置 SysTick、如图所示。
/*将 SysTick 模块插入1ms 中断@50MHz。
*
ROM_SysTickPeriodSet (50000000 / 1000);
ROM_SysTickIntEnable();
ROM_SysTickEnable();
SysTick 处理程序例程如下所示。
空 SysTick 处理程序(空)
{
/*
*===函数===========================================================================================================
*名称:SysTick 处理程序()
*说明:SysTick 的中断服务例程。
*
*处理所有后台处理。
*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*
sc_tmr_ms_c勾 选= true;
+tmr_CTR;
//
// SysTick 为1ms -我们希望每个 button_POLL_TIME MS 对按钮进行轮询。
//
如果((tmr_CTR % button_POLL_time)= 0){
STbutton_poll ();
}
//每50毫秒检查一次看门狗。 应切换输出。
如果((tmr_CTR % WDOG_POLL_TIME)= 0){
wdog_check();
}
//轮询 SAFETY_FAULT 输入
if ((start_the_main_loop = true)&((tmr_CTR % safety_fault_pol_time)= 0)){
SAFETY_FAULT_POLL ();
}
// if (((tmr_CTR % wireless_POLL_time)= 0){
// read_BT_stat ();
//}
//
// if (((tmr_CTR % wireless_BATT_POLL_time)=0){
// read_BT_batt stat();
//}
如果(((proc.handPie_state =LED_FAST_FLASH)&&((tmr_CTR % FAST_FLASH_RATE)==0))||
((proc.handPie_state = LED_SLOW_FLASH)&&((tmr_CTR % SLOW_FLASH_RATE)= 0))||
((proc.handPie_state = LED_Faster_flash)&&(((tmr_CTR % Faster_flash_rate)= 0))){
/**/
//proc.handipe_on ^= 1;//翻转状态 LED
//同步此 LED 的闪烁
如果(((proc.handPie_state =LED_FAST_FLASH)&&((tmr_CTR %(FAST_FLASH_RATE*2))==0))||
((proc.handPie_state =LED_Fast_flash)&&((tmr_CTR %(faster _flash_rate * 2))== 0))||
((proc.handPie_state =LED_SLOW_FLASH)&&((tmr_CTR %(SLOW_FLASH_RATE * 2)==0))))
proc.handPie_on = 1;
其他
proc.handPie_on = 0;
if (proc.handPie_on){
SC_RAISE _EVT (HandPie_led、on);
}否则{
SC_RAISE _EVT (HandPie_led、off);
}
}
/*更多 LED 处理,所有操作都使用与上述相同的代码*/
}
问题出在这里。 代码运行正常、直到发生某些事件并且 SysTick 处理程序停止被调用。 我们的盒子停止处理按钮输入、并停止闪烁 LED。 使用调试器、我看到主循环仍在运行、但没有调用 SysTick 处理程序。
- 我已达到图150。 当我更改为新图像时、故障有时会消失、有时会出现在序列中的另一个位置。 如果出现、则在该图像中是可重复的。
- 我可以监控 SysTick 中断使能位和主机中断使能位(PRIMASK 寄存器)、并且两个中断级别都启用。
- 这个盒子有一个 USB 连接、我们使用从 TivaWare 2.1.2.111建立的代码。
- 如果连接了 USB 电缆、则不会发生故障。 只有在未连接电缆时才会发生这种情况。
- 如果在故障发生后插入电缆、代码将再次开始运行。
- 我将代码更改为引入2.2.0.295库、但这没有解决问题。
- 我的 STACK_SIZE = 2048。 我把它增加了512到2560、但这没有解决问题。
其他人是否看到过此问题? 它显然与 USB 接口相关、但我不知道为什么 SysTick 处理程序停止调用、因此我无法解决问题。 我有可用的权变措施、但如果我无法指向实际的故障机制、它们将无法被完全接受。