2015-09-11 5 views
6

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

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

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

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

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

+0

IWDG отключена по умолчанию, так что вы просто не можете оставить его выключенным, пока вы начнете испытывать окончательный код. Если вы хотите сделать обучающие программы для STM, вам намного лучше в вики STM32. Переполнение стека - это Q & A, а не учебный сайт. – Olaf

+0

@ Olaf a) Будьте уверены, что мои учебники выглядят совершенно иначе, чем это. Это конкретный вопрос с конкретным ответом, другими словами Q & A. Что вы имеете в виду в STM32 wiki? б) Ваше предположение неверно. Хотя в раннем развитии это может сработать, у меня довольно много случаев, когда мне нужно * IWDG для сброса, если заканчивается таймер WDG, например. для получения данных о (неправильном) поведении при сетевой нагрузке высокой нагрузки (перезагружается ли сторожевой таймер?). Ожидание, пока производство с этим было бы глупо. Также ответ на этот вопрос очень важен для производственных испытаний. –

+2

@Olaf Итак, вопрос STM32 не должен задаваться * вообще *, потому что это все в документах? Я действительно не думаю, что этот аргумент работает. Если вы считаете, что это вопрос, в котором недостаточно исследований, ниспроверки и/или голосования, чтобы закрыть. Я полагаю, вы уже это сделали. Пока вы это делаете, я собираюсь написать больше решений для реальных проблем, извините ... –

ответ

6

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

В STM32 reference manual см. Раздел 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 бит сбрасывается в режиме вспышки байт.

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

__HAL_DBGMCU_FREEZE_IWDG() 

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

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

__HAL_RCC_DBGMCU_CLK_ENABLE(); 
3

При использовании ST HAL, право макросъемки использовать это:

__HAL_DBGMCU_FREEZE_IWDG() 
+0

Хорошая точка, спасибо за добавление этого. В большинстве случаев я не использую HAL, по крайней мере, для простых вещей, однако я полагаю, что большинство людей обычно используют ST HAL, поэтому это может быть очень полезно для них. –