CMSIS - 外围定义 - 具有联合语法的结构?
CMSIS - Peripheral Definitions - Structs With Unions Syntax?
我已经从 8 位裸机寄存器转移过来,必须学习一些新的 C Kungfu 来全面了解 CMSIS 核心方法。
我这里有一段来自 ARM Cortex M 供应商的外设访问层的代码。他们创建了这个 SN_WDT_TYPE 结构,您可以使用他们的符号来设置看门狗定时器寄存器。
他们为什么要使用工会?我以前没见过这种语法。
如果你使用联合来创建这样的结构,你会用指针深入几层吗?工会的内存管理?我在这里缺少一些 C 语法吗?
这可能是 CMSIS 特有的,有谁知道“:1”在那些结构声明中的作用...?我知道 __IO 与 read/write.
的某些 CMSIS 定义有关
我在评论和回答后发现的有用信息:
ARM'S CMSCIS PERIPHERAL NAMING CONVENTION -- 这个示例代码似乎没有太优雅地确认...
ARM'S BITFIELD COMPILER NOTES ON STRUCTS & UNIONS
/**
* @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;
联合允许您以 32 位字或寄存器中包含的位字段的形式访问硬件寄存器。两种表示都有其用途。也许您错过了位域语法,因为它在大多数应用程序级编码中都没有使用。位字段布局是特定于编译器的,但 CMSIS headers 是为与预期的编译器一起工作而构建的。
我已经从 8 位裸机寄存器转移过来,必须学习一些新的 C Kungfu 来全面了解 CMSIS 核心方法。
我这里有一段来自 ARM Cortex M 供应商的外设访问层的代码。他们创建了这个 SN_WDT_TYPE 结构,您可以使用他们的符号来设置看门狗定时器寄存器。
他们为什么要使用工会?我以前没见过这种语法。
如果你使用联合来创建这样的结构,你会用指针深入几层吗?工会的内存管理?我在这里缺少一些 C 语法吗?
这可能是 CMSIS 特有的,有谁知道“:1”在那些结构声明中的作用...?我知道 __IO 与 read/write.
的某些 CMSIS 定义有关我在评论和回答后发现的有用信息:
ARM'S CMSCIS PERIPHERAL NAMING CONVENTION -- 这个示例代码似乎没有太优雅地确认...
ARM'S BITFIELD COMPILER NOTES ON STRUCTS & UNIONS
/**
* @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;
联合允许您以 32 位字或寄存器中包含的位字段的形式访问硬件寄存器。两种表示都有其用途。也许您错过了位域语法,因为它在大多数应用程序级编码中都没有使用。位字段布局是特定于编译器的,但 CMSIS headers 是为与预期的编译器一起工作而构建的。