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

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

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

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

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

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

3 ответа

Решение

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

В справочном руководстве по STM32 см. Раздел 38.16.4ff.

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()

Согласно справочному руководству, регистр DBGMCU_CR «может быть записан отладчиком при перезагрузке системы», поэтому, если отладчик поддерживает это, нет необходимости вносить изменения в программное обеспечение.

Например, в STM32CubeIDE (на данный момент версия 1.6.0) просто установите «Проект»> «Свойства»> «Настройки запуска/отладки»> «Конфигурации запуска» для [имя проекта]:> [имя проекта] «Отладка»> «Редактировать»> «Отладчик»> «Настройки устройства»> «Приостановить счетчики сторожевого таймера». во время остановки:

включить.

Другие вопросы по тегам