2016-10-19 15 views
0

私はSTM-32 Cortex-M4マイクロコントローラに含まれているcmsisヘッダーファイルを理解しようとしています。マイクロコントローラ上のアクセスレジスタへの構造体ポインタ?

((GPIO_TypeDef *) 0x08000) -> MODER = 0x12; 

私は、この行が何をしているか取得しない: 彼らは、例えば、書くこと、それは意味を成してい

typedef struct 
{ 
    __IO uint32_t MODER; /*!< GPIO port mode register,    Address offset: 0x00  */ 
    __IO uint32_t OTYPER; /*!< GPIO port output type register,  Address offset: 0x04  */ 
    __IO uint32_t OSPEEDR; /*!< GPIO port output speed register,  Address offset: 0x08  */ 
    __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C  */ 
    __IO uint32_t IDR;  /*!< GPIO port input data register,   Address offset: 0x10  */ 
    __IO uint32_t ODR;  /*!< GPIO port output data register,  Address offset: 0x14  */ 
    __IO uint16_t BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18  */ 
    __IO uint16_t BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A  */ 
    __IO uint32_t LCKR;  /*!< GPIO port configuration lock register, Address offset: 0x1C  */ 
    __IO uint32_t AFR[2]; /*!< GPIO alternate function registers,  Address offset: 0x20-0x24 */ 
} GPIO_TypeDef; 

である構造体を持っています。 あなたがそれをした場合、私にはもっと意味をなさないでしょう

GPIO_TypeDef * td = 0x08000; 
td -> MODER = 0x12; 

これらは同じですか?どうして?

+0

'(0x3 <<(2 * i))'は未定義の動作を呼び出すことができます。それがST-exampleのコードであれば、私はSTコードの品質について非常に心配しています(しかし、それほど驚くことはありません)。そして、MODERは(それが意味するところでは)「モードリセット」ではなく、GPIOモードレジスタです。あなたの問題が何であるかはっきりしていません。標準Cです。マクロは '((GPIO_TypeDef *)0x0C00)'に評価されません!最初にリファレンスマニュアルをお読みください。 – Olaf

+0

私はそれをより明確にするために編集しました。 – ben

+0

これは、Cプログラミング言語の操作以上のものではありません。目標は、その命令に供給される正しいアドレスとデータ値を持つ特定のマシン命令をコンパイラに生成させることです。構造体を使用することは、ちょうど最新のギフ・ウィズ・ファッションです。おそらく、以前の流行よりもタイピングが少ないでしょうか?それでも、コンパイラがあなたのために適切な命令を生成しないことがありますが、それは起こりました(しかし、非常にまれであり、要求に応じて起こることはありません)。バイナリを逆アセンブルすると、アドレスとデータがレジスタに格納され、この場合のストアが発生します。 –

答えて

1

GPIO_TypeDef structは、アドレスオフセットをエンコードするための巧妙なメカニズムです。したがって、基本GPIODアドレスへのポインタが与えられ、そのポインタをGPIO_TypeDef構造体ポインタにキャストする場合、標準のC参照演算子( - >)を使用して、ベースGPIODアドレスからあるオフセットでアドレスにアクセスできます。

したがって、GPIOD_BASE(AHB1PERIPH_BASE + 0x0C00)と評価され、MODERGPIO_TypeDef構造体ポインタから0x0のアドレスオフセットを持ちます。つまり、GPIOD_BASE->MODER(AHB1PERIPH_BASE + 0x0C00) + 0x00と評価されます。これは、GPIODのポートモードレジスタのアドレスにすぎません。

これは、GPIO_TypeDef構造体で定義されているすべてのフィールドで機能します。たとえば、GPIOD_BASE->PUPDRは、(AHB1PERIPH_BASE + 0x0C00) + 0x0Cと評価されます。これは、GPIODのプルアップ/プルダウンレジスタのアドレスに過ぎません。

+0

なぜdownvote?何かが間違っているか不明な点がある場合は、この回答を編集/明確にすることができます。 – pymaxion

+0

あなたの文章は実際には「構造体は巧妙なメカニズムです」と言っています。これは基本的なCと 'struct'が内部的にどのように動作するかです。この例や組み込みプログラミングに特有のものではありません。 – Olaf

+0

OPはこの構造体の機能を理解していないようです。彼は「私はこのラインが何をしているのか分からない」と言った。私は一般的な背景だけでなく、表現OPがどのように評価されているかの具体的な例を提供しています。 – pymaxion

関連する問題