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 созданы для работы с намеченными компиляторами.