前回、前々回とArduinoボード上でのタイマ割り込みのプログラムをGemini様に生成いただきました。結果をみると UNO R3ボード向けにはコピペしてビルドしてボード上で動作できるソースが生成された反面、UNO R4ボード向けにはダメダメでした。今回はSTM32マイコンをターゲットに同じことをお願いしてみます。
※Google様の生成AI、Gemini(無料プランだけれども)を使ってソフトをコーディングしてもらっています。
プロンプトへの問いかけ
プロンプトへの最初の問いかけは以下のように茫漠とした問いかけです。
STM32マイコンで1ms毎にタイマで割り込みをするプログラムを書いて
上記のような茫漠とした問いかけに対し、Gemini様が
-
- STM32でもどんな機種向けに回答してくるか
- 数ある開発環境でもどれ向けのソースを作製していただけるか
に関心があったのです。
STMicroElectronics社のSTM32マイコンは、Armコアを搭載した組み込み用のFlashマイコンです。組み込み業界では5本の指に入るST社の主力機種だけあり、数百(もしかするともっと)もの品種があり、お手軽に使える開発ボードも多数販売されています。当然、品種によって搭載されているペリフェラルやメモリ容量、速度その他バリエーションは多数。ただしSTM32の場合、品種ごとのソフトウエア互換性をとりやすくするために、例えばTIMER6と指定すれば、どの品種でも機能がほぼほぼ互換となるように設定されてます(無いペリフェラルは無いけど。)
また、ソフトウエア統合開発環境(IDE)も多数存在します。サードパーティ製の有料開発環境を除き、無料の開発環境に絞ると、以下の3つくらいが人気ではないかと思われます(その他にもあるけど。)
-
- STM32 Cube IDE
- MbedOS
- Arduino
最初の STM32 Cube IDEは、御本家STMicroElectronics社の純正IDEで、STM32の数多い品種のこれまた数多い周辺回路などを十二分に活用するにはこれ、という感じの開発環境です。近代的なIDEで、ハードウエアを使い切るためにIDE内の設定機能を駆使することで各種API機能などを提供するソース類を自動生成できたりします。ベアメタル環境上のソフトウエアをスクラッチから自前で書くのは大変なので、これなしにはやってられない感じっす。
2番目のMbedOSは、Armコアの御本家、英Arm社が提供するリアルタイムOS環境です。Web上のオンライン開発に対応、スタンドアロンのローカル環境での開発も可能です。リアルタイムOS前提でソフトウエアが開発できるので、面倒な部分はOSにお任せで行けます。また、Armコアを搭載する各社マイコンでの互換性も考えられているので、MbedOSの提供するAPIでソフトウエアを作れば、チップが変わってもソフトの載せ替えはお楽。
3番目のArduino環境は、前回、前々回同様のArduino式のC++に一枚かぶせた環境です。STM32シリーズの開発ボードの中でも、Nucleoというお名前をもったボードが多数あり、これらにはArduino互換のピンソケットが搭載されており、Arduino的にも使えます。ただし、STM32の一部の端子縛りで使うことになるので、折角のSTM32の機能を使いきれるとは言えねーです。
Gemini様からのご回答
Gemini様のご回答をかいつまむとざっくり以下のような感じでした。
-
- 案1、ターゲット機種はSTM32F103C8T6 開発環境は STM32CubeMX。ソースで制御対象にしているのはTIMER2
- 案2、ターゲット機種の記載なし、開発環境の記載なし。使用するタイマとして基本タイマ(TIM2, TIM3, TIM4, TIM5, TIM6, TIM7)の記述あり。ソースで制御対象にしているのはTIMER2
- 案3、ターゲット機種の記載なし、STM32CubeMXのプロジェクト作成手順から解説いただいている。ソースで制御対象にしているのはTIMER6
コマケー話をすると、STM32 Cubeというお名前のIDE(統合開発環境)の中に含まれるGUIツールに STM32 Cube MXというお名前がついているのだと思います。このGUIを使って、初期化やAPIのためのソースを生成してもらうわけです。案1から案3とも記述をみているとSTM32 Cubeを想定しているように見えるので一応、当方想定通り。またターゲット機種も当方手持ちの機種ではないのですが、当方手持ちの機種に容易に載せ替え可能にみえます。
しかし、案1から案3ともソースをコピペしてOKとはいかないように思いました。案1から案3とも割り込みハンドラ部分とmain関数が一本のソースにまとまっていて、簡潔でそれっぽいのです。でも、STM32 Cube MXで初期設定ルーチンやAPIソースなどを生成した場合、多数のソースに分かれた多数の関数が生成され、それを適切な場所で呼び出してやらないとならんのです。また、STM32 Cube IDEには独特の「コメント」ルールがあり、ユーザーコードを書くことができる場所がコメントとコメントの間で決まってます。これはSTM32 Cube MXで設定をちょっと変更してコードを再生成するときに、ユーザーコードを消してしまうことを防ぐための仕組みと理解しています。再生成しないと決めればコメントを踏みつぶして単純コピペでも良いのですが、やらない方が身のためかと。
Gemini様のご回答を拝見するに、断片的にはそれっぽいコードを生成してくれているのだけれども、STM32 Cube MX の生成するコードとの整合がとれてない感じです。唯一、案3が設定手順から説き起こしているので、分かり易いかなと思いますけど。
なお、タイマ6を使用した割り込みハンドラの利用例は、別件シリーズの以下記事にて、Cube MXでの初期化+人力コーディング で実機動作までやってみてます。
STM32三昧(5) Cube IDEでTIMER6割り込み、Nucleo
Gemini様は、実際にSTM32 Cubeのようなソフトウエアをエクササイズして確認できるわけじゃないと思うので、開発環境やライブラリ依存のところは結構ムツカシそうです。結構、改版も多かったりするし。