Отключение IWDG STM32 во время отладки

У меня есть ChibiOS 3.x программа на микроконтроллере STM32F4, где я использую iwdg watchdog для сброса MCU при таких ошибках:

int main() {
    iwdgInit();
    iwdgStart(&IWDGD, &wd_cfg);
    while(true) {
        // ... do stuff
    }
}

Если теперь я подключу отладчик и в любой момент остановлю программу (вручную или через точку останова), микроконтроллер сбросится после тайм-аута, определенного конфигурацией watchdog (и, следовательно, вызовет проблемы в моем процессе отладки)

Как я могу отключить это поведение, т. е. как я могу отключить IWDG в то время как ядро остановлено из-за отладчика?

Я попытался полностью отключить его, однако мне нужно оставить его работать, чтобы поймать нежелательные сбросы IWDG.

2 ответов


MCUs STM32 содержат функцию под названием debug freeze. Вы можете остановить несколько периферийных устройств, включая таймауты I2C, RTC и, конечно же, сторожевого пса.

на STM32 для руководства, см. раздел 38.16.4 ff.

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 бит сбрасывается в байтах опции flash.

если вы используете ST HAL (не входит в ChibiOS, см. STM32CubeF4), вы также можете использовать этот макрос:

 __HAL_DBGMCU_FREEZE_IWDG()

(который в основном делает то же самое, что и мы сделали выше)

кроме того, вам нужно включите часы DBGMCU на APB2.

 __HAL_RCC_DBGMCU_CLK_ENABLE();

при использовании ST HAL правильный макрос для использования:

__HAL_DBGMCU_FREEZE_IWDG()