2017-01-28 5 views
0

Ich habe Code wie folgt:C Union, Padding von Array innerhalb der Struktur

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; 

dann

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; 

Struktur der GPIO verwenden Ich bin in der Lage Dann kann ich diese Definition wie folgt verwenden:

Gibt es eine Möglichkeit, das Array innerhalb der Struktur MODER_REG zu verwenden? Um die GPIO so benutzten:

GPIOA->MODER_REG.bit.MODER[0]=0x2; 

Wie sollte wie Definition von

struct MODER_BITS{ 
__IO uint32_t MODER[?]:? //options  
} 

PS aussieht: __IO ist nur ein Makro flüchtiger

Bitte Beratung.

+0

Hinweis zu schätzen, dass für die Kopfzeilen, die dem CMSIS-Standard folgen, müssen Sie nicht wissen, wo jedes Feld beginnt, da die Kopfzeilen individuelle Definitionen für jedes Bit bereitstellen. Wenn Sie also Bits des MODER9-Feldes setzen müssen, gibt es Definitionen wie 'GPIO_MODER_MODER9_0' und' GPIO_MODER_MODER9_1'. Dieser Standard wird für alle Register eingehalten. Darüber hinaus stellen neue Versionen der Header '..._ Pos'-Makros mit der Bitposition der Felder bereit - zum Beispiel' GPIO_MODER_MODER9_Pos' aus STM32F0-Headern. –

+0

Ja, ich bemerke, dass in der Stm32f411xe.h gibt es eine Definition dieser BITS, aber ich bevorzuge diese neue Version von Makro mit: GPIO_MODER_MODER9_Pos. Ich wusste nichts von dieser neuen Version. Vielen Dank ! Was halten Sie von dieser Lösung mit C++ Template und Std: Bitset? –

+0

Zu viel Arbeit für zu wenig Gewinn - meiner Meinung nach (; Ich denke in C++ sollten Sie nur Te-Register auf der niedrigsten Ebene und darüber verwenden einige höhere Schnittstellen. Mit diesem Ansatz ist der Treiber für die meisten Peripheriegeräte ziemlich kurz trotzdem, und ob Sie 'GPIOA-> MODER_REG.bit.MODER [0] = 0x2;' oder 'gpioSetModer (GPIOA, 0, 0x02) verwenden;' ist nichts anderes als ein Formatierungsunterschied (wieder - meiner Meinung nach). –

Antwort

3

Es gibt keinen Weg. C erlaubt keine Arrays von Bits.

Sie können jedoch immer noch das ursprüngliche Wort zugreifen, indem Sie mit bitmask:

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

Der erste Teil setzt die Bits an der Position 0, im zweiten Teil wird dann 2.

+0

Ok, das heißt, es gibt kein sens, das so verwendet wird, weil ursprünglich: __IO uint32_t MODER; Ich möchte nur vermeiden zu überprüfen, von wo die Bits gestartet werden in Referenzhandbuch –

+0

@MateuszTocha - Ein Makro oder eine Funktion ist der Zugriff auf die Bits ist Genau so klar wie ein benanntes Mitglied. – StoryTeller

+0

Was ist mit C++? –

Verwandte Themen