2015-09-11 31 views
6

Mam program 3.x ChibiOS na mikrokontrolera STM32F4 gdzie używam watchdog IWDG zresetować MCU o błędach tak:Wyłączenie STM32 IWDG podczas debugowania

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

Jeśli teraz dołączyć moje i debugger , w dowolnym momencie, zatrzymaj program (ręcznie lub za pomocą punktu przerwania), mikrokontroler zresetuje się po upływie limitu czasu zdefiniowanego przez konfigurację watchdoga (i dlatego powoduje problemy w procesie debugowania)

Jak mogę wyłączyć to zachowanie, np. jak mogę wyłączyć IWDG, gdy rdzeń jest zatrzymany z powodu debuggera?

Próbowałem wyłączyć całkowicie, jednak muszę go uruchomić, aby złapać niechciane resetowania IWDG.

+0

IWDG jest domyślnie wyłączone, więc może po prostu zostawić to wyłączone do czasu rozpoczęcia badania końcowego kodu. Jeśli chcesz zrobić tutoriale dla STM, jesteś o wiele lepszy na wiki STM32. Przepełnienie stosu jest pytaniem i pytaniem, a nie tutorialem. – Olaf

+0

@Olaf a) Zapewniam, że moje samouczki wyglądają zupełnie inaczej. Jest to konkretne pytanie z konkretną odpowiedzią, innymi słowy pytania i odpowiedzi. Co znaczy wiki STM32? b) Twoje założenie jest błędne. Podczas gdy we wczesnej fazie rozwoju to może działać, mam sporo zastosowań, w których * potrzebuję * IWDG do resetowania, jeśli skończy się czas WDG, np. pozyskać dane o (niewłaściwym) zachowaniu w warunkach dużej aktywności sieciowej (czy watchdog zresetował się nieumyślnie?). Oczekiwanie na produkcję z tym byłoby głupie. Również odpowiedź na to pytanie jest bardzo ważna dla testów produkcyjnych. –

+2

@Olaf Więc, żadne pytanie STM32 nie musi w ogóle * zostać poproszone * ponieważ wszystko jest w dokumentach? Naprawdę nie sądzę, że ten argument działa. Jeśli uważasz, że to jest pytanie z niewystarczającą ilością badań, głosuj i/lub głosuj na zamknięcie. Zakładam, że już to zrobiłeś. Kiedy to robisz, napiszę więcej rozwiązań dla rzeczywistych problemów, przepraszam ... –

Odpowiedz

6

Mikrokontrolery STM32 zawierają funkcję o nazwie rozmrożenie debugowania. Możesz zatrzymać kilka urządzeń peryferyjnych, w tym limity czasu I2C, RTC i, oczywiście, watchdoga.

W STM32 reference manual, patrz rozdział 38.16.4ff.

IWDG działa na magistrali APB1. W związku z tym należy zmodyfikować DBGMCU_APB1_FZ, w szczególności potwierdzić bit DBG_IWDG_STOP w tym rejestrze.

Wartość POR (= wartość domyślna) dla tego rejestru wynosi 0x0, tj. Jeśli nie zostanie aktywnie wyłączone, IWDG będzie nadal działać.

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); 
    // [...] 
} 

Zauważ, że gdy nie umożliwiając watchdog w oprogramowaniu, to nadal może być włączony w sprzęcie czy WDG_SW bit jest zerowany w bajtach opcji lampy błyskowej.

Jeśli używasz ST HAL (nie wchodzi w ChibiOS patrz STM32CubeF4), można również użyć tego makra:

__HAL_DBGMCU_FREEZE_IWDG() 

(która w zasadzie robi dokładnie tak samo jak zrobiliśmy powyżej)

Poza tym należy włączyć zegar DBGMCU na APB2.

__HAL_RCC_DBGMCU_CLK_ENABLE(); 
3

Przy użyciu ST HAL, prawo makro do wykorzystania jest:

__HAL_DBGMCU_FREEZE_IWDG() 
+0

Dobra uwaga, dzięki za dodanie tego. Przez większość czasu nie używam HAL przynajmniej dla prostych rzeczy, jednak przypuszczam, że większość ludzi używa zazwyczaj ST HAL, więc może to być dla nich bardzo pomocne. –