k-ogawa2025’s ブログ

メカトロ制御回路設計に関する情報発信ブログ

4 統合開発環境STM32CubeIDEの設定:LED1

本章ではSTマイクロエレクトロニクス製の統合開発環境STM32CubeIDEを設定し、動作の確認に使用するプログラム「LED1」をマイコン開発ボードNUCLEO-H503RBへダウンロードする手順を書きます。これは「2 動作の確認 その1」の準備になります。

ここで行う手順はSTM32CubeIDEが持っているプログラムの自動生成機能やライブラリを使わないやり方で、普通のプログラム開発でのやり方とは異なっています。せっかく用意されている機能を使わなくて申し訳ないですが、これは動作の確認をやりやすくするためにプログラム全体をアセンブリ言語で記述して簡単な構造にするためです。

使用したSTM32CubeIDEのバージョンは1.19.0です。パソコンのOSはWindows11です。

内容


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」をクリックします。

・Project name:LED1
・Project type:Executable ー Empty Project ←デフォルトのまま
・Toolchains:MCU ARM GCC

4)「Select Configurations」ウィンドウではDebugとReleaseをチェックしたまま、「Next」をクリックします。

5)「Select default target for the project」ウィンドウのMCU欄で「STM32H503RBTx」を選択して「Finish」をクリックします。

Project Explorerに「LED1」のプロジェクト(フォルダ)が追加されます。

4.3 ソースファイル作成

「LED1」のプロジェクト(フォルダ)の下に「src」フォルダを作成し、さらにその下にアセンブリ言語プログラムファイルの「LED1.s」ファイルを作成します。

1)Project ExplorerのLED1をクリックして選択しておき、File → New → Folder をクリックして「Folder」ウィンドウを開きます。Folder nameに「src」と入力して「Finish」をクリックします。

Project Explorerに「src」のフォルダと「Includes」のフォルダが追加されます。

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」をクリックします。

DebugフォルダがLED1の下に作られて、オブジェクトファイルのLED1.elf、逆アセンブルリストのLED1.listなどが作られます。

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)デバッガタブで下記の設定を変更します。縦スクロールすると項目が見えました。

シリアル ワイヤ ビューア(SWV

・有効にチェックを入れる

・Core Clock(MHz):32

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の構造と動作