6.1 Hardware Watchdog Timer (HWWDT)
Un Watchdog Timer (WDT) es un temporizador de seguridad que supervisa el funcionamiento de un sistema embebido. Si el software no lo “alimenta” periódicamente —es decir, no reinicia su contador dentro de un tiempo límite— el WDT asume que el sistema está bloqueado o ha fallado, y ejecuta una acción correctiva, normalmente un reset automático.
Su propósito es garantizar que el sistema se recupere de errores inesperados, como bucles infinitos, bloqueos o fallos de software. Es especialmente útil en aplicaciones críticas donde la fiabilidad es esencial.
En esta práctica utilizaremos el HWWDT del microprocesador s6e2cc para implementar un mecanismo de recuperación ante fallos.
Comenzaremos diseñando un módulo HAL que permita configurar y controlar el HWWDT.
6.2 Diseño del módulo HAL.
Seguiremos los pasos siguientes:
Estudiar la guía de usuario del periférico.
Identificar sus características y registros de configuración.
Diseñar la interfaz (HAL_FM4_hwwdt.h).
Implementar la funcionalidad (HAL_FM4_hwwdt.c).
Test.
6.2.1 Estudio del periférico HWWDT
En el capítulo 1 del documento FM4 Family Peripheral Manual Timer Part se describe el comportamiento y el procedimiento de activación del periférico HWWDT.
Estudia la documentación y responde a las preguntas siguientes:
¿Qué es el HWWDT?
¿Qué se puede configurar en el HWWDT?
¿Cuál es la frecuencia del reloj que alimenta el HWWDT?
¿Cuál es el valor de reinicio para que el periodo de desbordamiento sea de 1s?
¿Cuál es el procedimiento para modificar el registro WDG_CTL?
¿Cuál es el procedimiento para reiniciar/limpiar (feed the dog) el HWWDT?
¿Es posible enmascarar su interrupción?
6.2.2 Registros de estado y configuración.
Las direcciones donde se encuentran los registros, se pueden consultar en el apéndice A.1.5 del documento FM4 Family Peripheral Manual Timer Part.
Responde a las preguntas siguientes:
¿Cuáles son los registros del HWWDT?
¿En qué direcciones se encuentran?
Estudia en el fichero
s6e2cc.hlos recursos utilizados para acceder a estos registros.¿Cuándo se limpia el bit RIS del registro WDG_RIS?
6.2.3 Diseño de la interfaz HAL_FM4_hwwdt.h
El código siguiente muestra una posible interfaz para este módulo, estúdialo y complétalo si lo estimas necesario.
1 /**
2 * @brief HWWDT unlock keys
3 *
4 */
5 #define HWWDT_REG_UNLOCK_key1 (0x1ACCE551u)
6 #define HWWDT_REG_UNLOCK_key2 (0xE5331AAEu)
7
8 /**
9 * @brief Inicializa Hardware Watchdog
10 *
11 * @param [in] wdogload Periodo de desbordamiento de HWWDT en ciclos de reloj
12 * @param [in] wdogreset 1/0 activa generación de reset
13 *
14 * @return No retorna nada
15 *
16 * @note Esta función solo configura el HWWDT
17 * Si se ejecuta HWWDT_Start() HWWDT empieza a funcionar.
18 * HWWDT utiliza como reloj CLKLC (100 kHz)
19 * el símbolo __CLKLC definido en (system_s6e2cc.h)
20 * guarda la frecuencia de reloj de CLKLC.
21 */
22 void HWWDT_Init(uint32_t wdogload, uint8_t wdogreset);
23
24 /**
25 * @brief Pone en marcha el Hardware Watchdog
26 *
27 * @return No retorna nada
28 */
29 void HWWDT_Start(void);
30
31 /**
32 * @brief Devuelve el estado de la interrupción del HWWDT
33 *
34 * @return 1 -> Interrupción generada
35 * 0 -> No se ha generado interrupción
36 */
37 uint8_t HWWDT_GetIntStatus(void);
38
39 /**
40 * @brief Lee el valor del contador del HWWDT
41 *
42 * @retval uint32_t: valor del HWWDT
43 */
44 uint32_t HWWDT_ReadWdgValue(void);
45
46 /**
47 * @brief Feed Hardware Watchdog (HWWDT)
48 *
49 * @details Esta función "alimenta" el HWWDT con la secuencia
50 * unlock -> feed -> lock. Los valores arbitrarios deben escogerse
51 * para evitar que el HWWDT se "alimente" de forma fortuita.
52 *
53 * @param [in] u8ClearPattern1 Patron de valor arbitrario
54 * @param [in] u8ClearPattern2 Inverso del patron de valor arbitrario
55 *
56 * @note Los valores arbitrarios deben escogerse
57 * para evitar que el HWWDT se "alimente" de forma fortuita.
58 */
59 void HWWDT_Feed(uint8_t u8ClearPattern1, uint8_t u8ClearPattern2);
6.2.4 Implementación del módulo HAL_FM4_hwwdt.c
Implementa las funciones declaradas en la interfaz HAL_FM4_hwwdt.h.
6.2.5 Test del módulo HWWDT
Utilizaremos aplicación que hace parpadear el led RGB en distintos colores dependiendo del bloque de código que se esté ejecutando (ver tabla). La función main() incluye un bucle infinito al que se accede después de una pulsación larga de SW2, de esta manera se emula el funcionamiento incorrecto de la aplicación.
🔴 |
proceso de inicialización |
🟢 |
bucle infinito |
🟡 |
bloqueo por pulsación larga |
🔵 |
subrutina de interrupción |
Diseño y test módulo HWWDT
Preparación del entorno.
Descarga y descomprime el archivo de recursos
lab6en tu espacio de trabajo.Los archivos
HAL_FM4_hwwdt.hyHAL_FM4_hwwdt.cse incluyen respectivamente en las carpetashal\includeyhal\src.
Configuración del proyecto.
Abre el proyecto lab6.
Selecciona el target
Test_HWWDT.
Tareas a realizar.
Implementa las funciones del módulo HWWDT en el archivo
HAL_FM4_hwwdt.c.Compila el proyecto, ejecuta la aplicación y explica su comportamiento, ¿está el HWWDT funcionando?
En la función
main()situada en el archivotest\test_hwwdt.cincluye el código necesario para inicializar el HWWDT con un tiempo de desbordamiento de 4s y la generación de reset desactivada. Describe el comportamiento del programa.A continuación escribe el código que permite arrancar el HWWDT. Compila y ejecuta la aplicación. ¿Se ha bloqueado la ejecución del programa? ¿en qué línea de código?
En el archivo
test\test_hwwdt_isr.ccompleta el código de la subrutina de interrupción NMI (void NMI_Handler(void)). La interrupción no enmascarable (NMI) y la interrupción por HWWDT comparten el mismo vector de interrupción. En la subrutina de interrupción debemos incluir código para distinguir qué evento ha desencadenado su ejecución, en este caso la subrutina realizará el siguiente proceso:si (si la NMI fue generada por el Hardware Watchdog) { repetir indefinidamente { si systick ha generado overflow (cada 1 ms) entonces { Led azul parpadea } } }Compila y ejecuta la aplicación. ¿Se ha bloqueado la ejecución del programa? ¿en qué parte del código?
Incluye código para alimentar el perro guardián (HWWDT) y reiniciarlo antes de su desbordamiento. ¿Qué sucede si el funcionamiento es incorrecto? (pulsación larga).
Modifica el código para que incluya la activación de la generación de reset. ¿Qué ha cambiado en la ejecución del programa?
Completa los tests de prueba para verificar el funcionamiento de las funciones del módulo no utilizadas en las pruebas anteriores.