He pasado de los registros de 8 bits de metal desde cero y he tenido que aprender un poco de Kungfu C para envolver mi cabeza en torno al enfoque de CMSIS Core.
Aquí tengo un fragmento de código de una capa de acceso periférico de un proveedor de ARM Cortex M. Crean esta estructura SN_WDT_TYPE, que puedes usar para configurar los registros del temporizador de vigilancia usando su notación.
¿Por qué usan los sindicatos? No he visto este tipo de sintaxis antes.
Si usas uniones para crear estructuras como esa, ¿van a varias capas de profundidad con punteros? ¿Gestión de la memoria con los sindicatos? ¿Hay algo de sintaxis de C que me falta?
Esto podría ser específico de CMSIS, ¿alguien sabe qué hace el ": 1" en esas declaraciones de estructura ...? Sé que el __IO se relaciona con alguna definición de lectura / escritura de CMSIS.
CONVENCIÓN DE NOMBRAMIENTO PERIFÉRICO DE ARM'S CMSCIS : este código de ejemplo no parece confirmar con demasiada gracia ...
/* ================================================================================ */
/* ================ SN_WDT ================ */
/* ================================================================================ */
/**
* @brief Watchdog Timer (SN_WDT)
*/
typedef struct { /*!< SN_WDT Structure */
union {
__IO uint32_t CFG; /*!< Offset:0x00 WDT Configuration Register */
struct {
__IO uint32_t WDTEN : 1; /*!< WDT enable */
__IO uint32_t WDTIE : 1; /*!< WDT interrupt enable */
__IO uint32_t WDTINT : 1; /*!< WDT interrupt flag */
uint32_t : 13;
__O uint32_t WDKEY : 16; /*!< Watchdog register key */
} CFG_b; /*!< BitSize */
};
union {
__IO uint32_t CLKSOURCE; /*!< Offset:0x04 WDT Clock Source Register */
struct {
__IO uint32_t CLKSOURCE : 2; /*!< WDT clock source */
uint32_t : 14;
__O uint32_t WDKEY : 16; /*!< Watchdog register key */
} CLKSOURCE_b; /*!< BitSize */
};
union {
__IO uint32_t TC; /*!< Offset:0x08 WDT Timer Constant Register */
struct {
__IO uint32_t TC : 8; /*!< Watchdog timer constant reload value */
uint32_t : 8;
__O uint32_t WDKEY : 16; /*!< Watchdog register key */
} TC_b; /*!< BitSize */
};
union {
__O uint32_t FEED; /*!< Offset:0x0C WDT Feed Register */
struct {
__O uint32_t FV : 16; /*!< Watchdog feed value */
__O uint32_t WDKEY : 16; /*!< Watchdog register key */
} FEED_b; /*!< BitSize */
};
} SN_WDT_Type;