我已经从 8 位裸机寄存器迁移过来,并且不得不学习一些新的 C 功夫来了解 CMSIS 核心方法。
我在这里有一段来自 ARM Cortex M 供应商的外设访问层的代码片段。他们创建了这个 SN_WDT_TYPE 结构,您可以使用它们的符号来设置看门狗定时器寄存器。
他们为什么使用工会?我以前没有见过这种语法。
如果你使用联合来创建这样的结构,你会用指针深入几层吗?内存管理与工会?我在这里缺少一些 C 语法吗?
这可能是 CMSIS 特定的,有谁知道“:1”在这些结构声明中做了什么......?我知道 __IO 与读/写的某些 CMSIS 定义有关。
我在评论和回答后发现的有用的东西:
ARM 的 CMSCIS 外设命名约定——这个示例代码似乎不太优雅地确认......
/**
* @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;