STM32N657はArm Cortex-M55コア搭載のSTM32マイコンです。メーカ純正の開発ボード STM32N6570-DK (Discovery kit) では最初からTrustZoneが有効となっており、これまでのSTM32のプログラム開発と少し違いがあったので記事としてまとめました。
前回はSTM32CubeMXを用いてSTM32N657-DK用のプロジェクトを新規作成し、STM32CubeIDEにインポートするまでを説明しました。
1回目が終わった段階で、STM32CubeIDEの[Project Explorer]に図のようにプロジェクトがインポートされています。
今回はこのプロジェクトに簡単なプログラムを組み込んでビルドしデバッグ実行するまでを説明します。
プロジェクトのビルド
まずインポートしたプロジェクトがビルドできるか事前に確認しておきます。FSBLとアプリケーションの各サブプロジェクトをそれぞれビルドします。
サブプロジェクトを右クリックし、メニューから[Build Project]を選択するとビルドが開始します。
図のように、0エラーでBuild Finishedが表示されたらOKです。
FSBLとアプリケーションの両サブプロジェクトをビルドできることを確認してください。
もしエラーが出た場合はプロジェクトの作成で何かが間違っています。
プログラムの作成
今回作成するプログラムの動作
STM32CubeMXで生成したプロジェクトはハードウェアを初期化するのみで何もしませんので、簡単なプログラムを記述します。
以下の動作をすることとします。
(1) FSBLでLED1(緑)を2回点滅した後、アプリケーションを実行する。
(2) アプリケーションでLED2(赤)を点滅させ続ける。
つまりLED点滅プログラム、所謂Lチカです。
FSBLサブプロジェクトの変更
LED点滅プログラムを記述
以下の手順でFSBLにLED点滅のプログラムを記述します。
(1) FSBLサブプロジェクトの中の以下のファイルを選択します。
ソースファイルの編集はSTM32CubeIDEで出来ますが、使い慣れたエディタを使用したい人は最後のオマケを読んでください。
(2) main.cファイル中にmain関数があります。この関数中の/* USER CODE BEGIN 2 */から/* USER CODE END 2 */の間に後述のプログラムを記述します。なお、このコメントはただのコメントではなく、ユーザプログラムを記述する場所を示しています。これ以外の場所は、STM32CubeMXでコードを生成した際に上書きされてしまいますので注意してください。
(3) FSBLサブプロジェクトをビルドしエラーが出ないことを確認してください。
FSBLのLED点滅プログラム
/* USER CODE BEGIN 2 */
for(int i = 0; i < 4; i++) {
HAL_GPIO_TogglePin(LED1_GREEN_GPIO_Port, LED1_GREEN_Pin);
HAL_Delay(500);
}
#ifdef DEBUG
BOOTStatus_TypeDef JumpToApplication(void);
JumpToApplication();
#endif
/* USER CODE END 2 */
for文では、LED1のGPIO出力を0.5秒ごとに4回反転させて点滅させています。
#ifdef DEBUG~#endifはデバッグ時に実行されるコードです。JumpToApplication関数はアプリケーションを実行します。
通常は、この後に自動生成されているBOOT_Application関数によりアプリケーションは実行されます。ただし、この関数は外部FLASHメモリからアプリケーションをロードして実行します。デバッグ時は、デバッガからアプリケーションのコードを転送しますので、FLASHメモリからのロードは不要です(ロードするとデバッガからロードしたコードが上書きされてしまいます)。そこでロードせずにアプリケーションを実行するJumpToApplication関数を使用しています。
なお、JumpToApplication関数はBOOT_Application関数から使用されている内部APIであり、ユーザには公開されていません。そこでプロトタイプ宣言も記述しています。ちなみに、JumpToApplication関数はSTマイクロが提供しているサンプルでも使用していましたので、たぶん使用しても大丈夫かと思います。
アプリケーション・サブプロジェクトの変更
LED点滅プログラムを記述
以下の手順でアプリケーションにLED点滅のプログラムを記述します。
(1) アプリケーション・サブプロジェクトの中の以下のファイルを選択します。
(2) main.cファイル中にmain関数があります。この関数中の/* USER CODE BEGIN 3 */から/* USER CODE END 3 */の間に後述のプログラムを記述します。
(3) アプリケーション・サブプロジェクトをビルドしエラーが出ないことを確認してください。
アプリケーションのLED点滅プログラム
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(LED2_RED_GPIO_Port, LED2_RED_Pin);
HAL_Delay(500);
}
/* USER CODE END 3 */
main関数中の無限ループの中でLED2のGPIO出力を0.5秒ごとに反転して点滅させています。
プログラムのデバッグ実行
ここまで作成したプロジェクトをSTM32N6570-DKボードでデバッグ実行してみます。
デバッグ実行はSTM32CubeIDEから実行コードをボードに転送して実行します。
PCとマイコンボードの接続
STM32CubeIDEを実行しているPCとSTM32N6570-DKボードをUSBケーブルで接続します。ボードのSTLINKと書かれたコネクタを使用します。詳細はボードのマニュアルを参照してください。
デバッグ構成の作成
デバッグ構成を以下の手順で作成します。
(1) FSBLサブプロジェクトをビルドします。必ず以下に進む前にFSBLサブプロジェクトをビルドしてください。
(2) [Run]メニューから[Debug Congfigurations...] を選択します。Toolbarsの虫のアイコンの横の▽からも[Debug Congfigurations...]は選択できます。
(3) [STM32 C/C++ Application]をダブルクリックすると、最後にビルドしたプロジェクトが追加されます。図のようにFSBLのサブプロジェクトが追加されていることを確認してください。
(4) FSBLサブプロジェクトにアプリケーション・サブプロジェクトを紐付けます。[Startup]タブを選択し、 [Add..]ボタンを押下します。
(5) 図のように[Project]にアプリケーション・サブプロジェクトを選択し[OK]を押下します。
(6) 図のようにFSBLとアプリケーションのサブプロジェクトが表示されたら、[Close]ボタンを押下します。
なお、ここで[Debug]ボタンを押下するとデバッグ実行が開始され、両方のサブプロジェクトの実行コードがボードに転送されます。
デバッグ実行の手順
以下の手順でデバッグ実行を行います。
(1) デバッグ実行は、前述のデバッグ構成(Debug Configuration)のダイアログから[Debug]ボタンを押下することにより開始します。
一度デバッグ実行を行えば、Toolbarsの虫のアイコンの横の▽から直接デバッグ実行ができるようになります。
また、Toolbarsの虫のアイコンをクリックすれば、最後に実行したデバッグ実行を再度実行できます。
(2) デバッグ実行を開始すると、プログラムがボードに転送され、図のようにデバッグ画面(Debug Perspective)に切り替えるかを聞いてきますので、[Switch]ボタンを押下します。
(3) デバッグ実行が開始され、main関数の先頭でブレークします。[Run]メニューから[Resume]を選択、またはToolbarsのResumeアイコンをクリックするとプログラムは再開し、プログラムによりボード上のLEDの点滅が確認できます。
これでLチカのプログラムは完成です。
オマケ 外部エディタの使い方
STM32CubeIDEのベースであるEclipse eCDTは外部エディタに標準で対応していますので、プログラムのソースコードの編集は、STM32CubeIDE内蔵のエディタを使わずとも、好きなエディタを使用することができます。
外部エディタでソースコードを編集しセーブすれば速やかにSTM32CubeIDEに反映されます。
この設定は、[Windows]メニューの[Preferences]から、[General]->[Workspeca]を選び、[Refresh using native hooks or polling]と[Refresh on access]を有効にすることで出来ますが、STM32CubeIDEではデフォルトで有効になっています。
次回は
今回はプログラムのビルドからデバッグ実行までを説明しました。
次回はこのプログラムをFLASHメモリに書き込んで、デバッガ無しで実行する手順を説明したいと思います。









