STM32三昧(1) Cube IDEでHello World+GPIO入力、Nucleo

Joseph Halfmoon

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シリアルへの接続
F072RBが搭載しているUSARTのうちUSART2がST-LINKを介してホストPCの仮想COMポートに接続されてます。使用している端子は、TXがPA2、RXがPA3です。
Cube IDEで、ターゲットボードをNucleo-F072RBに設定しただけで、上記の設定は既に反映された状態でプロジェクトが作成されます。まずユーザボタンのところはこんな感じ。USER_BUTTON

USART2とLEDの端子が以下に。

流石、メーカ純正ツール、至れり尽くせり。とてもお楽。間違いない。

さらに、USART2については既に初期設定まで以下のようなパラメータで自動でやってくれてました。ちゃんと非同期設定。そしてボーレートは38400とな。USART2Config

「Generate」すると、ここまでの初期設定を行ってくれるコードが自動生成されるので「その先」を書けばよいっと。

printfをUSART2へ接続

しかし「伝統のprintfデバッグ」を行うために(Cube IDEの場合、ST-LINKが使えるので、printfなど使わなくてもデバッグできるケド)printfを上記のUSART2に向けておきたいです。そこのつなぎ方を調べていたら、いつもお世話になっておりますDigiKey様の以下のページにバッチリ書いてありました。あざーす。

STM32でprintfを簡単に使う

まずはインクルードのところで、stdio.hも取り込んでおけ、と。printfするので当然か。stdio

つづいて1文字出力の行き先をHALのAPIでhuart2へ向けろと(DigiKey様のサンプルコードではhuart?になっているので、ターゲットのペリフェラル毎に異なる番号にせにゃなりません。)PFP

これでprintfすると、USART2を経由して送られるようになるっと。なおDigiKey様の記事ではその先の浮動小数点数の扱いについても述べられています。F401とかF446とかArm Cortex-M4F搭載のSTM32であれば浮動小数使うでしょうが、F072RBは使わないのでそこはパス。

今回実験のmain()関数

さて、今回実験の関数はショボいです。

    1. ユーザーボタンを押したことをソフトウエアのポーリングで検出
    2. 押されていたらUSBシリアルに “Hello World.” と挨拶する
    3. ついでにLD2のユーザLEDを一発ちかっと光らせる

こんだけ。でもGPIO関係のHALのAPI関数にはお世話にならずばいられません。GPIOのHAL関数や定数などは、以下の stm32f0xx_hal_gpio.h に列挙されているのでそれを見ながらmain()関数に書き込んでいきます。

GPIO_PinState_enum

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がやってきます。printSTDIO

まあ、HALの練習、最初の一歩?

鳥なき里のマイコン屋(175) STM32、Cube IDEをインストールで吉例Lチカ へ戻る

STM32三昧(2) Cube IDEでGPIOから割り込み、Nucleo へ進む