代码之家  ›  专栏  ›  技术社区  ›  Leroy105

CMSIS-外围定义-具有联合语法的结构?

  •  -1
  • Leroy105  · 技术社区  · 7 年前

    我已经从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;
    1 回复  |  直到 7 年前
        1
  •  3
  •   andy mango    7 年前

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