私は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;
これらは同じですか?どうして?
'(0x3 <<(2 * i))'は未定義の動作を呼び出すことができます。それがST-exampleのコードであれば、私はSTコードの品質について非常に心配しています(しかし、それほど驚くことはありません)。そして、MODERは(それが意味するところでは)「モードリセット」ではなく、GPIOモードレジスタです。あなたの問題が何であるかはっきりしていません。標準Cです。マクロは '((GPIO_TypeDef *)0x0C00)'に評価されません!最初にリファレンスマニュアルをお読みください。 – Olaf
私はそれをより明確にするために編集しました。 – ben
これは、Cプログラミング言語の操作以上のものではありません。目標は、その命令に供給される正しいアドレスとデータ値を持つ特定のマシン命令をコンパイラに生成させることです。構造体を使用することは、ちょうど最新のギフ・ウィズ・ファッションです。おそらく、以前の流行よりもタイピングが少ないでしょうか?それでも、コンパイラがあなたのために適切な命令を生成しないことがありますが、それは起こりました(しかし、非常にまれであり、要求に応じて起こることはありません)。バイナリを逆アセンブルすると、アドレスとデータがレジスタに格納され、この場合のストアが発生します。 –