This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1237E6PM:SysTK_Handler 停止被调用

Guru**** 1555290 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/972584/tm4c1237e6pm-systick_handler-stops-being-called

器件型号:TM4C1237E6PM

在我们的代码中、我们设置 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 处理程序停止调用、因此我无法解决问题。  我有可用的权变措施、但如果我无法指向实际的故障机制、它们将无法被完全接受。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

     不确定您描述的行为有什么错误。 与 USB (优先级为60)相比、SysTick 具有相对较高的中断优先级(优先级为15)。 因此、如果一个 USB 中断出现、它将不会取代 SysTick。  相反、如果处理器当前正在为 USB 提供服务、则 SysTick 中断应优先于 USB、因为它具有更高的优先级。 这是基于默认优先级排列的情况。 但是、如果您重新映射优先级、使 SysTick 优先级低于 USB、则情况会有所不同。 请确认这一点。  

     当您使用调试器时、您是否还能在 NVIC 模块中查看 SysTick 寄存器。 单击"Continuous Refresh"、您是否看到 NVIC_ST_CURRENT 寄存器更改值? 还要观察 NVIC_ST_CTRL 寄存器、低三位设置为高电平、以使用系统时钟作为时钟源、启用中断并启用 SysTick 计数器。  

     如果您认为 USB 与 SysTick 有关、那么您能做一个实验吗? 将 SysTick 时钟源从系统时钟更改为 PIOSC。 有什么不同吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查尔斯

    我没有更改 SysTick 优先级。

    我在调试会话期间查看了启用了 Continuous Refresh 的 NVIC 寄存器。  我看到当前值不断更新、ST_CTRL 通常为0x0000_0007、短时间为0x0000_0005。  在首次连续刷新调试运行后、我从未看到寄存器再次自动刷新。  如果我暂停运行、然后重新启动、NVIC_CURRENT 将更改其值。   
    当 FW 停止调用 SysTick ISR 时、我可以使用 HALT/START 并看到 NVIC_CURRENT 仍在更改其值。  我认为计数器没有到达0、因为我在 ISR 内部设置的断点永远不会到达。

    我将 SysTick 设置更改为以下设置、以将 PIOSC 用作时钟源

    ROM_SysTickPeriodSet (4000000/1000);
    //rom_SysTickPeriodSet (50000000 / 1000);
    ROM_SysTickIntEnable();
    ROM_SysTickEnable();
    HWREG (NVIC_ST_CTRL)&=~(NVIC_ST_CTRL_CLK_SRC);

    进行该更改后、始终调用 SysTick ISR。  但是、我不能为了快乐而开始跳转、因为如果我对代码进行任何更改、ISR 将始终被调用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查尔斯

      我忘记提到另外两点。

    1. 当我在代码中到达 SysTickIntDisable()时,如果我尝试在 CCS 中打开该函数,我将收到消息。

      无法在"C:/Jenkins/workspace/TivaWare-Git-Release/DriverLib/build/DriverLib.test/driverlib/systick.c "中找到源文件
      找到文件或编辑源查找路径以包括其位置。



    2. 当未调用 ISR 时、如果我将 USB 电缆插入控制台、则文本会通过 USB 接口发送、然后再次调用 ISR。

    Chuck Wilde

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

     

    [引用用户="Chuck Wilde"]

    无法在"C:/Jenkins/workspace/TivaWare-Git-Release/DriverLib/build/DriverLib.test/driverlib/systick.c "中找到源文件
    找到文件或编辑源查找路径以包括其位置。

    [/报价]

     请参阅下面的内容。 单击"Locate File"按钮并提供 driverlib 的路径。  如果您使用的是 TivaWare v2.2.0.295、则为 C:\ti\TivaWare_C_Series-2.2.0.295\driverlib。