Watchdog se activa después de reiniciar

1

Estoy usando TWR- S08DC-PT60 que tiene un microcontrolador MC9S08PT60.

Estoy intentando deshabilitar el temporizador de vigilancia en mi aplicación, solo por facilidad de desarrollo. Después de configurarlo en el software, se deshabilita en la primera ejecución después de la programación, según se desee. Sin embargo, después de que se produce un reinicio, ya sea mediante el botón de reinicio o el apagado, se activa automáticamente. Esto sucede cuando depuro, ejecuto o flasheo usando CodeWarrior 10.4.

Así es como lo deshabilito:

  _WDOG_CS1.Bits.UPDATE = 1; // Enable changes to WDOG.
  WDOG_CNT = 0xC520; // write the 1st unlock word
  WDOG_CNT = 0xD928; // write the 2nd unlock word

  _WDOG_CS1.Bits.EN = 0; // Kill the dog.
  _WDOG_CS1.Bits.INT = 1; // Enable WDOG interrupt.

En el manual de referencia :

  

23.3.2.1 Reconfigurando el Watchdog

     

En algunos casos (como cuando se admite una función de cargador de arranque), los usuarios pueden querer reconfigurar o   deshabilita el watchdog sin forzar un reinicio primero. Estableciendo el   WDOG_CS1 [ACTUALIZACIÓN] bit a 1 en la configuración inicial de la   Watchdog después de un reinicio, los usuarios pueden reconfigurar el watchdog en cualquier momento   ejecutando una secuencia de desbloqueo. (Por el contrario, si el WDOG_CS1 [ACTUALIZACIÓN]   sigue siendo 0, la única forma de reconfigurar el watchdog es iniciar un   reiniciar.) La secuencia de desbloqueo es similar a la secuencia de actualización pero   utiliza diferentes valores.

Cuando depuro la aplicación, puedo ver que el bit de ACTUALIZACIÓN está configurado y el temporizador de vigilancia está deshabilitado, también, se comporta como se desea cuando reinicio usando el depurador. Sin embargo, en caso de que se reinicie el botón de reinicio o se apague, el temporizador de vigilancia se habilita de nuevo y reinicia la MCU, ya que no lo introduzco en el bucle principal.

Además, no crea una interrupción antes de reiniciar la MCU, aunque su interrupción está habilitada. Puedo ver, con la ayuda del registro SYS_SRS (fuente de reinicio del sistema) que el MCU se reinicia por última vez con el temporizador de vigilancia.

Comentando la segunda y tercera línea (WDOG_CNT = ...) no ayuda.

Aquí está mi código completo:

2 respuestas

1

Lo siguiente se indica en la página 615 de manual de referencia , en la sección 23.3. 2:

  

La nueva configuración surte efecto solo después de todos los registros excepto   WDOG_CNTH: L se escriben una vez después del reinicio. De lo contrario, el WDOG utiliza el   restablecer los valores por defecto. Si no se usa el modo de ventana (WDOG_CS2 [WIN] es   0), escribir a WDOG_WINH: L no es necesario para hacer el nuevo   la configuración surta efecto.

Al agregar estas líneas en la función initialize_CPU() en el archivo init.c , puedo configurar el temporizador de vigilancia y deshabilitarlo:

WDOG_CS1 = 0x60;
WDOG_CS2 = 1;
WDOG_TOVAL = 0x04;

Además, es bueno tener en cuenta que los registros del temporizador de vigilancia solo se pueden escribir una vez. Por lo tanto, los cambios de bits individuales no tendrán efecto después de la primera escritura en el mismo registro del temporizador de vigilancia.

Si el usuario desea configurar cualquiera de los registros del temporizador de vigilancia más adelante, las actualizaciones deben habilitarse en la primera configuración. Después de eso, el siguiente se utiliza para configurar el temporizador de vigilancia la segunda vez. Para obtener más información, consulte el manual de referencia .

/* Initialize watchdog with ~1-kHz clock source, ~1s time-out */
DisableInterrupts; // disable global interrupt
WDOG_CNT = 0xC520; // write the 1st unlock word
WDOG_CNT = 0xD928; // write the 2nd unlock word
WDOG_TOVAL = 1000; // setting timeout value
WDOG_CS2 = WDOG_CS2_CLK_MASK; // setting 1-kHz clock source
WDOG_CS1 = WDOG_CS1_EN_MASK; // enable counter running
EnableInterrupts; // enable global interrupt
    
respondido por el abdullah kahraman
0

Prácticamente todas las MCU con las que he trabajado habilitan el WDT en el reinicio. Si desea que esté deshabilitado, lo que debe hacer es poner el código para deshabilitarlo como el primer código ejecutado sin restablecer. Eso puede incluso significar tener que modificar el módulo de inicio de C para que esto suceda desde la puerta de inicio. Algunos conjuntos de herramientas entregan el código de inicio con condiciones ya establecidas para habilitar este comportamiento.

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas