-1

我已经从 8 位裸机寄存器迁移过来,并且不得不学习一些新的 C 功夫来了解 CMSIS 核心方法。

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

他们为什么使用工会?我以前没有见过这种语法。

如果你使用联合来创建这样的结构,你会用指针深入几层吗?内存管理与工会?我在这里缺少一些 C 语法吗?

这可能是 CMSIS 特定的,有谁知道“:1”在这些结构声明中做了什么......?我知道 __IO 与读/写的某些 CMSIS 定义有关。

我在评论和回答后发现的有用的东西:

ARM 的 CMSCIS 外设命名约定——这个示例代码似乎不太优雅地确认......

ARM 的 BITFIELD 编译器关于结构和联合的说明

/**
  * @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;

4

1 回答 1

3

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

于 2018-01-15T21:18:03.787 回答