はい、承知いたしました。
STM32CubeIDEの使い方について、プロジェクト作成からデバッグまでを網羅した詳細な解説記事を作成します。以下、記事本文です。
STM32CubeIDE完全ガイド|プロジェクト作成からデバッグまでを網羅
はじめに
近年、IoT機器やスマート家電、ロボット、ドローンなど、私たちの身の回りにある多くの電子機器に「マイコン(マイクロコントローラ)」が搭載されています。その中でも、STマイクロエレクトロニクス社が提供するSTM32シリーズは、高性能かつ豊富なラインナップで、ホビーからプロの製品開発まで幅広く利用されている人気の32bit ARM Cortex-Mマイコンです。
しかし、高性能なマイコンを使いこなすには、適切な開発環境が不可欠です。そこで登場するのが「STM32CubeIDE」です。
STM32CubeIDEとは?
STM32CubeIDEは、STマイクロエレクトロニクスが公式に提供する無料の統合開発環境(IDE: Integrated Development Environment)です。このツールの最大の特徴は、STM32マイコン開発に必要な機能がオールインワンで統合されている点にあります。
- プロジェクト作成とコード自動生成 (STM32CubeMX): GUI操作でマイコンの初期設定やペリフェラル(タイマー、UART、SPIなど)の構成を簡単に行い、初期化コードを自動で生成できます。
- コード編集: 高機能なC/C++エディタを内蔵し、コード補完や構文ハイライト機能で快適なコーディングをサポートします。
- コンパイルとビルド: GCCベースのツールチェインを内蔵し、書いたコードをマイコンが実行できる形式に変換します。
- デバッグ: 実機と接続し、プログラムを一行ずつ実行したり、変数の値やマイコン内部の状態をリアルタイムで確認したりできる強力なデバッガを備えています。
以前は、コード生成ツール「STM32CubeMX」と、コンパイル・デバッグ環境「TrueSTUDIO」などが別々に提供されていましたが、STM32CubeIDEはこれらを一つに統合し、シームレスな開発フローを実現しました。
この記事で学べること
この記事は、STM32マイコン開発に初めて挑戦する方や、他の開発環境からSTM32CubeIDEへ移行を考えている方を対象に、プロジェクトの作成から、コーディング、ビルド、そして実機でのデバッグまでの一連の流れを、具体的な手順と丁寧な解説で網羅的にガイドします。
最終的なゴールは、STM32CubeIDEを使ってLEDを点滅させる、通称「Lチカ(エルチカ)」プログラムを自力で作成し、デバッガの基本的な操作をマスターすることです。この最初のステップを乗り越えれば、あなたはSTM32マイコン開発の大きな一歩を踏み出したことになります。
第1章: 準備編 – STM32CubeIDEのインストールと環境構築
何事もまずは準備から。STM32CubeIDEをPCにインストールし、開発を始めるための環境を整えましょう。
1. STM32CubeIDEのダウンロード
STM32CubeIDEは公式サイトから無料でダウンロードできます。
- Webブラウザで「STM32CubeIDE」と検索するか、STマイクロエレクトロニクスの公式サイトに直接アクセスします。
- 製品ページで「GET SOFTWARE」ボタンをクリックします。
- ライセンス同意画面が表示されるので、内容を確認して「ACCEPT」をクリックします。
- ダウンロードにはSTのアカウントでのログインが必要です。アカウントを持っていない場合は、メールアドレスなどを登録して新規作成してください。ログイン後、ダウンロードが開始されます。
- お使いのOS(Windows, macOS, Linux)に合ったインストーラーをダウンロードします。この記事ではWindows版を基準に解説しますが、他のOSでも手順はほぼ同じです。
2. インストール手順
ダウンロードしたインストーラーを実行して、インストールを開始します。
- インストーラーの実行: ダウンロードした
.exe
ファイルをダブルクリックします。 - ようこそ画面: 「Next」をクリックします。
- ライセンス同意: ライセンス契約書を読み、「I accept the terms of the License Agreement」にチェックを入れて「Next」をクリックします。
- インストール先: インストール先のフォルダを指定します。特に理由がなければデフォルトのままで問題ありません。「Next」をクリックします。
- コンポーネント選択: インストールするコンポーネントを選択します。基本的には全てにチェックが入った状態で問題ありません。特に「ST-LINK and J-Link debugger support」は、実機との接続に必須なので必ずチェックしておきましょう。「Install」をクリックすると、インストールが開始されます。
- ドライバーのインストール: インストール中に「ST-LINK-V2.1/V3 driver」などのデバイスドライバーのインストールを求めるポップアップが表示されることがあります。これらはPCとSTM32評価ボード(Nucleoなど)を接続するために必要なドライバーです。すべて「インストール」を選択してください。
- 完了: インストールが完了したら「Finish」をクリックしてインストーラーを閉じます。デスクトップにSTM32CubeIDEのショートカットアイコンが作成されているはずです。
3. 初期設定とワークスペースの作成
初めてSTM32CubeIDEを起動すると、いくつかの初期設定が必要です。
- 初回起動: デスクトップのアイコンをダブルクリックしてSTM32CubeIDEを起動します。
- ワークスペースの指定: 「Workspace Launcher」というダイアログが表示されます。
- ワークスペースとは?: プロジェクトファイルや設定情報などを保存しておくためのフォルダです。複数のプロジェクトをこの一つのフォルダで管理します。
- 任意の場所を「Browse…」から選択するか、デフォルトのパスのまま「Launch」をクリックします。後からプロジェクトごとに場所を変えることも可能ですが、最初は一つのワークスペースで管理するのが分かりやすいでしょう。「Use this as the default and do not ask again」にチェックを入れると、次回からこのダイアログは表示されなくなります。
- Welcomeページ: 起動すると、中央に「Welcome」ページが表示されます。ここから新規プロジェクトの作成や既存プロジェクトのインポート、ドキュメントへのアクセスなどが可能です。今回は右上の「×」で閉じてしまって構いません。(後から
Help > Welcome
で再度表示できます)
これで、開発を始めるための環境が整いました。次はいよいよ最初のプロジェクトを作成します。
第2章: プロジェクト作成編 – Lチカで学ぶ最初のステップ
STM32開発の第一歩として、評価ボードに搭載されたLEDを点滅させる「Lチカ」プロジェクトを作成します。ここでは、広く普及している評価ボード「NUCLEO-F446RE」を例に進めますが、他のSTM32マイコンや評価ボードでも手順は同様です。
1. 新規STM32プロジェクトの作成
メニューバーからプロジェクト作成ウィザードを起動します。
File > New > STM32 Project
を選択します。- 初回は必要なコンポーネントのダウンロードが始まる場合があります。しばらく待つと「Target Selection」ウィンドウが表示されます。
このウィンドウでは、開発対象となるマイコンやボードを様々な方法で選択できます。
- MCU/MPU Selector タブ: 使用したいマイコンの型番(例:
STM32F446RET6
)が分かっている場合に使います。型番を直接入力して検索できます。 - Board Selector タブ: 使用する評価ボード(Nucleo, Discovery Kitなど)が決まっている場合に便利です。ボード名で検索し、選択するだけで関連するマイコンや設定が自動で読み込まれます。
- Example Selector タブ: 特定のボード向けのサンプルプロジェクト(例: UART通信のサンプル)から始めたい場合に利用します。
今回は「Board Selector」タブを使います。
- 上部の「Commercial Part Number」に
NUCLEO-F446RE
と入力します。 - リストに表示された「NUCLEO-F446RE」を選択し、「Next」をクリックします。
2. プロジェクト名の設定と初期化
次に、プロジェクトの基本的な情報を設定します。
- Project Name: プロジェクトの名前を入力します。英数字で、スペースを含まない分かりやすい名前(例:
L_Blink_F446RE
)が良いでしょう。 - Location: プロジェクトが保存される場所です。デフォルトでは先ほど設定したワークスペースになっています。
- Targeted Language: 使用する言語を選択します。「C」と「C++」が選べますが、今回は「C」を選択します。
- Binary Type: 「Executable」(実行形式ファイル)を選択します。
- Project Type: 「STM32Cube」を選択します。これがCubeMXと連携する標準的なプロジェクト形式です。
- 設定が完了したら「Finish」をクリックします。
すると、2つのポップアップが表示されることがあります。
- Initialize all peripherals with their default Mode?: 「ボード(NUCLEO-F446RE)に搭載されているペリフェラル(ボタンやLEDなど)をデフォルト設定で初期化しますか?」という質問です。ここでは「Yes」を選択すると、ボード固有のピン設定がある程度自動で行われるため便利です。
- Open Associated Perspective?: 「このタイプのファイル(.ioc)を開くための専用画面(パースペクティブ)に切り替えますか?」という質問です。「Yes」を選択すると、GUIでマイコン設定を行う「Device Configuration Tool」画面に切り替わります。
3. Device Configuration Tool (CubeMX) の基本操作
「Device Configuration Tool」は、STM32CubeIDEに統合されたSTM32CubeMXそのものです。ここでマイコンの心臓部であるクロック設定や、手足となるGPIO(汎用入出力ポート)ピンの設定などを、GUIで直感的に行います。
画面は主に4つのタブで構成されています。
- Pinout & Configuration: マイコンのピン配置図を見ながら、各ピンの機能割り当てやペリフェラルの設定を行います。
- Clock Configuration: マイコンの動作速度を決めるクロック系統を、図を見ながら設定します。
- Project Manager: プロジェクト全体の情報や、コード生成に関するオプションを設定します。
- Tools: 消費電力の計算など、補助的なツールを利用できます。
今回はLチカに必要な最低限の設定を行っていきます。
Pinout & Configurationタブ
-
デバッグ機能の有効化(最重要):
- 左側のペイン(Categories)から
System Core > SYS
を選択します。 - 中央の「SYS Mode and Configuration」で、「Debug」のドロップダウンリストから「Serial Wire」を選択します。
- これを設定しないと、プログラムの書き込みやデバッグができなくなります。非常に重要な設定です。ピン配置図上で、
PA13
とPA14
が緑色になり、それぞれSYS_SWDIO
,SYS_SWCLK
という機能が割り当てられたことを確認できます。
- 左側のペイン(Categories)から
-
GPIOピンの設定:
- NUCLEO-F446REボードでは、ユーザーが使える緑色のLEDは
PA5
ピンに接続されています。 - ピン配置図で
PA5
ピンを見つけ、クリックします。 - 表示されるメニューから「GPIO_Output」を選択します。これで、
PA5
ピンが出力モードに設定されます。 - 設定後、
PA5
ピンを右クリックし、「Enter User Label」を選択します。ここでピンに分かりやすい別名(ラベル)を付けることができます。例えばLD2_GREEN
と入力しておきましょう。こうすることで、後でコードを書く際にPA5
というピン番号を直接意識せず、LD2_GREEN
という名前でアクセスできるようになり、可読性が向上します。
- NUCLEO-F446REボードでは、ユーザーが使える緑色のLEDは
Clock Configurationタブ
ここでは、マイコンの動作周波数を設定します。クロックツリーの図が表示され、どこからどのくらいの周波数が供給されているかが一目で分かります。
- HCLK (MHz): この値がCPUの主な動作周波数になります。
- Input frequency: 水晶発振子(HSE)を使うか、内蔵RC発振器(HSI)を使うかなどを選択します。
- PLL: HSIやHSEからのクロックを逓倍(掛け算)して、より高い周波数を生成する回路です。
NUCLEO-F446REボードの場合、デフォルトで最適な設定がされていることが多いです。今回は特に変更せず、デフォルト設定のまま進めます。慣れてきたら、この画面でマイコンの性能を最大限に引き出す設定に挑戦してみましょう。
Project Managerタブ
- Project タブ: プロジェクト名や保存場所などを確認できます。
- Code Generator タブ: コード生成に関する重要な設定があります。
- HAL Settings: 使用するライブラリのバージョンなどが表示されます。
- Generated files:
- 「Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral」にチェックを入れることを強く推奨します。これにチェックを入れると、例えばGPIOなら
gpio.c
,gpio.h
、UARTならusart.c
,usart.h
のように、ペリフェラルごとに初期化コードがファイル分割されて生成されます。これによりmain.c
が肥大化せず、プロジェクトの可読性と管理性が大幅に向上します。
- 「Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral」にチェックを入れることを強く推奨します。これにチェックを入れると、例えばGPIOなら
- Template Settings:
- 「Keep User Code when re-generating」の項目は、STM32CubeIDEの非常に便利な機能の核心です。自動生成されたコードには、
/* USER CODE BEGIN ... */
と/* USER CODE END ... */
というコメントで囲まれた区間が複数用意されています。この区間内にユーザーが記述したコードは、再度CubeMXで設定を変更してコードを自動生成しても消えずに保持されます。この仕組みのおかげで、設定変更のたびにコードを書き直す手間が省けます。
- 「Keep User Code when re-generating」の項目は、STM32CubeIDEの非常に便利な機能の核心です。自動生成されたコードには、
4. コードの自動生成
全ての設定が完了したら、いよいよ初期化コードを生成します。
- メニューバーの
Project > Generate Code
を選択するか、ツールバーの歯車アイコンをクリックします。または、単にCtrl + S
で設定ファイル(.ioc)を保存するだけでも、コード生成を促すダイアログが表示されます。 - 「Do you want to generate code?」と聞かれたら「Yes」をクリックします。
コンソールに生成ログが表示され、しばらくすると完了します。左側の「Project Explorer」ビューを見ると、プロジェクト内に多数のフォルダとファイルが生成されていることが確認できます。
Core/Inc
,Core/Src
:main.c
をはじめ、主要なソースコードとヘッダファイルが格納されます。Drivers
: STM32のHAL(Hardware Abstraction Layer)ライブラリやCMSIS(Cortex Microcontroller Software Interface Standard)関連のファイルが格納されます。HALライブラリは、複雑なレジスタ操作を隠蔽し、HAL_GPIO_WritePin()
のような分かりやすい関数でハードウェアを操作できるようにしてくれる便利なライブラリです。L_Blink_F446RE.ioc
: 先ほど設定したCubeMXの設定ファイルです。これをダブルクリックすれば、いつでも設定画面に戻ることができます。
これで、Lチカプログラムを書くための土台が完成しました。
第3章: コーディング編 – Lチカプログラムの実装
自動生成されたコードをベースに、LEDを点滅させるためのロジックを追記していきます。
1. 生成されたコードの構造を理解する
「Project Explorer」で Core/Src
フォルダを展開し、main.c
ファイルをダブルクリックして開きます。中身を見てみましょう。
“`c
/ Includes ——————————————————————/
include “main.h”
include “gpio.h” // ペリフェラルごとにファイルを生成する設定にしたため追加されている
/ Private includes ———————————————————-/
/ USER CODE BEGIN Includes /
/ USER CODE END Includes /
// (中略)
int main(void)
{
/ USER CODE BEGIN 1 /
/ USER CODE END 1 /
/ MCU Configuration——————————————————–/
/ Reset of all peripherals, Initializes the Flash interface and the Systick. /
HAL_Init();
/ USER CODE BEGIN Init /
/ USER CODE END Init /
/ Configure the system clock /
SystemClock_Config();
/ USER CODE BEGIN SysInit /
/ USER CODE END SysInit /
/ Initialize all configured peripherals /
MX_GPIO_Init();
/ USER CODE BEGIN 2 /
/ USER CODE END 2 /
/ Infinite loop /
/ USER CODE BEGIN WHILE /
while (1)
{
/ USER CODE END WHILE /
/* USER CODE BEGIN 3 */
}
/ USER CODE END 3 /
}
“`
main()
関数の中身は、大まかに以下の流れになっています。
HAL_Init()
: HALライブラリ全体を初期化します。必須の関数です。SystemClock_Config()
: CubeMXのClock Configurationタブで設定した内容に基づき、システムクロックを初期化します。MX_GPIO_Init()
: CubeMXのPinout & Configurationタブで設定した内容に基づき、GPIOピンを初期化します。while(1)
: 無限ループです。マイコンプログラムは、PCアプリケーションのように終了することはなく、電源が供給されている限りこのループの中の処理を永遠に繰り返します。ここにメインの処理を記述します。
そして、至る所に /* USER CODE BEGIN/END */
のコメントブロックがあるのが分かります。私たちが独自のコードを追記するのは、必ずこのブロックの中です。
2. Lチカのコードを記述する
今回は、while(1)
ループの中でLEDをON/OFFする処理を記述します。LEDを一定間隔で点滅させるには、「状態を反転させる」→「一定時間待つ」という処理を繰り返せばよいでしょう。
HALライブラリには、そのための便利な関数が用意されています。
HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
: 指定したピンの出力状態(High/Low)を反転させます。HAL_Delay(uint32_t Delay)
: 指定したミリ秒(ms)の間、プログラムの実行を停止させます。
これらの関数を使って、main.c
の while(1)
ループ内にコードを追記します。CubeMXで PA5
ピンに LD2_GREEN
というラベルを付けたのを思い出してください。このラベル名を使うと、コードは以下のようになります。
“`c
/ Infinite loop /
/ USER CODE BEGIN WHILE /
while (1)
{
/ USER CODE END WHILE /
/ USER CODE BEGIN 3 /
// ここから追記
HAL_GPIO_TogglePin(LD2_GREEN_GPIO_Port, LD2_GREEN_Pin);
HAL_Delay(500); // 500ms (0.5秒) 待機
// ここまで追記
}
/ USER CODE END 3 /
“`
LD2_GREEN_GPIO_Port
と LD2_GREEN_Pin
は、CubeMXが main.h
の中に自動で #define
してくれたマクロです。これにより、GPIOA
や GPIO_PIN_5
といった具体的な名前を直接書く必要がなくなり、コードが非常に分かりやすくなります。
3. ビルド (コンパイルとリンク)
コードの記述が終わったら、これをマイコンが理解できる機械語の形式に変換する必要があります。この工程を「ビルド」と呼びます。
- メニューバーの
Project > Build All
を選択するか、ツールバーのハンマーのアイコンをクリックします。 - ビルドが開始され、画面下部の「Console」ウィンドウに処理のログが流れます。
- 最後に
Build Finished. 0 errors, 0 warnings.
のようなメッセージが表示されればビルド成功です!
ビルドに成功すると、プロジェクトフォルダ内の Debug
フォルダ(または Release
フォルダ)に、いくつかのファイルが生成されます。
.elf
ファイル: プログラム本体とデバッグ情報を含んだファイル。デバッガが使用します。.hex
ファイル,.bin
ファイル: プログラム本体のみのバイナリファイル。書き込みツールで直接マイコンに書き込む際に使われます。
これで、マイコンに書き込む準備が整いました。
第4章: デバッグ編 – 実機で動かしながら検証する
プログラムを実機に書き込み、意図通りに動作するかを確認します。STM32CubeIDEの強力なデバッグ機能を使い、プログラムの内部を覗きながら動作を追ってみましょう。
1. ハードウェアの接続
- NUCLEO-F446REボードとPCをUSBケーブルで接続します。
- NUCLEOボードには「ST-LINK」というデバッガ/プログラマが搭載されているため、このUSBケーブル一本でプログラムの書き込みとデバッグの両方が可能です。
- PCがボードを正しく認識すると、ボード上の電源LEDが点灯し、Windowsのデバイスマネージャーで「ポート(COM & LPT)」や「ユニバーサル シリアル バス デバイス」の下に「ST-LINK Virtual COM Port」や「STMicroelectronics STLink Virtual Debug Port」などが表示されます。
2. デバッグ構成の作成と確認
プログラムをデバッグ実行するには、「デバッグ構成(Debug Configuration)」が必要です。これは、どのデバッガを使い、どのようにプログラムを書き込み、どこから実行を開始するかなどを定義した設定です。
通常、最初のデバッグ実行時に自動で作成されますが、念のため手動での確認方法も知っておきましょう。
- メニューバーの
Run > Debug Configurations...
を選択します。 - 左側のペインで「STM32 C/C++ Application」をダブルクリックするか、既存の構成(プロジェクト名と同じ名前のもの)を選択します。
- Debugger タブ:
- Debug probe: 「ST-LINK (ST-LINK GDB server)」が選択されていることを確認します。
- Interface: 「SWD」が選択されていることを確認します。(SYS設定でSerial Wireを選んだので)
- Reset behavior: 「Software system reset」が一般的です。プログラム書き込み後にマイコンをリセットして、プログラムの先頭から実行を開始します。
- Startup タブ:
- プログラムのロードや実行開始点に関するスクリプトが設定されています。通常は変更する必要はありません。
基本的には自動生成された設定のままで問題ありません。
3. デバッグの開始と基本操作
いよいよデバッグを開始します。
- メニューバーの
Run > Debug
を選択するか、ツールバーの虫のアイコンをクリックします。(またはショートカットキーF11
) - プログラムがビルドされ、マイコンへの書き込みが始まります。
- 「Confirm Perspective Switch」というダイアログが表示されます。「デバッグに適した画面レイアウト(デバッグパースペクティブ)に切り替えますか?」という確認です。「Remember my decision」にチェックを入れて「Switch」をクリックします。
画面レイアウトがガラッと変わり、デバッグ用の様々なウィンドウが表示されます。
- Debug ウィンドウ (左上): 現在のプログラムの実行状態(一時停止中か実行中か)、コールスタック(どの関数からどの関数が呼ばれているか)などが表示されます。
- Variables ウィンドウ (右上): 現在のスコープにあるローカル変数やグローバル変数の値の一覧が表示されます。プログラムを一行ずつ進めると、ここの値が変化していくのを確認できます。
- Expressions ウィンドウ (右上): 任意の変数や式を登録して、その値を常に監視できます。
- SFRs / Peripherals ウィンドウ (右上): マイコン内部の特殊機能レジスタ(SFR)の状態を直接見ることができます。GPIOの出力データレジスタ(ODR)など、ハードウェアレベルでの動作確認に非常に強力です。
- Code ウィンドウ (中央): ソースコードが表示されます。緑色の矢印とハイライトで、次に実行される行を示します。
- Console ウィンドウ (下部): デバッガからのメッセージなどが表示されます。
ツールバーには、デバッグ操作用のアイコンが並びます。
Resume (F8): プログラムの実行を再開します。次のブレークポイントに到達するか、手動でSuspendするまで実行し続けます。
Suspend: 実行中のプログラムを任意の位置で一時停止します。
Terminate (Ctrl+F2): デバッグセッションを終了します。プログラムはマイコンに残りますが、PCとの接続は切断されます。
Step Into (F5): 現在の行を実行し、もしその行が関数呼び出しであれば、その関数の中に処理を進めます。
Step Over (F6): 現在の行を実行します。もしその行が関数呼び出しでも、関数の中には入らずに、関数が終了した次の行で停止します。HALライブラリの関数など、中身を詳しく見る必要がない場合に多用します。
Step Return (F7): 現在実行中の関数を最後まで実行し、呼び出し元の次の行で停止します。
4. ブレークポイントと変数監視
デバッグの最も強力な機能の一つが「ブレークポイント」です。これは、プログラム中に仕掛ける「一時停止ポイント」です。
- ブレークポイントの設定: コードウィンドウで、
HAL_Delay(500);
の行の左端にある行番号のあたりをダブルクリックします。青い丸印が表示され、ブレークポイントが設定されます。 - 実行: Resume (F8) をクリックします。プログラムは
HAL_GPIO_TogglePin
を実行した後、ブレークポイントを設定したHAL_Delay
の手前でピタッと停止します。このとき、ボード上の緑色LEDの状態が反転しているはずです。 - 再実行: もう一度 Resume (F8) をクリックします。プログラムは
HAL_Delay
を実行し、while
ループの先頭に戻り、次のHAL_GPIO_TogglePin
を実行し、再びブレークポイントで停止します。LEDの状態がまた反転したことを確認できます。 - 変数監視: 例えば、ループ回数をカウントする変数を追加してみましょう。
main.c
のUSER CODE BEGIN 2
の領域にuint32_t loop_count = 0;
と変数を定義し、while
ループの中でloop_count++;
とインクリメントするコードを追加します。再度デバッグを開始し、ブレークポイントで停止するたびに「Variables」ウィンドウでloop_count
の値が1ずつ増えていく様子を観察できます。
5. SFRs (Special Function Registers) の活用
HAL関数が内部で何をしているのか、ハードウェアレベルで確認してみましょう。
Window > Show View > SFRs
を選択します。(すでに表示されている場合は不要)- SFRsウィンドウのツリーから
GPIO
->GPIOA
->ODR
(Output Data Register) を見つけます。ODRは、GPIOポートの出力状態を保持するレジスタです。 HAL_GPIO_TogglePin
の行を Step Over (F6) で実行する前後で、ODRレジスタの値がどう変化するか注目してください。PA5
に対応するビット(Bit 5)が0
から1
へ、1
から0
へと反転するのが確認できるはずです。
このように、デバッガを使えば、プログラムの論理的な流れだけでなく、それがハードウェアにどのように影響を与えているかまでを詳細に追跡できます。これがデバッグの醍醐味であり、問題解決の鍵となります。
デバッグを終了するには、Terminate (Ctrl+F2) をクリックします。これでIDEは編集用のパースペクティブに戻ります。マイコンにはプログラムが書き込まれたままなので、ボードのリセットボタンを押せば、デバッガから切り離された状態でLチカプログラムが単独で動作し始めます。
第5章: 応用編 – STM32CubeIDEの便利な機能
基本的な流れをマスターしたら、さらに開発を効率化する便利な機能も見ておきましょう。
1. CubeMXへの再アクセスとコードの再生成
開発途中で「UART通信も追加したい」「タイマーを使いたくなった」といった要求が出てくるのは日常茶飯事です。そんな時もSTM32CubeIDEなら安心です。
- プロジェクトエクスプローラーで、プロジェクトのルートにある
.ioc
ファイル(例:L_Blink_F446RE.ioc
)をダブルクリックします。 - 見慣れたDevice Configuration Toolの画面が開きます。
- ここで、例えば
Connectivity > USART2
を有効にするなど、新たな設定を追加・変更します。 - 設定が終わったら
Ctrl + S
で保存し、コードを再生成します。 USER CODE
ブロックに書いたLチカのコードはそのまま保持され、usart.c
/usart.h
といったファイルや、main.c
内のMX_USART2_UART_Init();
の呼び出しなどが新たに追加されます。
この「設定変更 → コード再生成」のサイクルを、ユーザーコードを破壊することなく安全に行えるのが、STM32Cubeエコシステムの最大の強みです。
2. Serial Wire Viewer (SWV) によるprintfデバッグ
デバッグにはブレークポイントだけでなく、古くから printf
による値の表示も有効な手段です。SWV機能を使うと、ST-LINKのデバッグ信号線(SWOピン)を通じて、マイコンからPCへ文字列をリアルタイムに送信できます。これにより、プログラムの実行を止めずに printf
の内容を確認できます。
- CubeMX設定:
SYS > Debug
をTrace Asynchronous Sw
に設定します。 - コード修正:
printf
の出力をITM(Instrumentation Trace Macrocell)にリダイレクトするためのコードをmain.c
に追記します。(syscalls.cのインクルードと特定の関数の実装が必要) - デバッグ構成:
Debug Configurations > Debugger
タブでSerial Wire Viewer (SWV)
にチェックを入れ、Core Clock
にHCLKの周波数を正しく入力します。 - コンソール表示: デバッグ中に
Window > Show View > SWV > SWV ITM Data Console
を表示し、Start Trace
ボタンを押します。 - これで、プログラム中の
printf("Loop count: %d\n", loop_count);
のようなコードの出力が、このコンソールに表示されるようになります。
3. Static Stack Analyzer
マイコンプログラミングで注意すべき問題の一つに「スタックオーバーフロー」があります。これは、関数呼び出しやローカル変数の使用によって、確保されたスタック領域を使い切ってしまい、プログラムが暴走する現象です。
STM32CubeIDEには、ビルド時にスタック使用量を静的に解析する機能があります。ビルド後、.map
ファイルや専用のビューで、どの関数がどれくらいスタックを消費するかの見積もりを確認でき、潜在的なリスクを事前に把握するのに役立ちます。
まとめ
この記事では、STM32CubeIDEという強力な統合開発環境を使い、STM32マイコン開発の第一歩を踏み出すための全工程を詳細に解説しました。
- 環境構築: IDEのインストールとワークスペースの作成
- プロジェクト作成: CubeMXのGUIを使い、ボードやマイコンを選択し、ペリフェラル(GPIO, SYS)を設定
- コード生成: HALライブラリを使った初期化コードをワンタッチで自動生成
- コーディング:
USER CODE
ブロックの重要性を理解し、LチカのロジックをHAL関数で実装 - ビルド: 書いたコードをマイコンが実行できる形式に変換
- デバッグ: 実機にプログラムを書き込み、ブレークポイント、変数監視、レジスタ監視といったデバッガの基本操作をマスター
Lチカは単純なプログラムですが、この一連のフローを自力で完遂できたことは、あなたがSTM32マイコン開発者として大きな一歩を踏み出した証です。
ここから先は、あなたのアイデア次第で無限の可能性が広がっています。UARTでPCと通信する、ADCでセンサーの値を読み取る、タイマーとPWMでモーターを制御する、FreeRTOSなどのリアルタイムOSを導入してより複雑な処理に挑戦するなど、次のステップに進んでみましょう。
STM32CubeIDEと、その背景にある広大なSTM32エコシステムは、あなたの「作りたい」という思いを力強くサポートしてくれるはずです。公式ドキュメントやユーザーコミュニティも積極的に活用し、マイコン開発の世界を存分に楽しんでください。