CMSIS - периферийные определения - структуры с синтаксисом союзов?

Я перешел с 8-битных голых металлических регистров, и мне пришлось изучать новый C Cungfu, чтобы обернуть голову вокруг подхода CMSIS Core.

У меня здесь есть фрагмент кода с уровня периферийного доступа от поставщика ARM Cortex M. Они создают эту структуру SN_WDT_TYPE, которую вы можете использовать для установки регистров сторожевого таймера, используя их обозначения.

Почему они используют союзы? Я не видел такой синтаксис раньше.

Если вы используете профсоюзы для создания подобных структур, они идут на несколько уровней с указателями? Управление памятью с профсоюзами? Есть ли какой-то синтаксис C, который мне здесь не хватает?

Это может быть специфично для CMSIS. Кто-нибудь знает, что делает ": 1" в этих объявлениях структуры...? Я знаю, что __IO связан с некоторым определением CMSIS для чтения / записи.

ПОЛЕЗНЫЕ МАТЕРИАЛЫ, НАЙДЕННЫЕ ПОСЛЕ КОММЕНТАРИЙ И ОТВЕТОВ:

КОНВЕНЦИЯ О ПЕРИФЕРИЧЕСКОМ НАЗВАНИИ ARMS CMSCIS - Этот пример кода не выглядит слишком изящным...

BITFIELD COMPILER ARM ЗАМЕЧАНИЯ О СТРУКТУРАХ И СОЮЗАХ

/**
  * @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 ответ

Решение

Объединение позволяет получить доступ к аппаратному регистру в виде 32-битного слова или в виде битовых полей, содержащихся в регистре. Оба представления имеют свое применение. Возможно, вам не хватает синтаксиса битового поля, так как он не используется в большинстве программ прикладного уровня. Расположение битовых полей зависит от компилятора, но заголовки CMSIS созданы для работы с намеченными компиляторами.

Другие вопросы по тегам