Отключение 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) просто установите «Проект»> «Свойства»> «Настройки запуска/отладки»> «Конфигурации запуска» для [имя проекта]:> [имя проекта] «Отладка»> «Редактировать»> «Отладчик»> «Настройки устройства»> «Приостановить счетчики сторожевого таймера». во время остановки:
включить.