2015-09-11 36 views
6

Ho un programma 3.x ChibiOS su un microcontrollore STM32F4 in cui io uso il cane da guardia IWDG per ripristinare la MCU in caso di errori del genere:La disattivazione del STM32 IWDG durante il debug

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

Se ora io attribuisco il mio debugger e , in qualsiasi momento, interrompe il programma (manualmente o tramite un breakpoint), il microcontrollore si resetterà dopo il timeout definito dalla configurazione del watchdog (e quindi causa problemi nel mio processo di debug)

Come posso disabilitare questo comportamento, cioè come posso disattivare l'IWDG mentre il core è arrestato a causa del debugger?

Ho provato a disattivarlo completamente, tuttavia, ho bisogno di lasciarlo in esecuzione per recuperare i reimpostazioni IWDG indesiderati.

+0

L'IWDG è disabilitato di default, quindi si può solo lasciarlo disattivato finché non si inizia a testare il codice finale. Se vuoi fare tutorial per l'STM, sei molto meglio del wiki STM32. L'overflow dello stack è un Q & A, non un sito tutorial. – Olaf

+0

@Olaf a) Assicuratevi che i miei tutorial siano completamente diversi da questo. Questa è una domanda specifica con una risposta specifica, in altre parole una domanda e risposta. Che wiki STM32 intendi? b) La tua ipotesi è sbagliata. Mentre in fase di sviluppo questo potrebbe funzionare, ho un sacco di casi in cui ho * bisogno * di IWDG da resettare se il timer WDG si esaurisce, ad es. acquisire dati sul comportamento (errato) sotto l'attività di rete ad alto carico (il watchdog si ripristina inavvertitamente?). Aspettare fino a quando la produzione con questo sarebbe sciocco. Anche la risposta a questo è abbastanza importante per i test di produzione. –

+2

@Olaf Quindi, nessuna domanda STM32 deve essere richiesta * affatto * perché è tutto nei documenti? Non penso davvero che questo argomento funzioni. Se pensi che questa sia una domanda con ricerca non sufficiente, downvote e/o votare per chiudere. Presumo che tu l'abbia già fatto. Mentre lo fai, scriverò più soluzioni ai problemi reali, mi dispiace ... –

risposta

6

Gli MCU STM32 contengono una funzionalità denominata debug freeze. È possibile arrestare diverse periferiche, inclusi i timeout I2C, RTC e, naturalmente, il watchdog.

Nel STM32 reference manual, fare riferimento alla sezione 38.16.4ff.

L'IWDG è in esecuzione sul bus APB1. Pertanto è necessario modificare DBGMCU_APB1_FZ, in particolare il bit DBG_IWDG_STOP nel registro.

Il valore POR (= valore predefinito) per questo registro è 0x0, ovvero se non lo si disabilita attivamente, l'IWDG sarà ancora in esecuzione.

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

Nota che, quando non attivando il cane da guardia del software, potrebbe ancora essere attivata in hardware se il bit WDG_SW viene azzerato nei byte opzione flash.

Se si utilizza la ST HAL (non incluso nel ChibiOS, vedere STM32CubeF4), è anche possibile utilizzare questa macro:

__HAL_DBGMCU_FREEZE_IWDG() 

(che fondamentalmente fa esattamente la stessa cosa come abbiamo fatto in precedenza)

Inoltre, è necessario abilitare l'orologio DBGMCU su APB2.

__HAL_RCC_DBGMCU_CLK_ENABLE(); 
3

Quando si utilizza la ST HAL, la macro diritto di utilizzare è:

__HAL_DBGMCU_FREEZE_IWDG() 
+0

Buon punto, grazie per aver aggiunto questo. La maggior parte delle volte non uso l'HAL almeno per cose semplici, tuttavia suppongo che la maggior parte delle persone in genere utilizzi ST HAL, quindi questo potrebbe essere molto utile per loro. –