【STM32H723ZG入門②】GPIO編|CubeMXでLチカ(LED点滅)してみる

スポンサーリンク

この記事でできること

  • CubeMXでGPIO設定できる
  • 自動生成コードの意味が分かる
  • HAL_GPIO_TogglePinが理解できる
  • LEDが点滅する

はじめに

ソフトウェア開発における組み込みC言語基礎力向上を図りたいgoldear@JiN_C125です
前回(開発環境構築編)はこちら:

【STM32H723ZG入門①】開発環境構築編 (CubeIDE/CubeMX)
この記事でできること STM32CubeIDEをインストールできる STM32CubeMXでプロジェクト生成できる ビルド〜書き込み〜実行までできる STM32開発の基本ワークフローを理解できるはじめに仕事はハードウェア開発でソフトウェア開...

前回はSTM32CubeIDE/CubeMXのインストール・プロジェクトの作成まで実施しました。今回は組み込み界のHelloWorld「Lチカ (LEDの点滅)」を実行します。まずは動かす!これが重要です。

全体の流れ

本記事では、STM32で「初めて動かす」ために、以下の流れで進めます。

  1. ピン確認 (回路図)
  2. CubeMXでGPIO設定
  3. コード生成
  4. main.cに追記
  5. 書き込み
  6. 点滅確認

Step1. ピン確認 (ボード仕様)

まず最初に、LEDがどのピンに接続されているかを確認します。

組み込み開発では、以下の順番で考えるのが基本です。
「回路図(ハード) → ソフト設定」

どのピンにLEDが接続されているか分からないままCubeMXを操作しても、正しい設定はできません。まず「ハードがどう繋がっているか」を理解することが、組み込み開発の第一歩です。

Nucleo STM32H723ZG のユーザーマニュアル(UM2407)を確認すると、LEDの接続先が以下のように記載されています。

NUCLEO-H723ZG | Product - STマイクロエレクトロニクス
The STM32 Nucleo-144 board provides an affordable and flexible way for users to try out new concepts and build prototype...

7.6.1 LEDs
User LD1: A green user LED is connected to the STM32H7 I/O PB0 (SB39 ON and SB47 OFF) or PA5 (SB47 ON and SB39 OFF) corresponding to the ST Zio D13.
User LD2: A yellow user LED is connected to PE1.
User LD3: A red user LED is connected to PB14.
These user LEDs are on when the I/O is HIGH value, and are off when the I/O is LOW.
引用:UM2407 STM32H7 Nucleo-144 boards (MB1364) p27

これらの記載から以下のピンアサインであることが分かります。

  • User LD1 → PB0
  • User LD2 → PE1
  • User LD3 → PB14

さらに回路図を見ると、実際にこれらのピンがLEDに接続されていることが確認できます。

つまり、PB0 / PE1 / PB14 をGPIO出力に設定すればLEDを制御できるということになります。なお、PA5 側は DNF(Do Not Fit:未実装)となっており実際には接続されていません。そのため、本ボードでは PB0 が LED を駆動するピンとして使用されます。

次のStepでは、これらのピンをCubeMXでGPIO出力に設定していきます。

Step2. CubeMX GPIO設定

次に、Step1で確認したピン(PB0 / PE1 / PB14)をCubeMXでGPIO出力に設定します。

やることはシンプルで、該当ピンをクリック →「GPIO_Output」を選択するだけです。

ここで重要なのが User Label の設定 です。Labelを付けない場合、生成されるコードは以下のようになります。

HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);

これでは「何のピンを操作しているのか」分かりにくくなります。そこで Label に GREEN_LED などの名前を付けると、

HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin);

のように意味のある名前でコードが生成されます。

可読性が向上し、将来ピン変更が発生しても修正箇所を最小限にできるため、必ずUser Labelを付けることをおすすめします。

Step3. コード生成

GPIO設定が完了したら、右上の「GENERATE CODE」をクリックしてコードを生成します。

CubeMXは、GUIで設定した内容をすべてCコードに自動変換してくれるツールです。

つまり、以下の内容がまとめて「プロジェクト一式」として出力されます。

  • ピン設定
  • クロック設定
  • 各種初期化

生成が完了すると、完了ダイアログがポップアップします。「Open Project」を選択することで、自動でSTM32CubeIDEが起動し、プロジェクトが開かれます。

プロジェクトのインポートが完了すると、上記のダイアログがポップアップします。ここからCubeIDEの作業に入ります。

GPIO設定はどこに反映される?

今回CubeMXで設定したGPIOは、Core/Src/gpio.c の MX_GPIO_Init() に生成されています。この関数の中に、「ピンのモード」「出力初期値」「速度設定」などがすべて書き出されています。

例えば、User LD1(PB0)の設定は以下のようなコードになります。

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();

/* 初期出力レベル設定(LOWで開始) */
HAL_GPIO_WritePin(GPIOB, GREEN_LED_Pin, GPIO_PIN_RESET);

/* PB0を出力モードに設定 */
GPIO_InitStruct.Pin   = GREEN_LED_Pin;
GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull  = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

このコードはすべてCubeMXが自動生成したものです。

CubeMX設定 → 自動でCコード生成 → そのまま動作

という流れになっています。

なお、gpio.c は「生成コード」なので、手動編集は基本的に行いません。設定変更がある場合は、必ずCubeMX側で修正 → 再生成するのが正しい使い方です。自分で書く処理は main.c の USER CODE ブロック内に記述します。

Step4. main.c に追記 (Lチカ)

コード生成ができたら、main.c にLED点滅処理を追加します。

STM32CubeMXで生成されたプロジェクトでは、自分のコードは USER CODE ブロック内に書くのが基本ルールです。(※ ブロック外に書くと、再生成時に消える可能性があります)

以下のように while(1) ループ内へ追記します。

while (1)
{
  /* USER CODE BEGIN WHILE */

  HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin);
  HAL_Delay(500);

  /* USER CODE END WHILE */
}

これで、User LD1(GREEN LED)が 0.5秒周期で点滅します。

コードの意味(最低限)

  • HAL_GPIO_TogglePin():指定したGPIOの出力を反転(HIGH⇔LOW)
  • HAL_Delay(500):500ms待つ(1ms単位の待ち時間)

次のStepで、ビルドしてボードへ書き込み、LEDが点滅することを確認します。

※ LEDが点滅しない場合は、ピン設定(PB0)やUser Label(GREEN_LED)が正しいかを確認してください。

Step5. ビルドと書き込み

前回の記事でもビルド方法を紹介しましたが、
今回は「自分のコードを書いて実機を動かす最初の実践ビルド」になります。

main.cにLチカコードを追加したら、
プロジェクトをビルドして開発ボードへ書き込みます。

ビルド

ツールバーのハンマーアイコン(Build)をクリックします。
エラーが出ずに Build Finished と表示されればビルド成功です。

書き込み(実行)

Nucleo開発ボードをUSBで接続した状態で、
ツールバーのRun(再生マーク) または Debug(虫マーク) をクリックします。

するとST-LINK経由でFlash書き込みが行われ、
そのままプログラムが実行されます。

初回のみ、STM32H7用のパッケージダウンロードやST-LINKファームウェア更新が走ることがありますが、
いずれも正常動作なので完了まで待てばOKです。

Step6. 点滅確認

書き込みが完了すると、プログラムは自動的に実行されます。設定が正しくできていれば、GREEN LED(PB0)が一定間隔で点滅します。



無事に点滅すれば成功です。これで STM32 + CubeMX + HAL を使った最初のプログラムが動作しました。いわゆる組み込み界の Hello World「Lチカ」達成です。

動かないときのチェックポイント

もし点滅しない場合は、以下を確認してください。
このどれかが原因の可能性が高いです。

  • PB0 を GPIO_Output に設定しているか
  • User Label(GREEN_LED)が正しく付いているか
  • main.c の USER CODE 内に処理を書いているか
  • ビルドエラーが出ていないか

まとめ

今回は STM32H723ZG Nucleo開発ボードを使って、組み込み開発の最初の一歩「Lチカ(LED点滅)」を実装しました。

実施した内容を振り返ると、

  • 回路図からLED接続ピンを確認
  • CubeMXでGPIO設定
  • コード自動生成
  • main.cのUSER CODEに処理を追記
  • ビルド → 書き込み → 動作確認

という、STM32開発の基本フローを一通り体験できました。最初は「難しそう…」と感じていたCubeMXやHALも、実際に触ってみると「設定 → 生成 → 少しコードを書く」だけで意外とシンプルです。まずは 「動かす」、これが何より大事。

次回は UART(シリアル通信)を使って、printfデバッグ(文字出力)に挑戦します。LEDの点滅だけでは内部の状態が分かりませんが、UARTを使えば以下ができるようになり実用的な開発が一気に楽になります。

  • ログ出力
  • センサ値表示
  • デバッグメッセージ確認

組み込み開発では必須スキルなので、「光」から「文字」へステップアップしていきましょう。

【STM32H723ZG入門③】UART送受信編 に続きます。

コメント