Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】How to Program STM32 with STM32CubeIDE - The Complete Guide

2025年09月18日に「Dev.to」が公開したITニュース「How to Program STM32 with STM32CubeIDE - The Complete Guide」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

STM32CubeIDEを使ったSTM32マイコン開発の完全ガイド。ARM Cortex-MベースのSTM32をC言語でプログラミングする方法を解説。IDEでのプロジェクト作成、周辺機器設定、コード生成、HALドライバでのコーディング、ビルド、デバッグまでの一連の流れを初心者向けに紹介する。

ITニュース解説

組み込みシステム開発に興味を持つシステムエンジニアの皆さん、今回はマイクロコントローラ「STM32」のプログラミングについて、基礎から実践的なワークフローまでを解説する。STM32はSTMicroelectronics社が開発した32ビットの高性能マイコンファミリーで、家電製品から産業機器まで幅広い分野で利用されている。CPUにはARM Cortex-Mシリーズのコアが使われ、アナログ変換器(ADC/DAC)、タイマー、各種通信インターフェース(SPI、I²C、UART、USB、CAN、Ethernetなど)といった豊富な周辺機器を内蔵していることが特徴だ。多種多様なモデルが存在するため、用途に応じて最適なチップを選べる柔軟性も魅力の一つと言える。

STM32を使った開発を進める上で、いくつか準備すべきものがある。まず、最も重要なプログラミング言語はC言語が推奨される。ポインタやヘッダ、ビルドシステムの基本を学ぶことは必須だ。ハードウェアとしては、ST-LINKという書き込み・デバッグツールが内蔵された「Nucleo」や「Discovery」ボードの使用が初心者には特に勧められる。これらは別途プログラマを用意する必要がなく、すぐに開発を始められるため非常に便利だ。もしBluePillのような汎用ボードや自作基板を使用する場合は、外部のST-LINK/V2を用意し、ボードとPCを接続する必要がある。また、ドキュメントも開発において不可欠な要素となる。チップの電気的特性やピン配置が書かれた「データシート」、周辺機器のレジスタや動作が詳細に記された「リファレンスマニュアル」、ボードのピン配置やLED/ボタンのラベルを示す「ボードユーザーマニュアル」は、手元に置いておくべき重要な資料だ。全てを暗記する必要はないが、必要な情報がどこに書かれているかを知っておくことが、効率的な開発には繋がる。

開発環境としては、無料で提供されている統合開発環境(IDE)「STM32CubeIDE」が非常に強力だ。これは、EclipseベースのIDEに、グラフィカルな設定ツールであるCubeMX、C言語コンパイラ(GCC)、デバッガ(GDB)、そしてST-LINK用のツールが一体となってインストールされる。このIDE一つで、MCUやボードの選択、ピン配置や周辺機器の設定、コードの自動生成、そしてコンパイル、書き込み、デバッグまでの一連の作業を完結させられる。

プログラミングの手法にはいくつか選択肢があるが、初心者の皆さんには「HAL(Hardware Abstraction Layer)ドライバ」の使用を強くお勧めする。HALドライバは、ハードウェアの細かい設定を抽象化し、分かりやすい高レベルなAPI(関数)を提供する。これにより、プロトタイプの開発が迅速に進み、豊富なサンプルコードも利用できるため、学習コストを抑えられる。より低レベルな制御が必要な場合は「LL(Low-Layer)ドライバ」や直接レジスタを操作する「ベアメタル」方式もあるが、これらはパフォーマンスが求められる場面や、上級者向けの選択肢となる。

STM32CubeIDEを使った具体的な開発ワークフローは次のようになる。まず、STのウェブサイトからSTM32CubeIDEをダウンロードし、デフォルト設定でインストールする。次に、「ファイル」メニューから「新規」→「STM32プロジェクト」を選択し、ボードセレクタで実際に使用するボード(例:NUCLEO-L053R8)を選び、プロジェクト名を設定して完了する。この際、「Initialize all peripherals with default」を受け入れると、ボードの基本的な設定が自動的に行われる。

プロジェクト作成後、IDE内に統合された「デバイス設定ツール」(CubeMX)が開く。ここで、プロジェクトに必要な周辺機器(GPIO、UART、I²C、SPI、タイマーなど)をグラフィカルに設定する。ピンの割り当ては自動的に行われるが、必要に応じて手動で変更も可能だ。クロック設定タブでは、外部クリスタルを使用する場合や、特定の周辺機器に合わせたクロック周波数の調整を行う。また、「プロジェクトマネージャー」タブの「コードジェネレータ」設定で「Generate peripheral initialization as a pair of .c/.h per peripheral」にチェックを入れると、各周辺機器の初期化コードが独立した.cと.hファイルに分割され、プロジェクト構造がより整理されるため推奨される。これらの設定が完了したら、「プロジェクト」メニューから「コード生成」を実行する。これにより、Core/とDrivers/ディレクトリに基本的なフレームワークと周辺機器の初期化関数が自動的に生成される。

生成されたプロジェクトの核となるのは「Core/Src/main.c」ファイルだ。このファイルはプログラムのエントリポイントであり、初期化処理やメインループが記述されている。ここで特に注意すべきは、生成されたコードの大部分は次回コード生成時に上書きされる可能性がある点だ。そのため、自分で記述するコードは必ず「/* USER CODE BEGIN ... /」と「/ USER CODE END ... */」という専用のコメントブロック内に書く必要がある。

簡単な「Hello World」として、ボードのボタンが押されたらLEDを点灯させるプログラムを作成してみよう。main.cファイルを開き、while (1) のメインループ内に以下のコードを記述する。

if (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_SET) { HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); }

ここで使われているB1_やLD2_といったマクロは、ボードセレクタでボードを選んだ際に自動的に定義されるピンの名前であり、ポート名やピン番号を直接記述する必要はない。

コードの記述が終わったら、IDEのツールバーにある「ハンマーアイコン」(または「プロジェクト」→「すべてビルド」)をクリックして、プロジェクトをビルド(コンパイルとリンク)する。エラーがなければ、次に「緑の虫アイコン」(または「実行」→「デバッグ」)をクリックしてプログラムをボードに書き込み、デバッグセッションを開始する。STM32CubeIDEは自動的にST-LINKを検出し、必要であればファームウェアを更新し、コンパイルされたプログラム(.elfファイル)をボードにロードして実行を開始する。デバッグセッション中は、ブレークポイントの設定、ステップ実行、変数の監視などが行える。

さらに発展的な内容として、ボタンのチャタリング(物理的な接触の揺れによる誤動作)対策、外部割り込み(EXTI)を用いたイベント駆動型処理、そしてデバッグ時にPCへ文字情報を出力するprintf機能(UART経由やSWV ITM)の利用などがある。これらの機能は、より複雑な組み込みアプリケーションを開発する上で不可欠な技術だ。

開発中に「Target not found」といった接続エラーが発生した場合、まずはUSBケーブルが正常か、ボードに電源が供給されているか、ST-LINKのジャンパが正しい位置にあるかを確認する。カスタムボードの場合は、SWDIO、SWCLK、GND、3V3などの配線も再度確認する必要がある。また、USER CODEブロック外にコードを記述してしまい、コード生成時に消えてしまうという事態も初心者によくある。必ず決められたブロック内にコードを記述する習慣をつけることが重要だ。HAL_Delay関数はプログラムの実行を一時停止させるため、複数の処理を並行して行う必要がある場合は、タイマー割り込みなどを活用して非ブロッキングな処理を実装することが求められる。

プロジェクトをクリーンに保つためには、アプリケーションロジックをmain.cから独立したファイル(例:app.c/app.h)に分離し、main.cは最小限の初期化とスケジューラーループのみに留めるという手法が有効だ。また、各周辺機器や機能ごとに個別のモジュール(例:led.c、buttons.c、uart.c)を作成することも、コードの可読性と再利用性を高める上で非常に役立つ。

最終的に、UARTによるシリアル通信、I²C/SPIによるセンサーやディスプレイとの連携、タイマーやPWMによるモーター制御、ADC/DACによるアナログ信号処理、そして複雑なアプリケーションを管理するためのリアルタイムOS(FreeRTOSなど)の導入へと学習を進めることで、システムエンジニアとしての組み込み開発スキルを大きく向上させることができるだろう。このガイドが、皆さんのSTM32プログラミングの第一歩となることを願う。

関連コンテンツ

関連IT用語