簡體   English   中英

在調試期間禁用 STM32 IWDG

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM