STMicroelectronics社純正開発環境Cube IDEを別件にて再インストール。Cube IDEとSTM32マイコンのHALを練習するためにシリーズ「STM32三昧」始めることにいたしました。それにしてもHAL充実、つまりはAPI多すぎ。まず今回はGPIO入力とprintfを使えるようにするところから。
※Windows 11 PC上にインストールしたSTM32CubeIDE Version: 1.13.2上で動作を確認しています。
※今回ターゲットにしたのはSTMicroelectronics社の開発ボード Nucleo-F072RBです。数あるNucleoシリーズの中でも比較的「低スペック」なボードです。まずは基本的なところから。
NucleoボードのオンボードLED、スイッチ、USBシリアル
随分お世話になっている気がするNucleoボードですが、まずはボード上で使用可能なユーザリソースの確認から。ボードのデータシートを読めば書いてあることですが念のため。
-
- LED
ボード上には3個のLEDが搭載されていますが、ユーザプログラムで使えるLEDは、LD2 というお名前のGREENのLED1個です。F072RBのGA5番端子に接続、ハイ出力で点灯、ロウで消灯です。なお3色のカラフルなLEDはST-LINKの制御マイコン側でお使いです。またLD3の赤LEDはパワー表示です。
-
- プッシュスイッチ
ボード上、2個のプッシュスイッチが搭載されています。黒はRESETボタンなので、ユーザプログラムで使えるのは青のB1ボタンです。F072RBのPC13番端子に接続されています。プッシュするとロウです。
-
- USBシリアルへの接続
USART2とLEDの端子が以下に。
流石、メーカ純正ツール、至れり尽くせり。とてもお楽。間違いない。
さらに、USART2については既に初期設定まで以下のようなパラメータで自動でやってくれてました。ちゃんと非同期設定。そしてボーレートは38400とな。
「Generate」すると、ここまでの初期設定を行ってくれるコードが自動生成されるので「その先」を書けばよいっと。
printfをUSART2へ接続
しかし「伝統のprintfデバッグ」を行うために(Cube IDEの場合、ST-LINKが使えるので、printfなど使わなくてもデバッグできるケド)printfを上記のUSART2に向けておきたいです。そこのつなぎ方を調べていたら、いつもお世話になっておりますDigiKey様の以下のページにバッチリ書いてありました。あざーす。
まずはインクルードのところで、stdio.hも取り込んでおけ、と。printfするので当然か。
つづいて1文字出力の行き先をHALのAPIでhuart2へ向けろと(DigiKey様のサンプルコードではhuart?になっているので、ターゲットのペリフェラル毎に異なる番号にせにゃなりません。)
これでprintfすると、USART2を経由して送られるようになるっと。なおDigiKey様の記事ではその先の浮動小数点数の扱いについても述べられています。F401とかF446とかArm Cortex-M4F搭載のSTM32であれば浮動小数使うでしょうが、F072RBは使わないのでそこはパス。
今回実験のmain()関数
さて、今回実験の関数はショボいです。
-
- ユーザーボタンを押したことをソフトウエアのポーリングで検出
- 押されていたらUSBシリアルに “Hello World.” と挨拶する
- ついでにLD2のユーザLEDを一発ちかっと光らせる
こんだけ。でもGPIO関係のHALのAPI関数にはお世話にならずばいられません。GPIOのHAL関数や定数などは、以下の stm32f0xx_hal_gpio.h に列挙されているのでそれを見ながらmain()関数に書き込んでいきます。
main()関数の中の無限ループ部分のコードが以下に。上記のGPIO_PinState列挙子使ってみましたぜ。
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf("Hello world.\n"); if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)==GPIO_PIN_RESET) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); HAL_Delay(200); } HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); } /* USER CODE END 3 */
printf以外はHAL、HAL、HALで書けました。
ビルドして実行
プロジェクトをビルドして、USB接続したNucleo-F072RBボード上でRUNすればこんな感じ。青のユーザボタンを押す度にLD2がチカっと輝き、仮想シリアルポートに接続したTeratermにはHello Worldがやってきます。
まあ、HALの練習、最初の一歩?