STM32開発環境の構築方法 完全解説
はじめに:組み込み開発の世界へ、STM32とは?
組み込みシステムは、私たちの身の回りにある様々な機器に搭載されています。スマートフォン、家電、自動車、産業機器など、挙げればきりがありません。その中でも、高性能かつ豊富なペリフェラルを搭載したマイクロコントローラーとして、STMicroelectronics社製の「STM32」シリーズは、アマチュアからプロフェッショナルまで、世界中のエンジニアに広く利用されています。
STM32は、ARM Cortex-Mコア(Cortex-M0, M0+, M3, M4F, M7F, M33など)を搭載しており、多様な製品ラインナップ(STM32F, STM32L, STM32H, STM32Wなど)で、様々なアプリケーションの要求に対応しています。低消費電力から高性能、リアルタイム制御、無線通信機能内蔵など、目的に合わせて最適なマイコンを選択できます。
STM32を使った開発を始めるためには、適切な開発環境を構築する必要があります。開発環境とは、プログラムのコードを書くためのエディタ、コードをマイコンが理解できる機械語に変換するコンパイラ、プログラムの誤り(バグ)を見つけるためのデバッガ、そしてプログラムをマイコンに書き込むためのプログラマなどのツール群を指します。
本記事では、STM32開発環境を構築するためのステップを、ハードウェアの準備からソフトウェアのインストール、基本的なプロジェクトの作成・実行まで、詳細に解説します。特に、ST公式の統合開発環境である「STM32CubeIDE」を中心に、その利用方法を深掘りしていきます。約5000語のボリュームで、初めてSTM32を触る方でも迷わないよう、丁寧な説明を心がけます。
開発環境構築の全体像:必要なものは?
STM32を使った開発環境を構築するためには、主に以下のものが必要になります。
-
ハードウェア:
- STM32 マイクロコントローラー搭載ボード: 開発を始めるための基盤となるハードウェアです。ST純正の評価ボード(Discovery Kit, Nucleoなど)が一般的で、これらはデバッガ/プログラマ機能も内蔵しているため、初心者には特におすすめです。
- PC: 開発ソフトウェアをインストールして実行するためのコンピュータです。Windows, macOS, Linuxなど、多くのOSに対応しています。
- USBケーブル: PCと開発ボードを接続し、電源供給、プログラム書き込み、デバッグに使用します。ボードによってMini-B, Micro-B, Type-Cなど形状が異なります。
-
ソフトウェア:
- 統合開発環境 (IDE): コードエディタ、コンパイラ、リンカ、デバッガなどのツールが一つに統合されたソフトウェアです。STM32開発では、ST公式のSTM32CubeIDEや、商用のKeil MDK-ARM、IAR Embedded Workbench for ARM、あるいはオープンソースのGCC+Makeなどが利用されます。
- コンパイラ/リンカ: C/C++などの高水準言語で書かれたソースコードを、ターゲットのSTM32マイコンが実行できる機械語コード(バイナリファイル)に変換します。IDEに統合されている場合が多いです。
- デバッガ: 実行中のプログラムの挙動を監視したり、一時停止させたり、変数の値を調べたりすることで、バグの原因を特定し修正を助けるツールです。
- プログラマ/フラッシュツール: コンパイル・リンクによって生成されたバイナリファイルを、マイコンのフラッシュメモリに書き込むためのツールです。
- 設定ツール: マイコンのピン配置、クロック設定、周辺機能の設定などをGUIで行うためのツールです。STのSTM32CubeMXが広く使われており、多くのIDEに統合されています。
- ドライバ: PCが開発ボードやデバッガを認識・通信するために必要なドライバソフトウェアです。ST-LINKドライバなどが該当します。
これらの要素が揃うことで、STM32マイコン上で動く独自のプログラムを開発できるようになります。
ハードウェアの選択:どの開発ボードを使うか?
STM32開発の第一歩は、開発ボードの選択です。STは開発者向けに様々なボードを提供しています。
-
Nucleo (ヌクレオ) シリーズ:
- 最も手軽に始められるシリーズです。
- Arduino Uno/Mega互換ヘッダやST Zioコネクタを搭載しており、拡張ボード(シールド)を利用しやすいのが特徴です。
- 様々なSTM32ファミリ(F0, F3, F4, F7, L4, G4など)に対応したモデルがあります。
- オンボードにST-LINKデバッガ/プログラマを搭載しているため、別途デバッガを用意する必要がありません。USBケーブル一本でPCと接続し、プログラム書き込み・デバッグが可能です。
- 価格も比較的安価です。
-
Discovery Kit (ディスカバリー キット) シリーズ:
- 特定のSTM32ファミリや機能(例: グラフィックLCD, MEMSセンサー, オーディオ, Connectivityなど)を評価することに特化したボードです。
- Nucleoシリーズよりも多機能で、よりリッチなユーザーインターフェースや多様なペリフェラルを搭載していることが多いです。
- オンボードST-LINKを搭載しています。
- Nucleoよりは高価になる傾向がありますが、そのファミリや機能のポテンシャルを最大限に引き出すためのサンプルやツールが提供されています。
-
Evaluation Board (評価ボード) シリーズ:
- STM32ファミリの全機能を評価するための、最も高機能で高価なボードです。
- より複雑なシステム開発や、特定のマイコンを深く評価する場合に使用されます。
- 多くのコネクタ、拡張オプション、デバッグ機能などを搭載しています。
-
自作ボード/サードパーティ製ボード:
- 開発が進み、特定のアプリケーション向けに最適化されたハードウェアが必要になった場合、自分で基板を設計したり、サードパーティが提供するモジュールを利用したりすることになります。
- この場合、デバッガ/プログラマは別途用意する必要があります(ST-LINK/V2, ST-LINK/V3, J-Linkなど)。
初心者には、まずNucleoボードまたはDiscovery Kitのいずれかから始めるのがおすすめです。 搭載されているSTM32マイコンの型番を確認し、開発したいアプリケーションに必要な性能やペリフェラルを備えているかを確認して選びましょう。例えば、簡単なLチカやセンサー読み取りなら入門用のF0/F3/L4系、高速な処理や豊富なメモリが必要ならF4/F7/H7系などです。ボード上に搭載されているST-LINKのバージョン(V2やV3)も確認しておくと良いでしょう。
ソフトウェアの選択:どの開発環境を選ぶか?
STM32の開発環境はいくつか選択肢があります。それぞれに特徴と利点・欠点があります。
-
STM32CubeIDE (STMicroelectronics公式):
- 特徴: STが公式に提供する無償の統合開発環境です。Eclipseをベースにしており、STM32CubeMX(設定ツール)、GCCコンパイラ、GDBデバッガ、ST-LINK GDBサーバーなどが統合されています。STM32Cube HAL/LLライブラリ、ミドルウェア(FreeRTOS, FatFs, USBなど)の開発もサポートしています。
- 利点: ST公式であるため、最新のSTM32製品やCubeエコシステムへの対応が最も早いです。無償で利用でき、設定からコーディング、デバッグまでを一貫して行えるため、初心者から上級者まで幅広く使えます。CubeMXとの連携が非常にスムーズです。
- 欠点: Eclipseベースのため、起動や動作がやや重いと感じる場合があります。多機能ゆえにUIが複雑に感じられることもあります。
- おすすめ度: ★★★★★ – 初心者からプロまで、STM32開発の標準的な環境として最もおすすめです。
-
Keil MDK-ARM (Arm社/旧Keil Software):
- 特徴: 組み込み開発で長い歴史を持つ、非常に有名な商用IDEです。特にCortex-M系マイコンの開発環境として広く利用されています。自社製のArm Compiler 6(高性能なコンパイラ)や、豊富なミドルウェア、優れたデバッガ機能が特徴です。
- 利点: 高性能なコンパイラによる最適化されたコード、安定した動作、強力なデバッグ機能が魅力です。プロフェッショナルな現場で広く使われています。
- 欠点: 商用ライセンスが必要です。無償のLite版はコードサイズに制限(通常32KB)があります。大規模なプロジェクトや製品開発には有償ライセンスが必須となります。CubeMXとの連携は可能ですが、STM32CubeIDEほどシームレスではない場合があります。
- おすすめ度: ★★★★☆ – 商用開発で最高のパフォーマンスや信頼性を求める場合に強力な選択肢となります。趣味や学習目的の場合は、無償のSTM32CubeIDEやGCC+Makeで十分なことが多いです。
-
IAR Embedded Workbench for ARM (IAR Systems):
- 特徴: Keilと同様に、組み込み開発で長い歴史を持つ商用IDEです。高性能なIAR C/C++ Compiler™が特徴で、特にコードサイズの削減や実行速度の最適化に定評があります。
- 利点: 高度な最適化機能、安定したデバッガ、使いやすいUIなどが評価されています。車載や産業分野など、高い信頼性が求められる分野で利用されることが多いです。
- 欠点: 商用ライセンスが必要です。無償のKickStart版はコードサイズ制限(通常32KBまたは64KB)やデバッグ機能の制限があります。
- おすすめ度: ★★★★☆ – Keilと同様に、プロフェッショナルな現場で高性能なコンパイラや信頼性を求める場合に適しています。
-
GCC + Make (オープンソース):
- 特徴: GNU Compiler Collection (GCC) と Makeユーティリティを組み合わせた、オープンソースのツールチェーンです。Eclipseなどの汎用IDE(例: Eclipse CDT)と組み合わせて使うことも、コマンドラインベースで開発することも可能です。デバッガにはGDBと、ターゲットとの接続ツール(OpenOCDなど)を使用します。
- 利点: 無償で利用でき、高いカスタマイズ性があります。Linuxなどの環境での開発が容易です。ツールチェインの内部動作を理解しやすいです。
- 欠点: 環境構築の手順が他のIDEに比べてやや複雑になる傾向があります。IDEのように統合されていないため、各ツール(エディタ、コンパイラ、デバッガ、プログラマ)を個別にインストール・設定する必要があります。STM32CubeMXはプロジェクト設定をMakefileとして出力できるため、連携は可能です。
- おすすめ度: ★★★☆☆ – 組み込み開発の内部構造を深く理解したい方、無償かつ柔軟な環境を構築したい方に向いています。初心者にはSTM32CubeIDEの方が手軽です。
本記事では、STM32CubeIDE を中心に開発環境の構築方法を解説します。これは、ST公式であり無償で利用でき、STM32開発に必要なツールがほぼすべて統合されているため、STM32開発を始める上で最も推奨される環境だからです。
STM32CubeIDE 開発環境の構築
1. ハードウェアの準備とドライバのインストール
まず、STM32開発ボード(例: Nucleo-F401RE)を用意します。ボードにUSBケーブルを接続し、PCに繋ぎます。
Windowsの場合:
Windowsは通常、ST-LINKドライバを自動でインストールしようとしますが、失敗したり古いバージョンが入ったりする場合があります。STのウェブサイトから最新の「ST-LINK, ST-LINK/V2, ST-LINK/V3 USB driver signed for Windows」をダウンロードしてインストールするのが確実です。
1. STMicroelectronicsのウェブサイトにアクセスします。(「ST-LINK drivers」などで検索)
2. “STSW-LINK009” という名称のドライバパッケージを探してダウンロードします。
3. ダウンロードしたZIPファイルを解凍し、インストーラー(exeファイル)を実行します。
4. 画面の指示に従ってインストールを完了します。
5. ボードをPCに接続し、デバイスマネージャーを開いて「ユニバーサル シリアル バス デバイス」や「ポート (COMとLPT)」の項目にST-LINK関連のデバイスが認識されているか確認します。問題なく認識されていればドライバインストールは成功です。
macOSの場合:
macOSには通常、別途ドライバのインストールは不要です。ST-LINKは標準的なUSBデバイスとして認識されます。ただし、後述するSTM32CubeProgrammerなどのツールを使用する際に、ST-LINKを認識しない場合は、HomebrewなどでOpenOCDなどをインストールする必要があるかもしれません。STM32CubeIDE自体が必要なツールを含んでいるため、基本的にはボードを接続するだけで認識されるはずです。
Linuxの場合:
Linuxの場合も、多くの場合カーネルがST-LINKをサポートしているためドライバのインストールは不要です。しかし、ユーザー権限でST-LINKにアクセスするためには、udev
ルールの設定が必要になることがあります。
1. STMicroelectronicsのウェブサイトから「STM32CubeProgrammer」を探してダウンロードします。このパッケージにudev
ルールの設定ファイルが含まれています。
2. ダウンロードしたZIPファイルを解凍し、Drivers/rules
ディレクトリにある .rules
ファイル(例: 49-stlinkv2.rules
, 49-stlinkv3.rules
)を /etc/udev/rules.d/
ディレクトリにコピーします。
3. 以下のコマンドを実行してudev
ルールを再ロードするか、PCを再起動します。
bash
sudo udevadm control --reload-rules
sudo udevadm trigger
4. lsusb
コマンドなどでST-LINKが認識されているか確認します。
2. STM32CubeIDE のダウンロードとインストール
STM32CubeIDEはSTの公式ウェブサイトから無償でダウンロードできます。
- STMicroelectronicsのウェブサイトにアクセスします。(「STM32CubeIDE」などで検索)
- 製品ページにある「Get Software」または「Download」リンクをクリックします。
- 利用規約に同意します。STアカウントへのログインが必要な場合があります(無料登録)。
- OS(Windows, macOS, Linux)を選択してインストーラーをダウンロードします。ファイル名にはOS名やバージョン番号が含まれます。(例:
stm32cubeide_win_x_y_z.exe
,stm32cubeide_mac_x_y_z.dmg
,stm32cubeide_linux_x_y_z.zip
)
インストール手順:
-
Windows:
- ダウンロードした実行ファイル(
.exe
)をダブルクリックしてインストーラーを起動します。 - ライセンス契約をよく読み、同意します。
- インストール先フォルダを選択します。デフォルトのままで問題ありません。
- インストールするコンポーネントを選択します。通常はすべて選択したままで良いでしょう。(GCCコンパイラ、GDBデバッガ、ST-LINK GDBサーバーなどが含まれます)
- (オプション)ST-LINKドライバのインストールも同時に促される場合があります。すでに最新版をインストールしている場合はスキップしても構いませんが、念のためインストールしておくと安心です。
- インストールが完了するまで待ちます。数分かかる場合があります。
- インストール完了後、STM32CubeIDEを起動するためのショートカットが作成されます。
- ダウンロードした実行ファイル(
-
macOS:
- ダウンロードしたディスクイメージファイル(
.dmg
)をダブルクリックして開きます。 - 表示されたウィンドウ内のSTM32CubeIDEアイコンをApplicationsフォルダにドラッグ&ドロップします。
- ApplicationsフォルダからSTM32CubeIDEを起動します。初回起動時にセキュリティ警告が表示される場合がありますが、「開く」を選択して続行します。
- ダウンロードしたディスクイメージファイル(
-
Linux:
- ダウンロードしたZIPファイルを解凍します。
- 解凍されたディレクトリにあるインストールスクリプトを実行します。(例:
./SetupSTM32CubeIDE-*-linux.run
) - ターミナル上でインストーラーが起動します。グラフィカルモードで起動しない場合は、
--mode text
オプションを付けてテキストベースでインストールを進めることも可能です。 - ライセンス契約に同意します。
- インストール先フォルダを選択します。
- インストールするコンポーネントを選択します。
- インストールが完了するまで待ちます。
- インストール先フォルダ内の実行ファイル(例:
./stm32cubeide
)を実行してSTM32CubeIDEを起動します。デスクトップ環境によっては、アプリケーションメニューに登録されることもあります。
3. STM32CubeIDE の起動とワークスペースの設定
STM32CubeIDEを初めて起動すると、ワークスペース(Workspace)を選択するダイアログが表示されます。ワークスペースは、作成するプロジェクトや設定ファイルなどを保存しておく場所です。
- 任意のフォルダをワークスペースとして指定します。プロジェクトごとに別のワークスペースを作成することも、一つのワークスペースに複数のプロジェクトをまとめて保存することも可能です。
- 「Use this as the default and do not ask again」(今後このワークスペースをデフォルトとし、このダイアログを表示しない)にチェックを入れると、次回からこのダイアログは表示されなくなります。
ワークスペースを指定して「Launch」ボタンをクリックすると、STM32CubeIDEが起動します。初回起動時やアップデート後には、追加のソフトウェアやファームウェアパッケージのインストールを促されることがあります。これは、STM32マイコンの特定のファミリに対応するためのパッケージです。使用するマイコンに合わせて、必要なパッケージをインストールしてください。後から「Help」->「Manage Embedded Software Packages」からもインストールできます。
4. STM32CubeIDEでの新規プロジェクト作成
いよいよ、STM32上で実行するプログラムを作成するためのプロジェクトを作成します。STM32CubeIDEでは、以下の方法で新しいプロジェクトを作成できます。
- 新規STM32プロジェクト: ターゲットのSTM32マイコンまたは開発ボードを選択し、CubeMXのGUIを使ってピン配置や周辺設定をゼロから行う場合に選択します。最も一般的で柔軟性の高い方法です。
- Exampleセレクターから: STM32Cubeファームウェアパッケージに含まれるサンプルプロジェクトを選択し、それをベースに開発する場合に選択します。特定のペリフェラルの使い方などを学ぶのに便利です。
- 既存のCubeMXプロジェクトから: STM32CubeMX単体で作成した
.ioc
ファイルをインポートして、プロジェクトを生成する場合に選択します。 - 既存のプロジェクトをインポート: 他のIDEで作成したプロジェクトや、過去にSTM32CubeIDEで作成したプロジェクトをインポートする場合に選択します。
ここでは、最も一般的な 「新規STM32プロジェクト」 の作成手順を詳しく説明します。
- STM32CubeIDEのメニューから「File」->「New」->「STM32 Project」を選択します。または、Welcome画面やツールバーにある「Start new STM32 project」をクリックします。
- 「Target Selection」ウィンドウが開きます。ここで開発に使用するSTM32マイコンまたは開発ボードを選択します。
- MCU/MPU Selector: 使用するSTM32マイコンの型番(例: STM32F401RETx)を検索ボックスに入力し、リストから選択します。
- Board Selector: 使用する開発ボードの型番(例: NUCLEO-F401RE)を検索ボックスに入力し、リストから選択します。ボードを選択すると、そのボードに搭載されているマイコンが自動的に選択され、ボード固有の設定(LEDやボタンなどが接続されているピンなど)がプリセットされます。初心者にはボードセレクターからの選択がおすすめです。
- ターゲットを選択したら、「Next >」をクリックします。
- 「Project Name」を入力します(例:
MyFirstProject
)。 - 「Project Type」を選択します。「STM32Cube」がデフォルトで推奨されます。これはCube HAL/LLライブラリを使用したプロジェクトになります。
- 「Firmware Package」のバージョンを確認します。必要であれば、インストール済みの別のバージョンを選択します。
- 「Targeted Project Context」では、実行環境(C/C++ Executable Projectなど)を選択します。通常はデフォルトのままで構いません。
- 「Finish」をクリックします。
プロジェクトが作成されると、自動的にSTM32CubeMXのGUIが開きます。
5. STM32CubeMXを使ったマイコンの設定
STM32CubeMXは、マイコンのピン配置、クロック設定、周辺機能(GPIO, UART, SPI, I2C, Timer, ADC, etc.)の設定、ミドルウェア(FreeRTOS, FatFs, USBなど)の設定をGUIで行うための強力なツールです。この設定は .ioc
ファイルとして保存され、後ほどソースコードとして自動生成されます。
プロジェクト作成後、STM32CubeMXのGUIが表示された状態からの手順を説明します。
-
Pinout & Configuration タブ:
- マイコンのピン配置が表示されます。周辺機能とピンの関連付け、GPIOのモード設定(入力/出力、プルアップ/プルダウンなど)を行います。
- 左側の「Categories」ペインから設定したい周辺機能を選択します(例:
System Core
->SYS
)。 - 中央のマイコンパッケージ図上でピンをクリックすると、そのピンに割り当て可能な機能が表示されるので、選択します。
- または、「Categories」ペインで周辺機能を選択した後、右側の設定ペインでパラメータを設定します。例えば、「GPIO」を選択すると、各GPIOポートの詳細設定(モード、スピード、プル設定など)が行えます。
- 開発ボードを選択してプロジェクトを作成した場合、オンボードのLEDやボタンなどに割り当てられているピンは既に設定されていることが多いです。
- 例:Lチカのために、適当なGPIOピンを出力に設定します。GPIOxピン(xはポート名、例えばGPIOAやGPIOC)をクリックし、機能リストから「GPIO_Output」を選択します。その後、右側の設定ペインでそのピンのラベル(例:
LED1
)や初期状態(High/Low)を設定できます。
-
Clock Configuration タブ:
- マイコンのシステムクロックや各周辺機能のクロック設定を行います。STM32は複雑なクロックツリーを持っていますが、CubeMXを使えば視覚的に、そしてルールに基づいた設定が可能です。
- 外部クリスタル(HSE)や内部RC発振器(HSI)などのクロックソースを選択し、PLL(Phase-Locked Loop)を使ってシステムクロック(SYSCLK)を生成します。
- 生成されたSYSCLKから、AHB, APB1, APB2などのバスや、各周辺機能へのクロック分周比を設定します。
- CubeMXは設定可能な最大クロック周波数などを考慮して、自動的に最適なPLL設定を計算したり、不正な設定を警告したりします。
- 目標とするシステムクロック周波数(例: Nucleo-F401REなら84MHz)になるように設定します。外部クリスタルがボードに搭載されている場合はHSEを選択し、PLL sourceとしてHSEを選び、図を見ながら分周比や乗算器を設定します。
-
Project Manager タブ:
- プロジェクト設定に関する項目があります。
- 「Project」項目で、プロジェクト名、保存先、使用するツールチェーン(STM32CubeIDE、MDK-ARM、EWARM、Makefile)などを確認・変更できます。ここでは通常「STM32CubeIDE」が選択されています。
- 「Code Generator」項目では、生成されるコードに関する設定を行います。
- 「Generate peripheral initialization as a pair of ‘.c/.h’ files per each peripheral」: 周辺機能ごとに個別のソースファイルを生成するかどうか。チェックを入れるとファイル数が増えますが、整理されます。
- 「Keep user code when re-generating」: コードを再生成する際に、ユーザーが記述したコードを保持するかどうか。これは非常に重要です。 CubeMXが生成するコードには、
/* USER CODE BEGIN ... */
と/* USER CODE END ... */
というコメントで囲まれた領域があり、ユーザーはこの領域内にコードを記述します。このオプションにチェックを入れておけば、CubeMXの設定を変更してコードを再生成しても、ユーザーコード領域の内容が失われることがありません。必ずチェックを入れておきましょう。
- 「Advanced Settings」項目では、使用するライブラリの種類(HALまたはLL)などを選択できます。通常はHAL(Hardware Abstraction Layer)が使われます。HALは使いやすいAPIを提供しますが、LL(Low-Layer)はより直接的なレジスタ操作に近い、高速でコンパクトなコードを生成する場合があります。
-
Tools タブ:
- ファームウェアアップデートやバージョン管理に関するツールへのアクセスがあります。
設定が完了したら、ツールバーにあるギアアイコン(Generate Code)をクリックしてソースコードを生成します。
6. コードの記述とビルド
CubeMXでコードを生成すると、プロジェクトに必要なソースファイル(.c
ファイル)とヘッダファイル(.h
ファイル)が自動生成されます。生成されたファイルは「Project Explorer」ビューに表示されます。
- 主要なファイル:
main.c
: メイン関数が含まれるファイルです。ハードウェア初期化コードや、ユーザーが記述するアプリケーションコードを配置します。stm32yyxx_hal_msp.c
: HALライブラリ関連の低レベルハードウェア初期化(クロック設定など)を行うファイルです。通常は自動生成された内容で十分です。stm32yyxx_it.c
: 割り込みハンドラ関数が含まれるファイルです。割り込みを使用する場合に編集します。system_stm32yyxx.c
: システムクロックなどの設定を行うファイルです。Drivers
ディレクトリ: STM32Cube HAL/LLライブラリや、CubeMXで設定したミドルウェアのソースファイルが含まれます。Core
ディレクトリ: スタートアップコードや、main.c
、割り込みハンドラファイルなどが含まれます。
コードは主に main.c
に記述します。STM32CubeIDEが生成した main.c
には、main
関数の雛形と、CubeMXで設定したハードウェア初期化関数(HAL_Init()
, SystemClock_Config()
, ペリフェラル初期化関数など)の呼び出しが含まれています。
ユーザーが記述するアプリケーションコードは、main
関数内の無限ループ while (1)
の中に記述するのが一般的です。繰り返し実行したい処理をここに記述します。
前述の通り、コード生成時に「Keep user code when re-generating」にチェックを入れていれば、/* USER CODE BEGIN ... */
と /* USER CODE END ... */
のコメント間に書いたコードは、CubeMXで設定を変更してコードを再生成しても消えません。
例: Lチカのコードを記述する
LチカのためにGPIOピン(例: GPIOCピン9)を出力に設定し、そのピンに LED1
というラベルを付けた場合、main.c
の while(1)
ループの中に以下のようなコードを追加します。
“`c
/ USER CODE BEGIN WHILE /
while (1)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); // LED1のピンの状態を反転
HAL_Delay(500); // 500ミリ秒待つ
/ USER CODE END WHILE /
/ USER CODE BEGIN 3 /
}
/ USER CODE END 3 /
“`
ここで使用している HAL_GPIO_TogglePin
や HAL_Delay
関数は、STM32Cube HALライブラリが提供するAPIです。HALライブラリを使うことで、抽象化された関数呼び出しで周辺機能を制御できます。
コードを記述したら、ビルドを行います。ビルドとは、ソースコードをコンパイラでオブジェクトファイルに変換し、それらをリンカで結合して実行可能なバイナリファイル(.elf
ファイルなど)を生成する一連のプロセスです。
- ツールバーのハンマーアイコン(Build)をクリックします。
- または、メニューから「Project」->「Build Project」を選択します。
ビルドが成功すると、「Console」ビューにビルドログが表示され、エラーや警告がなければ「Build Finished」と表示されます。生成されたバイナリファイルのサイズなども表示されます。エラーが発生した場合は、「Problems」ビューに詳細が表示されるので、修正して再度ビルドします。
7. プログラムの書き込み(フラッシュ)
ビルドが成功したら、生成されたバイナリファイルをターゲットのSTM32マイコンのフラッシュメモリに書き込みます。この操作を「フラッシュ」または「プログラミング」と呼びます。
STM32CubeIDEはST-LINKデバッガ/プログラマとの連携機能を持っています。開発ボードのUSBケーブルがPCに接続され、ST-LINKドライバが正しくインストールされていれば、IDEから直接書き込みが可能です。
- ツールバーの緑色の再生ボタンと虫アイコンが一緒になったアイコン(Run ‘…’)のドロップダウンメニューから、「Run As」->「STM32 Cortex-M C/C++ Application」を選択します。
- または、メニューから「Run」->「Run」を選択します。
初回実行時には、「Launch Configuration」の設定ダイアログが表示されます。
1. 「Target」タブで、接続されているST-LINKデバッガが正しく認識されているか確認します。複数のデバッガが接続されている場合は、使用するデバッガを選択します。
2. 「Debugger」タブで、デバッグプローブとして「ST-LINK (OpenOCD)」または「ST-LINK (ST-LINK GDB server)」が選択されていることを確認します。通常はデフォルトのままで問題ありません。
3. 「Flashing」タブで、書き込みオプション(例: プログラム書き込み、ベリファイなど)を設定します。通常はデフォルトの「Reset after flash」にチェックが入っているままで良いでしょう。
4. 設定を確認したら、「Apply」をクリックし、「Run」をクリックします。
STM32CubeIDEは、ビルドされたバイナリファイルを読み込み、ST-LINK経由でターゲットマイコンのフラッシュメモリに自動的に書き込みます。書き込みが完了すると、マイコンがリセットされ、プログラムが実行を開始します。
Lチカのプログラムであれば、ボード上のLEDが点滅を開始するはずです。
8. デバッグ
プログラムが意図した通りに動作しない場合、デバッグ機能を使って問題の原因を特定します。デバッグとは、プログラムを一時停止させたり、変数の中身を確認したり、一行ずつ実行したりする機能です。
STM32CubeIDEは、GDBデバッガとST-LINKを連携させてオンチップデバッグを可能にします。
- デバッグを開始するには、ツールバーの虫アイコン(Debug ‘…’)のドロップダウンメニューから、「Debug As」->「STM32 Cortex-M C/C++ Application」を選択します。
- または、メニューから「Run」->「Debug」を選択します。
初回デバッグ時には、「Launch Configuration」の設定ダイアログが表示されます。Run(書き込み)の設定と同様に、TargetやDebuggerの設定を確認します。
設定を確認したら、「Apply」をクリックし、「Debug」をクリックします。
STM32CubeIDEはバイナリファイルをフラッシュに書き込んだ後、自動的に「Debugパースペクティブ」に切り替わります。(切り替えを確認するダイアログが表示される場合があります。)
Debugパースペクティブの主なビュー:
- Debugビュー: 実行中のスレッドやコールスタックが表示されます。ステップ実行などの操作ボタン(Resume, Suspend, Terminate, Step Into, Step Over, Step Return)があります。
- Variablesビュー: 現在スコープ内の変数やグローバル変数の値を表示・変更できます。
- Registersビュー: マイコンのCPUレジスタや周辺レジスタの値を表示・変更できます。
- Breakpointsビュー: 設定したブレークポイント(プログラムを一時停止させたい場所)の一覧が表示されます。
- Consoleビュー: デバッガからのメッセージなどが表示されます。
- Editor: 現在実行中のコード行や、ブレークポイントを設定した行などが表示されます。
デバッグの基本的な操作:
- ブレークポイントの設定: プログラムを一時停止させたいコード行の左側の余白(行番号のあたり)をダブルクリックすると、ブレークポイントが設定されます(青い丸で表示)。デバッグ実行中にこの行に到達すると、プログラムの実行が一時停止します。
- デバッグ実行: デバッグセッションを開始すると、プログラムは先頭から実行され、最初のブレークポイントで停止します。
- ステップ実行:
- Step Into (F5): 関数呼び出しがある場合に、呼び出された関数の内部に入って実行を続けます。
- Step Over (F6): 関数呼び出しがある場合でも、関数をスキップして次の行に進みます。関数の中身は実行されますが、ステップ実行は関数の外側で行われます。
- Step Return (F7): 現在実行中の関数から抜け出し、呼び出し元に戻ります。
- Resume (F8): 次のブレークポイントまで、またはプログラムの終了まで実行を再開します。
- Suspend: プログラムの実行を任意で一時停止します。
- Terminate: デバッグセッションを終了します。
デバッグ中にVariablesビューやRegistersビューを確認することで、プログラムの実行状態やハードウェアの状態を詳細に把握し、問題の原因を特定することができます。
他の開発環境について (概要)
STM32CubeIDE以外の主要な開発環境についても簡単に触れておきます。
Keil MDK-ARM での構築 (Lite版を想定)
- ダウンロードとインストール: Arm社のウェブサイトからKeil MDK-ARMのインストーラーをダウンロードし、実行します。ライセンスの種類を選択する際に、無償のLite版を選択します。
- Pack Installer: Keil MDKには、特定のマイコンに対応するためのソフトウェアパック(Device Family Pack, DFP)が必要です。MDKインストール後に起動するPack Installerを使って、使用するSTM32ファミリのパックをインストールします。これにより、そのマイコン用のデバイス定義ファイルやサンプルコード、フラッシュアルゴリズムなどが追加されます。
- STM32CubeMX連携: STM32CubeMX(単体版またはSTM32CubeIDEに統合されているもの)でプロジェクト設定(.iocファイル)を作成し、Project ManagerタブのToolchain/IDE設定で「MDK-ARM」を選択してコード生成します。生成されたMDKプロジェクトファイル(.uvprojx)をKeil MDKで開きます。
- ビルド、デバッグ、書き込み: Keil MDKのIDE上でコードを記述し、ビルドします。ターゲットデバイスの設定(デバッガ選択、フラッシュ設定など)を行った後、デバッガを起動してプログラムをフラッシュに書き込み、デバッグを開始します。ST-LINKやJ-Linkなどの外部デバッガを使用します。
IAR Embedded Workbench for ARM での構築 (KickStart版を想定)
- ダウンロードとインストール: IAR SystemsのウェブサイトからIAR Embedded Workbench for ARMのインストーラーをダウンロードし、実行します。KickStart版または評価版としてインストールします。
- Board Support Package (BSP) / Device Support: IARも特定のマイコンに対応するためのサポートファイルが必要です。インストール時に含まれることが多いですが、必要に応じて追加のコンポーネントをインストールします。
- STM32CubeMX連携: STM32CubeMXでプロジェクト設定(.iocファイル)を作成し、Project ManagerタブのToolchain/IDE設定で「EWARM」を選択してコード生成します。生成されたEWARMプロジェクトファイル(.ewp)をIAR Embedded Workbenchで開きます。
- ビルド、デバッグ、書き込み: IAR Embedded WorkbenchのIDE上でコードを記述し、ビルドします。プロジェクトオプションでターゲットデバイスやデバッガ設定を行った後、デバッガを起動してプログラムをフラッシュに書き込み、デバッグを開始します。ST-LINKやJ-Linkなどの外部デバッガを使用します。
GCC + Make での構築
- GNU ARM Embedded Toolchainのインストール: Armのウェブサイトから、またはLinuxディストリビューションのリポジトリから、クロスコンパイル用のGCCツールチェーン(
arm-none-eabi-gcc
など)をダウンロード・インストールします。 - OpenOCDまたはST-Link Utilityのインストール: デバッガインターフェースとしてOpenOCD(オープンソース)またはSTMicroelectronicsのST-Link Utility/STM32CubeProgrammer(公式ツール)をインストールします。OpenOCDはGDBと連携してデバッグを行う際に、ST-Link Utility/STM32CubeProgrammerは単体でフラッシュ書き込みを行う際に使用できます。
- STM32CubeMXでMakefile生成: STM32CubeMXでプロジェクト設定(.iocファイル)を作成し、Project ManagerタブのToolchain/IDE設定で「Makefile」を選択してコード生成します。これにより、Cube HAL/LLライブラリや設定に基づいたMakefileが生成されます。
- コードの記述: 生成されたソースコード(
main.c
など)を好みのエディタで編集します。 - ビルド: ターミナルを開き、プロジェクトのルートディレクトリで
make
コマンドを実行します。MakefileがGCCツールチェーンを呼び出し、ビルドを行います。 - フラッシュ書き込み: OpenOCDまたはSTM32CubeProgrammerを使って、生成されたバイナリファイル(.elfまたは.binファイル)をターゲットマイコンに書き込みます。
- OpenOCDの場合:
openocd -f interface/stlink.cfg -f target/stm32yyxx.cfg -c "program <your_project>.elf verify reset exit"
のようにコマンドを実行します。 - STM32CubeProgrammerの場合: GUIまたはCLI版を使ってファイルを指定して書き込みます。
- OpenOCDの場合:
- デバッグ: GDBデバッガとOpenOCDを連携させてデバッグを行います。ターミナルで
arm-none-eabi-gdb <your_project>.elf
を実行し、GDBコマンドでOpenOCDに接続してデバッグセッションを開始します。あるいは、Eclipse CDTなどのIDEからGDB + OpenOCDを構成してデバッグすることも可能です。
GCC+Make環境は最も自由度が高い反面、各ツールの連携を手動で行う必要があるため、構築・運用にはある程度の知識が必要です。しかし、自動化やCI/CDシステムへの組み込みなどには非常に適しています。
トラブルシューティング:よくある問題とその解決策
開発環境の構築や利用中に発生しやすい一般的な問題と、その解決策をいくつか紹介します。
-
ST-LINKドライバが正しくインストールされていない/認識されない:
- 症状: PCがボードを認識しない、デバイスマネージャーに「不明なデバイス」と表示される、STM32CubeIDEやCubeProgrammerがST-LINKを検出できない。
- 解決策: ST公式サイトから最新のST-LINKドライバ(STSW-LINK009)をダウンロードし、再インストールしてください。Windowsの場合、デバイスマネージャーで既存のドライバを一度アンインストールしてから再インストールすると良い場合があります。ボードとPCを別のUSBポートや別のUSBケーブルで接続してみてください。
-
STM32CubeIDEがST-LINKを検出できない:
- 症状: Run/Debug構成でST-LINKが表示されない、フラッシュ書き込みやデバッグ開始時にエラーが発生する(例: “ST-LINK device not found”)。
- 解決策: ST-LINKドライバが正しくインストールされているか確認します。ボードがPCに接続され、電源が入っているか確認します。別のUSBケーブルやUSBポートを試します。ボード上のST-LINKとターゲットマイコン間のジャンパ設定や配線が正しいか確認します(特にNucleo/DiscoveryでターゲットマイコンとST-LINKマイコンを切り替える場合)。STM32CubeProgrammerを単体で起動し、ConnectボタンでST-LINKが検出できるか確認します。CubeProgrammerで検出できれば、IDE側の設定や環境の問題の可能性があります。
-
フラッシュ書き込みに失敗する:
- 症状: プログラムを書き込もうとするとエラーが発生する。
- 解決策: ターゲットマイコンが正しく選択されているか確認します。マイコンがプロテクトされている可能性があります(読み出し保護など)。STM32CubeProgrammerを使って、マイコンのステータスを確認し、必要であればプロテクションを解除します(ただし、プロテクションを解除するとフラッシュの内容は消去されます)。クロック設定が極端に間違っている場合、デバッガがマイコンと同期できなくなることがあります。BOOT0ピンの状態を確認し、マイコンがフラッシュブートモードになっているか確認します(通常はBOOT0=GND)。リセットボタンを押しながら書き込みを試すと成功する場合があります。
-
デバッグセッションが開始できない/すぐに終了する:
- 症状: デバッグボタンを押してもDebugパースペクティブに切り替わらない、またはすぐに終了してしまう。
- 解決策: フラッシュ書き込みが成功しているか確認します。ビルドされたプログラムが正常に起動しているか確認します(例えばLチカならLEDが点滅するか)。スタートアップコードや初期化コードに問題がある可能性があります。リセット直後のアドレス(通常は0x08000000)にブレークポイントを設定して、プログラムカウンタがそこに到達するか確認します。CubeMXの設定(特にクロック設定やSYS設定でデバッグインターフェースが有効になっているか)を見直します。
-
CubeMXでコードを再生成したら、自分で書いたコードが消えてしまった:
- 症状:
/* USER CODE BEGIN ... */
と/* USER CODE END ... */
の間に書いたコードが、.ioc
ファイルを変更してコードを再生成した後に消えている。 - 解決策: STM32CubeMXのProject ManagerタブのCode Generator設定で、「Keep user code when re-generating」にチェックが入っているか確認します。今後コードを記述する際は、必ずこのチェックが入った状態でコード生成するようにしてください。消えてしまったコードは、バージョン管理システム(Gitなど)を使用していれば以前のバージョンから復旧できます。バージョン管理の導入を強く推奨します。
- 症状:
-
ビルドエラー:
- 症状: ソースコードに誤りがある場合に、ビルド時にコンパイラやリンカからエラーや警告が表示される。
- 解決策: ConsoleビューやProblemsビューに表示されるエラーメッセージをよく読み、エラーが発生しているファイルと行番号を確認します。一般的なC/C++の文法エラー、未定義の変数や関数、インクルードファイルの不足、リンカエラー(メモリ不足、未解決シンボルなど)などが考えられます。メッセージを検索して解決策を探すのも有効です。
さらに進んだ開発のために
基本的な開発環境が構築できたら、次はより高度なトピックに挑戦してみましょう。
- RTOS (Real-Time Operating System): 複数のタスクを並行して実行するためのOSです。STM32CubeIDEはFreeRTOSの設定・統合をCubeMXで行えます。複雑なアプリケーション開発では必須となることが多いです。
- ミドルウェア: USB, TCP/IPネットワーク (LwIP), ファイルシステム (FatFs), グラフィックライブラリ (TouchGFX) など、特定の機能を実現するためのソフトウェアスタックです。CubeMXで簡単にプロジェクトに組み込むことができます。
- 低消費電力モード: STM32は様々な低消費電力モードを持っています。バッテリー駆動のデバイスでは、これらのモードを適切に使用して消費電力を抑えることが重要です。
- 割り込み処理: 外部からのイベント(ボタン入力、センサー値の変化など)やタイマーイベントなどに応じて、メインの処理を中断して特定の処理(割り込みハンドラ)を実行する仕組みです。リアルタイム応答性が求められるアプリケーションで重要です。
- DMA (Direct Memory Access): CPUを介さずに、周辺機能とメモリ間で直接データ転送を行う機能です。データ転送の効率を上げたり、CPUの負荷を軽減したりできます。
- ブートローダ: マイコンの起動時に実行され、アプリケーションコードをフラッシュに書き込んだり、別の場所にジャンプしたりするプログラムです。UARTやUSB経由でファームウェアアップデートを可能にするために使用されます。
これらの機能も、多くの場合STM32CubeMXを使って基本的な設定を行い、生成されたコードをベースに開発を進めることができます。STM32Cubeファームウェアパッケージには、これらの機能を使った豊富なサンプルコードが含まれていますので、参考にしながら学習を進めると良いでしょう。
まとめ
本記事では、STM32開発を始めるための環境構築について、特にST公式の統合開発環境であるSTM32CubeIDEを中心に、その詳細な手順を解説しました。
- ハードウェアの準備: NucleoやDiscovery Kitなどの開発ボードと、PC、USBケーブルを用意します。
- ドライバのインストール: PCが開発ボード(特にST-LINK)を認識するためのドライバをインストールします。
- STM32CubeIDEのインストール: ST公式サイトからインストーラーをダウンロードし、手順に従ってIDEをインストールします。
- 新規プロジェクト作成: STM32CubeIDEを起動し、使用するマイコンまたはボードを選択して新しいプロジェクトを作成します。
- STM32CubeMXでの設定: 自動的に開くCubeMXのGUIで、ピン配置、クロック設定、周辺機能、ミドルウェアなどの設定を行います。特に「Keep user code when re-generating」オプションを有効にしてコードを生成します。
- コードの記述とビルド: 生成されたソースコード(特に
main.c
のユーザーコード領域)にアプリケーションコードを記述し、ビルドを実行して実行可能ファイルを生成します。 - フラッシュ書き込みと実行: ビルドされたプログラムをST-LINK経由でターゲットマイコンのフラッシュメモリに書き込み、実行します。
- デバッグ: プログラムの動作確認や問題解析のために、デバッガを使ってステップ実行や変数・レジスタ値の確認を行います。
これらのステップを踏むことで、STM32上で独自のプログラムを開発するための基本的な環境が整います。STM32は機能が豊富で学習曲線は緩やかではないかもしれませんが、STが提供する豊富なツールとライブラリ(STM32Cubeエコシステム)を活用することで、効率的に開発を進めることができます。
本記事が、あなたのSTM32開発の第一歩を踏み出すための一助となれば幸いです。さあ、LEDを点滅させることから始めて、奥深い組み込み開発の世界を探索していきましょう!