2017-01-28 15 views
0

内部配列のパディングが、私は以下のようにコードを持っている:C・ユニオン、構造体

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; 

構造体MODER_REG内で配列を使用する方法はありますか?このようにGPIOを使用するには:

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

する

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

PSの定義のように見えるどのようにすべきである: __ioは

揮発してくださいアドバイスだけのマクロです。

+0

注値にヘッダーは各ビットに個別の定義を提供するので、各フィールドの開始位置を知る必要はありません。したがって、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の部分集合は、その後のためにその2

+0

)。 __IO uint32_t MODER;参考マニュアルでビットがどこから始まっているのかをチェックしたくないだけです。 –

+0

@MateuszTocha - マクロや関数がビットにアクセスするのは、次のようなものです。 – StoryTeller

+0

C++はどうですか? –

関連する問題