IDEに頼らないコードを書きたい!
STM32CubeIDEでのプログラム作成はとても便利です。
使う機能やピン、クロックの設定を調べなくても使うことができます。
しかしあのmain.cの冗長なコードがやはり見づらいです。
何より各レジスタの仕様を把握し、自分で設定をしたいとも思います。
今はまだ基本的なGPIO設定のみですが、各レジスタの仕様と設定内容を記していこうと思います。
この記事で扱うSTM32のシリーズはSTM32G030シリーズになります。
特にGPIO関連ではCortex-M0とM3、M4で異なる点があるのでご留意ください。
GPIOレジスタ
RCC->IOPENR
IOペリフェラルEnable Register
各GPIOポートにクロックを供給し、有効化します。
GPIOx->OSPEEDR
GPIOの出力スピードの設定
0x0~0x3のいずれかが有効な値になります。
速度はリファレンスマニュアルではなく、データシート側で確認します。
STM32G030シリーズではLow(00)で最大2MHz、VeryHigh(11)で最大60MHzと表記されていました。
GPIOx->OYTPER
GPIOの出力モードの設定
初期値は0でプッシュプル。1を立てるとオープンドレインになります。
GPIOx->PUPDR
GPIOのプルアップ・ダウン・無効を設定します
0x0~0x2のいずれかを設定します。0x3は予約済。
GPIOx->MODER
GPIO機能の設定をします。
入力・出力・オルタネート(SPIやTIMなど)・アナログのどれにするかをこのレジスタで決めます。
基本的にすべてのポート(GPIOx)で初期値が00で、入力モードになっています。
しかしSWDを含むポート(GPIOAなど)では異なる設定値になっています。
またSWDデバッグを行う際にはこの設定値も保持するよう注意しないといけません。
gpio.h
gpio.h上に上記GPIOx関連のレジスタを操作する関数を作った例です。
私は普段LLライブラリを使うことが多いのですが、CortexM0環境のLL_GPIOライブラリは少々複雑です。
上がstm32g0xx_ll_gpio.hのもの。下がstm32f4xx_ll_gpio.hのものです。
CortexM0にはPOSITION_VAL()マクロを構成する__CLZと__RBIT命令が存在していないことからこのような違いになっています。
POSITION_VAL(x)はxピンが何番目のピンか?という情報を取得するものです。
例えばPA5ピンであれば(1 << 5)ですので、5番目のピンです。
以下のgpio.hのコードにおいては、PinPosとしての情報のみをもらうようにすることでM4シリーズのコードに似せるようにしています。
gpio.c
上記インライン関数群を呼び出すだけの関数を定義しています。
単純な入力・出力の設定のみです。
おわりに
今後はRCCの設定やオルタネート機能についても見ていきたいと思っています。
今回提示したgpio関連のファイルは以下のGitHubのレポジトリにもありますので、良ければ参考にしてください。
0 件のコメント:
コメントを投稿