ArmマイコンにTRY2 GPIO入力制御を試してみる


写真はNECLEO STM32F446RE評価ボードで、プログラム作成にTRY。開発過程や疑問点など開発ノートにまとめて置くと、あとでとても参考になります。

2023.8.31

はじめに
 「ARMマイコンにTRY2」では、GPIO入出力制御にTRYです。
 トランシーバーにマイコンを組み込み、SW入力に応じてリレー等の制御は最も基本的なソフトになります。今回はGPIOのH/LによりLED ON/OFF、入力割り込みによる LED制御を試してみます。

プロジェクトの作成、コード生成
-1.「Lチカ」でのプロジェクト作成手順に同じですが、プロジェクト名は適当に「renshyuGPIO」とします。
-2.続いて、ピン配置の設定。PA5をGPIO_output、PC13をGPIO_inputに設定、デフォルト状態では、それ以外のピンも設定されていますが、reset_stateにします。
-3.続いて、Categories欄をクリックsystem > GPIO 選択で設定内容を確認、PC13はinput nopullupになっています。
-4.次にメニュー欄のコード生成ボタン(歯車マーク)をクリックで、ひな型コードが表示されます。
NUCLEOの回路図ではPC13にSW(青色ボタン)とプルアップ抵抗、チャタリング吸収回路が実装してあるので、外付け回路は不要です。

  ソースコードの記述

 ひな型ソースの/* User code Begin3 */ 〜 /* User code End3 */ の間に今回のソース(98行目から111行目)を記述します。
内容は、GPIO PC13のH/L状態に応じて、LEDは1sec間隔で点滅叉は、0.3sec間隔で点滅させてみます。
 次に、ビルド(トンカチマークアイコン)をクリックしてエラーがなければ、PCとボードをUSB接続してRunをクリックすればプログラムが書き込まれLED点滅がSWを押している間変化すれば成功です。
 if () { }を使用する際に"}"を忘れたり、余分に付けたりすると、全く関係の無い箇所でビルドエラーメッセージがでるので気を付けます、叉条件判定で" == "を使うところをうっかり" = "に したり、If ( )の最後に";"を付けたりするうっかりミスも気を付けます。

 

GPIO割り込み入力で使ってみる

 トランシーバーに実装する場合、送受信切り替えは、他の処理に優先して処理するので、割り込み処理を使います。次は割り込み処理にTRYです。
  -1.Project ExplorerをWクリックして、IC端子配置図を開き、PC13の端子機能をGPIO InputからGPIO_EXTI13に選択変更する。PA5は変更無し、output。
-2.続いて、System CoreのGPIOをクリックして、Configration欄 PC13を選択しmode設定をします。ここでは割り込み検出立ち下がりエッジ、プルアップ/プルダウン無し
-3.続いて、Categories欄をクリックsystem > GPIO 選択で設定内容を確認、PC13はinput nopullupになっています。
-4.続いて、左図System CoreのNVIC(割り込みコントローラー)をクリックし、NVIC Interupt TabeのEXTIl line〜の割り込みEnableにし、
-5.次に割り込み優先度の設定を0から1に下げるのに、Priority Group欄を0から1bit、Preemption欄を0から1にします。
-6.次にメニュー欄のコード生成ボタン(歯車マーク)をクリックで、ひな型コードが表示されます。
補足説明、割り込みCallBack関数の中でDelay関数を使う場合、割り込み処理が競合しないようGPIOの割り込み優先度を下げておかないとメインに戻らなくなります。

 

生成されたソースコードを見てみる

 Project ExplorerのCore > Src > stm32fxx_it.c > openで、209行付近に"HAL_GPIO_EXTI〜"があるので、右クリックして"Open Declaratio"とすると、ソースコードの全容 が表示されます。
 割り込みにより、__weak void HAL_GPIO_EXTI_CallBack()関数を呼び出していますので、このなかに割り込み処理を記述しても良さそうですが、__weakがついているのでmain.c にvoid HAL_GPIO_EXTI_CallBack()関数を記述します。
補足説明、__weakが付いている関数は、他に同一名の関数があれば__weakの無い関数処理が優先される。

 

ソースコードの記述

 ひな型ソースの/* User code Begin4 */ 〜 /* User code End4 */ の間に、コードを挿入します。今回はSWを押す毎に割り込みでLED表示がトグル動作します。先に作成したuser coe3の内容は 不要なので削除します。
 関数内のDelayは、割り込み優先動作の確認用です。割り込み優先度を0にするとmainに戻らなくなるのが確認できます。
 当初、割り込み処理の中でDelayを使うとmain.cに戻らなくなるトラブル解決が判らず、随分悩みました。HALマニアル、HAL_Delay()の項には割り込みを使っているという記述がありますが 他の割り込みと競合するという理解には至りませんでした。

 

今後の進め方
 ようやく、GPIOの割り込み確認まできましたが、先は長くSDR用ソフト完成までライフワークになりそう。次回は、DAコンバーターにTRYです。

Lチカに戻る
DAを使うへ
   Top Menu