Molti programmi di esempio per MSP430 hanno la loro prima linea come:
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
Perché lo fanno?
Molti programmi di esempio per MSP430 hanno la loro prima linea come:
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
Perché lo fanno?
Risposte:
Il timer watchdog (WDT) è attivo per impostazione predefinita, è una cosa utile da avere in applicazioni più complesse, ma fa scattare molte nuove persone. Spesso non serviranno il WDT nel loro codice o includeranno una routine di servizio di interruzione (ISR) per gestire l'evento WDT, quindi, quando il loro chip continua a reimpostarsi, diventano molto frustrati. Inoltre, i programmi di esempio, per la maggior parte, non stanno provando a dimostrare il WDT, quindi è disattivato.
Modifica: il timer del watchdog avrebbe potuto essere chiamato "interruttore uomo morto". Il suo comportamento predefinito è reimpostare il microcontrollore a meno che il firmware non gli comunichi periodicamente che tutto funzioni correttamente. Questo è noto come "nutrire il cane" o "calciare il cane". In questo modo, se il firmware si blocca in un ciclo o smette in altro modo di funzionare come previsto, il watchdog non viene alimentato e ripristinerà il chip (si spera su uno stato nuovo e funzionante).
Puoi anche utilizzare il WDT come interruzione periodica per eseguire altre attività, qualunque cosa tu possa immaginare. Devi solo scrivere il relativo ISR.
Oltre al punto di Samuel sulle persone che inciampano accidentalmente nel WDT, c'è un altro motivo importante per cui inizialmente dovrebbe essere disabilitato.
Anche se l'applicazione è normalmente in grado di ripristinare correttamente il timer, potrebbe non essere in grado di farlo durante il codice di inizializzazione, per due motivi:
Di conseguenza, è buona norma disabilitare il WDT come prima cosa che fai, anche se non l'hai mai abilitato .
Se si desidera utilizzarlo, è possibile riattivarlo immediatamente prima di attivare gli interrupt, come ultimo passaggio del codice di inizializzazione.
int _system_pre_init(void)
funzione, che viene eseguita primamain