2017-01-28 52 views
0

我有如下代碼:Ç聯盟,結構內部陣列的填充

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只是一種揮發性

請諮詢宏。

+0

注意,對於頭標遵循CMSIS標準,您不需要知道每個字段的起始位置,因爲頭文件爲每個位提供單獨的定義。因此,如果您需要設置MODER9字段的位,將會有一個像GPIO_MODER_MODER9_0和GPIO_MODER_MODER9_1這樣的定義。所有寄存器均遵循此標準。此外,新版本的頭文件提供'... Pos'宏的字段位置 - 例如STM32F0頭文件中的'GPIO_MODER_MODER9_Pos'。 –

+0

是的,我注意到在stm32f411xe.h裏面有這個BITS的定義,但我更喜歡這個新版本的宏:GPIO_MODER_MODER9_Pos。我不知道這個新版本。謝謝 !您對C++模板和std:bitset的解決方案有何看法? –

+0

太多的工作得不到太多的收益 - 在我看來(我認爲在C++中,你應該在最低級別使用te寄存器,並且使用一些更高級別的接口,通過這種方法,大多數外設的驅動程序非常短無論如何,以及是否使用'GPIOA-> MODER_REG.bit.MODER [0] = 0x2;''或'gpioSetModer(GPIOA,0,0x02);'只不過是一種格式差異(再次 - 在我看來) –

回答

3

沒有辦法。 C不允許位數組。

但是,仍可以通過使用位掩碼訪問原始字:

GPIOA->MODER_REG.all = (GPIOA->MODER_REG.all)&(~3<<0)|(2<<0); 

第一部分復位在位置0的位,第二部分套再到值2

+0

好吧,這意味着沒有什麼靈敏的使用這樣的,因爲原來是這樣的:__IO uint32_t MODER;我只是想避免檢查參考手冊中位的起始位置 –

+0

@MateuszTocha - 宏或函數訪問位是就像一個有名的成員一樣清晰。 – StoryTeller

+0

C++怎麼樣? –