本項では動作の確認に使用するプログラムLED1を説明します。ターゲットのCPUはArm製Cortex-M33で、プログラム全体をアセンブリ言語で記述して簡単な構造にしています。
動作はマイコン開発ボード:NUCLEO-H503RBのLD2を1秒周期で点滅(0.5秒点灯、0.5秒消灯)します(いわゆるLチカです)。アセンブリ言語のソースコードは「4.3 ソースファイル作成」に記載しています。
下図のフローチャートを使って、プログラムの内容を簡単に書きます。
リセットが解除されると、リセットハンドラーを実行します。
リセットハンドラーは、スタックリミットレジスタにスタックの下限アドレスを設定します。スタックリミットチェック機能をCPUが持っているので[1]、下限を超えてスタックを使う可能性はないですが一応設定しています。その後、メイン処理へ分岐します。
メイン処理は、まず周辺機能初期設定サブルーチンを呼びます。周辺機能初期設定サブルーチンではLD2を制御しているPA5ポートが属しているGPIOAモジュールへのクロック供給を有効に設定し、PA5ポートのモードを汎用出力に設定します。設定が終わるとメイン処理に戻ります。
周辺機能初期設定サブルーチンから戻ってきたメイン処理は、「LD2点灯 → 500ms遅延サブルーチンを呼ぶ → LD2消灯 → 500ms遅延サブルーチンを呼ぶ」を繰り返します。
500ms遅延サブルーチンは、カウンタ値を1減算する命令を5,333,333回繰り返して戻ります。この繰り返しに500msかかり、LD2を点滅させる周期(0.5秒点灯、0.5秒消灯)になります。
ダミーハンドラーは、リセットと割り込みを除いた例外が発生したときに実行して、無限ループになります。万が一、ハードやソフトの異常をCPUが検知した場合に備えて用意しています。


Arm製Cortex-M33におけるベクターテーブルでの例外ベクターの仕様と[2]、動作確認用プログラムLED1での値を下表に示します。
| Cortex-M33の仕様 | 動作確認用プログラムLED1での 例外ベクターの値、 スタックポインター初期値の値 |
|||
|---|---|---|---|---|
| 例外 番号 |
IRQ 番号 |
ベクター オフセット |
例外ベクター名 | |
| - | - | 0x000 | スタックポインター初期値 | 0x2000 8000(SRAM2の最上位アドレス+1) |
| 1 | - | 0x004 | リセット | リセットハンドラーの先頭番地 |
| 2 | -14 | 0x008 | NMI | ダミーハンドラーの先頭番地 |
| 3 | -13 | 0x00C | HardFault | ダミーハンドラーの先頭番地 |
| 4 | -12 | 0x010 | MemManage | ダミーハンドラーの先頭番地 |
| 5 | -11 | 0x014 | BusFault | ダミーハンドラーの先頭番地 |
| 6 | -10 | 0x018 | UsageFault | ダミーハンドラーの先頭番地 |
| ┋ | ┋ | ┋ | 予約 | 設定なし |
| 11 | -5 | 0x02C | SVCall | ダミーハンドラーの先頭番地 |
| 12 | -4 | 0x030 | DebugMonitor | ダミーハンドラーの先頭番地 |
| ┋ | ┋ | ┋ | 予約 | 設定なし |
| 14 | -2 | 0x038 | PendSV | ダミーハンドラーの先頭番地 |
| 15 | -1 | 0x03C | SysTick | ダミーハンドラーの先頭番地 |
| ┋ | ┋ | ┋ | 各種割り込み | 設定なし |
プログラムLED1の補足
スタックポインター(SP)の初期値設定はリセットハンドラーで行うことが多いと思うのですが、プログラムLED1では命令を使った初期値設定をしていません。Arm製Cortex-M33ではスタックポインター(SP)のリセット後の初期値としてベクターテーブルのベクターオフセット0x000の値がセットされます[3]。ですからベクターオフセット0x000に0x2000 8000(SRAM2の最上位アドレス+1)を置いています。他のCPUのように命令を使って設定する必要はありません。
次項よりプログラムLED1を使ってCPUの動作を確認します。
[1] Arm Limited.Arm® Cortex®-M33 Devices Generic User Guide.Issue 0100-06.1 August 2024,2.1.3.3 Stack limit registers.p.22.
[2] Arm Limited.Arm® Cortex®-M33 Devices Generic User Guide.Issue 0100-06.1 August 2024,2.3.4 Vector table.p.51-52.
[3] Arm Limited.Arm®v8-M Architecture Reference Manual.Version B.y.2024/Aug/09,B3.30 Vector tables.p.141.
メカトロ制御向け CPUの構造と動作
2.2 動作確認用プログラムLED1の説明 ← 現在のページ