GPIO(2)


mbed osを使用せずにレジストリに直接アクセスして操作する場合は、データテーブルまたはリファレンスマニュアルを参照してください.
  • https://www.st.com/resource/en/datasheet/stm32f411re.pdf
  • https://www.st.com/resource/en/reference_manual/dm00119316-stm32f411xce-advanced-armbased-32bit-mcus-stmicroelectronics.pdf
  • GPIO register


    ポートはGPIOAからGPIOHの間に存在する.
    上のデータテーブルのメモリ部分の断面図です.
    これはGPIOのベースアドレスです.
    GPIOレジスタの全体構成は手動8.4.11である.
    base addressに最も近い場所にport mode registerが存在します.(GPIOx->MODER)
    このポートの数番ピンの用途を初期化するレジスタ.
    00はinput,01はoutput,10はalternative function mode,11はシミュレーションモードである.
    リセットすると、ほとんどのpinのdefaultはinputモードです.(PA 13、PB 3、PB 4を除く…)

    output type register(GPIOx->OTYPER)
    push-pull mode/open-draw.

    output speed register (GPIOx->OSPEEDR)
    オン/オフの速度を決定します.
    00 low speed, 01 medium speed, 10 fast speed, 11 high speed
    pull-up pull-down register(GPIOx->PUPDR)
    00 no pull-up/pull-down, 01 pull up, 10 pull-down

    input data register(GPIOx->IDR)
    単語単位でアクセスできます.読み取り専用レジスタです.

    output data register(GPIOx->ODR)
    GPIO出力モードでは、このレジスタに使えばいいです.
    ここでの入力と出力は別々であるが,多くのプロセッサはIDRとODRを区別せず,物理的に異なるアドレスを用いる.したがって,主にvolatileを用いる.

    bit set/reset register(GPIOx->BSRR)
    この文章の下部の画像を見て、Bit set/resetレジスタの信号を通ってoutput dataレジスタに入ります.
    これは、ピンの値を再設定することを意味します.プログラム作成時にピン値をリセットする必要がある場合は、BSRRレジスタにリセットできます.

    configuration lock register(GPIOx->LCKR)
    誤って値を変更しないようにロックします.


    例えば、PA 5を出力モードに設定するには、
    __HAL_RCC_GPIOA_CLK_ENABLE()
    GPIOA->MODER &= ~(0b11 << 10);
    GPIOA->MODER |= (0b01 << 10);
    時計を間違えると回路基板が壊れてしまうので、時計はライブラリを使いました.MODERは01をPA 5番ビットに書き込む必要があり、元の値が10であればor演算時は11となる.したがって、元の値を00に設定し、or演算10に設定します.論理設計、コンピュータ構造の後、bit演算やバイナリ、16進数を使うことはほとんどないので、うろうろしていたが、0 b 11はバイナリが11、0 b 11<10は11の後に10個の0を加えた.MODERレジスタデータテーブルによると、PA 5は11,10を使用するため、10回右シフトした.(0 b 11<10)であれば、11+(010個)ではないので、00+(110個)となり、and演算が行われるため、11,10回のみビットが0に初期化される.

    GPIO via register LAB


    レジスタを使用してuser buttonを押すたびにLED 2の点滅率が変化するプログラムを制御します.
    https://github.com/jacinder/embeeded_PA/blob/main/GPIO/GPIO%20In%20&%20Out.cpp