我已经从8位裸机寄存器转移过来,必须学习一些新的C功夫,以了解CMSIS核心方法。
我这里有一段来自ARM Cortex M供应商的外围访问层的代码。它们创建这个SN\U WDT\U类型的结构,您可以使用它的符号来设置看门狗计时器寄存器。
他们为什么使用工会?我以前从未见过这种语法。
如果您使用联合来创建这样的结构,您是否会使用指针深入到几层?使用联合体进行内存管理?这里是否缺少一些C语法的东西?
这可能是特定于CMSIS的,有人知道“:1”在这些结构声明中的作用吗。。。?我知道IO与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;