我有如下代碼:Ç聯盟,結構內部陣列的填充
struct MODER_BITS
{ __IO uint32_t MODER0:2;
__IO uint32_t MODER1:2;
__IO uint32_t MODER2:2;
__IO uint32_t MODER3:2;
__IO uint32_t MODER4:2;
__IO uint32_t MODER5:2;
__IO uint32_t MODER6:2;
__IO uint32_t MODER7:2;
__IO uint32_t MODER8:2;
__IO uint32_t MODER9:2;
__IO uint32_t MODER10:2;
__IO uint32_t MODER11:2;
__IO uint32_t MODER12:2;
__IO uint32_t MODER13:2;
__IO uint32_t MODER14:2;
__IO uint32_t MODER15:2;
};
typedef union {
__IO uint32_t all;
struct MODER_BITS bit;
}MODER_REG;
然後我可以使用GPIO結構
typedef struct
{
MODER_REG MODER_REG;
//__IO uint32_t MODER ;/*!< GPIO port mode register,
__IO uint32_t OTYPER; /*!< GPIO port output type register, */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, */
__IO uint32_t IDR; /*!< GPIO port input data register, */
__IO uint32_t ODR; /*!< GPIO port output data register, */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset register, */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, */
__IO uint32_t AFR[2]; /*!< GPIO alternate function registers, */
} GPIO_TypeDef;
那麼我可以用這個定義是這樣的:
GPIOA->MODER_REG.bit.MODER0=0x2;
是否有一些方法來使用struct MODER_REG內的數組?要使用的GPIO這樣的:
GPIOA->MODER_REG.bit.MODER[0]=0x2;
應該如何看起來像
struct MODER_BITS{
__IO uint32_t MODER[?]:? //options
}
PS的定義: __IO只是一種揮發性
請諮詢宏。
注意,對於頭標遵循CMSIS標準,您不需要知道每個字段的起始位置,因爲頭文件爲每個位提供單獨的定義。因此,如果您需要設置MODER9字段的位,將會有一個像GPIO_MODER_MODER9_0和GPIO_MODER_MODER9_1這樣的定義。所有寄存器均遵循此標準。此外,新版本的頭文件提供'... Pos'宏的字段位置 - 例如STM32F0頭文件中的'GPIO_MODER_MODER9_Pos'。 –
是的,我注意到在stm32f411xe.h裏面有這個BITS的定義,但我更喜歡這個新版本的宏:GPIO_MODER_MODER9_Pos。我不知道這個新版本。謝謝 !您對C++模板和std:bitset的解決方案有何看法? –
太多的工作得不到太多的收益 - 在我看來(我認爲在C++中,你應該在最低級別使用te寄存器,並且使用一些更高級別的接口,通過這種方法,大多數外設的驅動程序非常短無論如何,以及是否使用'GPIOA-> MODER_REG.bit.MODER [0] = 0x2;''或'gpioSetModer(GPIOA,0,0x02);'只不過是一種格式差異(再次 - 在我看來) –