[英]Disabling the STM32 IWDG during debugging
我在 STM32F4 微控制器上有一個 ChibiOS 3.x 程序,我使用 IWDG 看門狗在出現這樣的錯誤時重置 MCU:
int main() {
iwdgInit();
iwdgStart(&IWDGD, &wd_cfg);
while(true) {
// ... do stuff
}
}
如果我現在連接調試器並在任何時候停止程序(手動或通過斷點),微控制器將在看門狗配置定義的超時后重置(因此會導致調試過程中出現問題)
如何禁用此行為,即如何在內核因調試器而停止時禁用 IWDG?
我曾嘗試完全禁用它,但是,我需要讓它運行以捕獲不需要的 IWDG 重置。
STM32 MCU 包含一項稱為調試凍結的功能。 您可以停止多個外設,包括 I2C 超時、RTC,當然還有看門狗。
在STM32參考手冊中,參考38.16.4ff節“MCU調試組件(DBGMCU)”。
IWDG 在 APB1 總線上運行。 因此,您需要修改DBGMCU_APB1_FZ
,最具體地聲明該寄存器中的DBG_IWDG_STOP
位。
該寄存器的 POR 值(= 默認值)為 0x0,即如果您不主動禁用它,IWDG 仍將運行。
int main() {
// Disable IWDG if core is halted
DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP;
// Now we can enable the IWDG
iwdgInit();
iwdgStart(&IWDGD, &wd_cfg);
// [...]
}
請注意,當未在軟件中啟用看門狗時,如果WDG_SW
位在閃存選項字節中復位,則它可能仍會在硬件中啟用。
如果您使用的是 ST HAL( ChibiiOS 中未包含,請參閱STM32CubeF4 ),您還可以使用此宏:
__HAL_DBGMCU_FREEZE_IWDG();
(基本上和我們上面做的完全一樣)
此外,您需要在調用__HAL_DBGMCU_FREEZE_IWDG()
之前啟用 APB2 上的 DBGMCU 時鍾。
__HAL_RCC_DBGMCU_CLK_ENABLE();
使用 ST HAL 時,正確使用的宏是:
__HAL_DBGMCU_FREEZE_IWDG()
根據參考手冊,DBGMCU_CR寄存器“可以在系統復位下由調試器寫入”,因此,如果調試器支持它,則無需在軟件中進行更改。
例如,在 STM32CubeIDE(截至目前版本 1.6.0)中,只需設置 Project > Properties > Run/Debug Settings > Launch configuration for [project name]:> [project name] Debug > Edit > Debugger > Device Settings > Suspend watchdog counters停止時:
啟用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.