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 是为与预期的编译器一起工作而构建的。