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.
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. –
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? –
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). –