本章ではSTマイクロエレクトロニクス製の統合開発環境STM32CubeIDEを設定し、動作の確認に使用するプログラム「LED1」をマイコン開発ボードNUCLEO-H503RBへダウンロードする手順を書きます。これは「2 動作の確認 その1」の準備になります。
ここで行う手順はSTM32CubeIDEが持っているプログラムの自動生成機能やライブラリを使わないやり方で、普通のプログラム開発でのやり方とは異なっています。せっかく用意されている機能を使わなくて申し訳ないですが、これは動作の確認をやりやすくするためにプログラム全体をアセンブリ言語で記述して簡単な構造にするためです。
使用したSTM32CubeIDEのバージョンは1.19.0です。パソコンのOSはWindows11です。
内容
- 4.1 インストール
- 4.2 プロジェクト作成
- 4.3 ソースファイル作成
- 4.4 リンカースクリプトファイル作成
- 4.5 ビルド設定
- 4.6 ビルド実行
- 4.7 デバッグ設定
- 4.8 プログラムダウンロードとデバッガー起動
- 4.9 終了とデバッガー再起動
4.1 インストール
STM32CubeIDEをパソコンにインストールしていない場合は、STマイクロエレクトロニクスがWebサイトで公開している(2025/09/01時点)インストーラーをダウンロードして、License Agreementを確認の上パソコンにインストールしてください。
4.2 プロジェクト作成
LED1プロジェクトを作成します。プロジェクトはソースファイルやビルドで生成されたファイル、ツールの設定ファイルなどを管理するフォルダです。STM32CubeIDEの起動時に設定するワークスペースの下に作られます。
1)STM32CubeIDEを起動します。
ワークスペースはデフォルトの"C:¥Users¥<ユーザ名>¥STM32CubeIDE¥workspace_1.19.0"を使用しましたが、他でもよいと思います。
STM32CubeIDEを起動後にInformation Centerのタブを閉じるとProject Explorerのタブが開きます。
2)File → New → C/C++ Project をクリックし「Templates for New C/C++ Project」のウィンドウを開きます。ここで「C Managed Build」を選択し「Next」をクリックします。

3)「C Project」のウィンドウで下記を設定し、「Next」をクリックします。
4)「Select Configurations」ウィンドウではDebugとReleaseをチェックしたまま、「Next」をクリックします。

5)「Select default target for the project」ウィンドウのMCU欄で「STM32H503RBTx」を選択して「Finish」をクリックします。
4.3 ソースファイル作成
「LED1」のプロジェクト(フォルダ)の下に「src」フォルダを作成し、さらにその下にアセンブリ言語プログラムファイルの「LED1.s」ファイルを作成します。
1)Project ExplorerのLED1をクリックして選択しておき、File → New → Folder をクリックして「Folder」ウィンドウを開きます。Folder nameに「src」と入力して「Finish」をクリックします。
2)Project Explorerのsrcをクリックして選択しておき、File → New → Source File をクリックして「Source File」ウィンドウを開きます。下記の設定をして「Finish」をクリックします。
・Source folder:LED1/src ←デフォルトのまま
・Source File:LED1.s
・Template:<None>
Project Explorerに「LED1.s」のファイルが追加されます。


3)STM32CubeIDEの中央のエディタウィンドウにLED1.sが開いているのでソースコードを入力します。入力後、File → Save をクリックして保存します。
NUCLEO-H503RBボードのLD2を1秒周期で点滅します。(0.5秒点灯、0.5秒消灯の繰り返し)
//
// LED1.s
// NUCLEO-H503RBボード用LD2点滅ソフト
//
.syntax unified
.text
.global Reset_Handler
.equ SP_init,0x20008000 //スタックポインタ初期値
.equ SP_limit,0x20007000 //スタックポインタ下限
.equ RCC,0x44020C00 //RCCレジスタベースアドレス
.equ of_AHB2ENR,0x8C //AHB2ENRレジスタ アドレスオフセット
.equ v_AHB2ENR,0x40000001 //RCC_AHB2ENR設定値 GPIOAEN=クロック有効
.equ GPIOA,0x42020000 //GPIOAレジスタベースアドレス
.equ of_MODER,0x0 //MODERレジスタ アドレスオフセット
.equ of_BSRR,0x18 //BSRRレジスタ アドレスオフセット
.equ of_BRR,0x28 //BRRレジスタ アドレスオフセット
.equ v_A_MODER,0xABFFF7FF //GPIOA_MODER設定値 MODE5=汎用出力
.equ loop500ms,5333333 //Delay_500msのループ回数
// ベクターテーブル
Vecter_Table:
.word SP_init //初期スタックポインタ
.word Reset_Handler //初期プログラムカウンタ
.word dummy_Handler //NMI_Handler
.word dummy_Handler //HardFault_Handler
.word dummy_Handler //MemManageFault_Handler
.word dummy_Handler //BusFault_Hamdler
.word dummy_Handler //UsageFault_Handler
.org 0x2c
.word dummy_Handler //SVCall_Handler
.word dummy_Handler //DebugMonitor_Handler
.org 0x38
.word dummy_Handler //PendSV_Handler
.word dummy_Handler //SysTick_Handler
// リセットハンドラー
.type Reset_Handler, %function
Reset_Handler:
//スタック下限値設定
MOVW R0,#:lower16:SP_limit //スタックポインタ下限値
MOVT R0,#:upper16:SP_limit
MSR MSPLIM,R0 //スタックリミットレジスタ書き込み
//メイン処理へ分岐
B Main //Mainへ分岐
// ダミーハンドラー
.type dummy_Handler, %function
dummy_Handler:
//無限ループ
B . //現在のアドレスへ分岐
// メイン処理
Main:
//周辺機能初期設定
BL PERI_init //サブルーチン 周辺機能初期設定呼び出し
//GPIOAレジスタベースアドレス、PA5ビット設定
MOVW R0,#:lower16:GPIOA //GPIOAレジスタベースアドレス
MOVT R0,#:upper16:GPIOA
MOVS R1,#1<<5 //bit5(OD5)=1:LD2点灯
loop1:
//LD2点灯
STR R1,[R0,#of_BSRR] //GPIOAビットセット/リセットレジスタ書き込み
//500ms待つ
BL Delay_500ms //サブルーチン 500ms遅延呼び出し
//LD2消灯
STR R1,[R0,#of_BRR] //GPIOAビットリセットレジスタ書き込み
//500ms待つ
BL Delay_500ms //サブルーチン 500ms遅延呼び出し
//繰り返し
B loop1 //loop1へ分岐
// サブルーチン 500ms遅延
Delay_500ms:
//レジスタ退避
PUSH {R0}
//カウンタ値設定
MOVW R0,#:lower16:loop500ms //R0レジスタにカウンタ値設定
MOVT R0,#:upper16:loop500ms
.align 4 //ループの先頭アドレスを16Byte境界に置く
loop2:
//カウンタ値1減算
SUBS R0,#1 //R0レジスタから1減算
//カウンタ値が0でなければ減算を繰り返す
BNE loop2 //0で無ければloop2へ分岐
//レジスタ復帰
POP {R0}
//サブルーチンから復帰
BX LR
// サブルーチン 周辺機能初期設定
PERI_init:
//レジスタ退避
PUSH {R0,R1}
//RCC GPIOAクロック設定:有効
MOVW R0,#:lower16:RCC //RCCレジスタベースアドレス
MOVT R0,#:upper16:RCC
MOVW R1,#:lower16:v_AHB2ENR //RCC_AHB2ENR設定値
MOVT R1,#:upper16:v_AHB2ENR
STR R1,[R0,#of_AHB2ENR] //RCC_AHB2ENRレジスタ書き込み
//GPIOA PA5モード設定:汎用出力
MOVW R0,#:lower16:GPIOA //GPIOAレジスタベースアドレス
MOVT R0,#:upper16:GPIOA
MOVW R1,#:lower16:v_A_MODER //GPIOAモード設定値
MOVT R1,#:upper16:v_A_MODER
STR R1,[R0,#of_MODER] //GPIOA_MODERレジスタ書き込み
//レジスタ復帰
POP {R0,R1}
//サブルーチンから復帰
BX LR
// プログラムエンド
.end

4.4 リンカースクリプトファイル作成
「LED1」のプロジェクト(フォルダ)の下にリンカースクリプトファイルの「LinkerScript.ld」を作成します。
1)Project ExplorerのLED1をクリックして選択しておき、File → New → Other... をクリックして「Select a wizard」ウィンドウを開きます。
General → File を選択して「Next」をクリックします。

2)「File」ウィンドウでFile nameに「LinkerScript.ld」を設定して、「Finish」をクリックします。
Project Explorerに「LinkerScript.ld」のファイルが追加されます。
LinkerScript.ldファイルはLED1の直下(srcと同階層)であることを確認しておきます。もし、srcの下だったら削除して作り直します。


3)エディタウィンドウにLinkerScript.ldが開いているのでリンカースクリプトを入力します。入力後、File → Save をクリックして保存します。
入力するリンカースクリプトを下記に示します。
エントリーポイントとプログラムをロードするアドレスを設定しています。
ENTRY (Reset_Handler)
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x20000
}
SECTIONS
{
.text :
{
KEEP( * ( .text ) )
} >FLASH
}

4.5 ビルド設定
リンク時に不要なコードの追加を止めるために標準のシステム スタートアップ ファイルやライブラリの使用を止める設定を行います。
1)Project ExplorerのLED1をクリックして選択しておき、File → Properties をクリックして「Properties for LED1」ウィンドウを開きます。
次にC/C++ Build → Settings をクリックし、Tool SettingsタブのMCU/MPU GCC Linker のGeneralをクリックして下記にチェックを入れます。
・No startup or default libs(-nostdlib)
最後に「Apply and Close」をクリックします。

2)インデックスを今すぐ再構築するか聞いてきたら、「Rebuild Index」をクリックします。

4.6 ビルド実行
ソースファイルからマイコン開発ボードにダウンロードするオブジェクトファイルを作成します。
1)Project ExplorerのLED1を右クリックしてメニューを開き、「Build Project」をクリックします。
4.7 デバッグ設定
下記の2つの設定を行います。
・トレース機能を使うためにSWVを有効にします。
・リセット解除時はベクターテーブルからスタートアドレスを読み込み、読み込んだ後CPUを停止します。
1)Project ExplorerのLED1を右クリックしてメニューを開き、Debug As → Debug Configurations... をクリックして「Create, marge, and run configurations」ウィンドウを開きます。
STM32 C/C++ Application を選択してNew Configurationボタン
を押します。

STM32 C/C++ Applicationの下にLED1 Debugが作られます。

2)Mainタブはデフォルトのままで変更なしです。
3)デバッガタブで下記の設定を変更します。縦スクロールすると項目が見えました。
4)Startupタブで下記の設定を変更します。
Runtime Options
・Start AddressのSpecify vector tableにチェックを入れ、「8000000」を記入
・Set breakpoint at:のチェックを外す
・Resumeのチェックを外す

5)Sourceタブ、Commonタブはデフォルトのままで変更なしです。
6)「Apply」をクリックして、「Close」をクリックします。
LED1 Debug.launchファイルがLED1の下に作られます。

4.8 プログラムダウンロードとデバッガー起動
マイコン開発ボードにプログラムをダウンロードして実行します。
1)NUCLEO-H503RBボードのコネクタCN1:ST-LINK USB Type-Cコネクタとパソコンをつなぎます。
パソコンのエクスプローラで「NOD_H503RB」がドライブに接続していることがわかります。
2)Project ExplorerのLED1を右クリックしてメニューを開き、Debug As → 2 STM32 C/C++ Application をクリックしてデバッガーを起動します。

内蔵FlashROMへプログラムがダウンロードされます。ボードのLD1が赤と緑の表示を繰り返していてST-Linkが通信中であることを示しています。デバッガーの起動中はいつも赤と緑の表示を繰り返しています。
パースペクティブの切り替えの確認が表示されたら「Switch」をクリックしてデバッグ パースペクティブに切り替えます。


3)ツールバーの
Resume をクリックするとプログラムの実行が始まり、LD2が1秒周期で点滅を繰り返します。
4)CPUにリセットをかけた後プログラムを停止した状態(デバッガーを起動した直後と同じ状態)にする設定をします。
デバッグ パースペクティブにいるときに Run → Restart Configurations... をクリックしてRestart configurationsのウィンドウを開きます。「Start application」にチェックが入っているのでこのチェックを外します。OKをクリックするとCPUにリセットがかかりプログラムを停止した状態になります。
「Start application」のチェックを外したことはプロジェクトごとに保存されるようで、LED1プロジェクトでは次回からはツールバーの
Reset the chip and restart debug sessionアイコンをクリックするだけでCPUにリセットがかかりプログラムを停止した状態になります。

5)再度、ツールバーの
Resumeアイコンをクリックするとプログラムの実行が始まります。
そして、ツールバーの
Suspendアイコンをクリックするとプログラムが停止します。
また、ツールバーの
Terminateアイコンをクリックするとデバッガーが終了し、C/C++ パースペクティブに戻ります。
6) 3)、4)、5)に書いたものを含め、デバッグ パースペクティブでよく使うツールバーのアイコン一覧
Resume:プログラムの実行
Suspend:プログラムの実行停止
Terminate:デバッガーの終了
Reset:CPUのリセット
Step Into:1命令実行して停止
4.9 終了とデバッガー再起動
STM32CubeIDEの終了とデバッガーの再起動です。
1)STM32CubeIDEを終了するときは、File → Exit をクリックします。
2)デバッガーを再起動するときは、STM32CubeIDEを起動し「4.8 プログラムダウンロードとデバッガー起動」の手順で行います。
以上で、統合開発環境STM32CubeIDEの設定:LED1は終わりです。
メカトロ制御向け CPUの構造と動作
4 統合開発環境STM32CubeIDEの設定:LED1 ← 現在のページ







