gpt4 book ai didi

CMSIS - 外设定义 - 具有 union 语法的结构?

转载 作者:行者123 更新时间:2023-11-30 18:35:05 25 4
gpt4 key购买 nike

我已经从 8 位裸机寄存器转向,并且必须学习一些新的 C Kungfu 才能理解 CMSIS 核心方法。

我这里有一段来自 ARM Cortex M 供应商的外设访问层的代码片段。他们创建了这个 SN_WDT_TYPE 结构,您可以使用它们的符号来设置看门狗定时器寄存器。

他们为什么使用 union ?我以前从未见过这种语法。

如果您使用 union 来创建这样的结构,您是否会使用指针深入几层?内存管理与 union ?我在这里缺少一些 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;

最佳答案

union 允许您以 32 位字或寄存器中包含的位字段的形式访问硬件寄存器。两种表示法都有其用途。也许您缺少位字段语法,因为大多数应用程序级编码中都没有使用它。位字段布局是特定于编译器的,但 CMSIS header 是为与预期编译器一起使用而构建的。

关于CMSIS - 外设定义 - 具有 union 语法的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com