STM32N657はArm Cortex-M55コア搭載のSTM32マイコンです。TrustZoneが有効だったり内蔵FLASHメモリが無かったりで、これまでのSTM32のプログラム開発と少し違いがあったので記事としてまとめました。
一年ほど前に記事を投稿しましたが、その後の開発ツールのバージョンアップなどで手順も大きく変わり、記事を修正するより書き直した方が早いくらいなので、新たに記事を投稿します。
旧バージョンのSTM32CubeIDEを使用する場合は前の記事をご覧ください。
Arm Cortex-M55搭載 STM32N657でプログラムを作成 (以前のバージョン)
執筆時点で実際に試した内容ですが、今後も変わる可能性があるので注意してください。随時更新していく予定ですので変更点は履歴をご確認ください。
使用した開発環境・ツール
以下を使用しました。バージョンは本稿で確認したものです。
- 開発ボード STM32N6570-DK (Discovery kit)
https://www.st.com/ja/evaluation-tools/stm32n6570-dk.html
メーカ純正。ST-LINKデバッガをボードに備えていますので、USBケーブルでPCに接続するだけでデバッグが可能です。
より安価なNUCLEO-N657X0-Qもほぼ同様の手順で使用可能です。
https://www.st.com/ja/evaluation-tools/nucleo-n657x0-q.html
-
IDE(統合開発環境) STM32CubeIDE v2.1.1
https://www.st.com/ja/development-tools/stm32cubeide.html
STM32マイコンのIDEです。Eclipese Embedded CDTをベースにST32マイコン用の拡張がされています。 -
STM32Cube初期化コード生成ツール STM32CubeMX v6.17.0
https://www.st.com/ja/development-tools/stm32cubemx.html
STM32マイコンの開発プロジェクトを生成するツールです。以前はSTM32CubeIDEに本機能が内蔵されていましたが、v2.0から無くなったため、STM32CubeMXを単体で使用する必要があります。
基本事項
プログラム開発を行うにあたって必要最小限の事項を説明します。
マイコンやボード、各種ツールの詳細はそれぞれのマニュアルを参照してください。
メモリ構成
STM32N657は一般的なマイコンと異なり内蔵FLASHメモリを持ちません。
以下のメモリを内蔵しています。
| 種別 | 先頭アドレス(NS/S) | サイズ |
|---|---|---|
| ITCM | 0x000_00000 / 0x1000_0000 | 64KB |
| Boot ROM | 0x0800_0000 / 0x1800_0000 | 128KB |
| DTCM | 0x2000_0000 / 0x3000_0000 | 128KB |
| AXISRAM | 0x2400_0000 / 0x3400_0000 | 4.2MB |
| Backup SRAM | 0x2C00_0000 / 0x3C00_0000 | 8KB |
FLASHメモリは外付けとなります。
STM32N6570-DKボードの場合は以下の外部メモリが搭載されています。
- 128MB Octo‑SPI FLASH メモリ
- 32MB Hexadeca‑SPI PSRAM
アドレス空間とTrustZone
STM32N657のアドレス空間はIDAUにより下表のように256MB単位で分けられ、最上位桁が偶数の空間は非セキュアであり、その次の奇数のセキュアな空間にエイリアスされています。
IDAUの設定は変更できません。SAUにより上書きは可能です。詳細はArmのTrustZoneの仕様を参照してください。
| 先頭アドレス | Secre/Non Secure | 対象 |
|---|---|---|
| 0x0000_0000 | NS | Boot ROM, ITCM |
| 0x1000_0000 | S | Boot ROM, ITCM |
| 0x2000_0000 | NS | 内蔵RAM, DTCM |
| 0x3000_0000 | S | 内蔵RAM, DTCM |
| 0x4000_0000 | NS | ペリフェラル |
| 0x5000_0000 | S | ペリフェラル |
外部メモリは0x6000_0000以降にマップされエイリアスは存在しません。SAUにより非セキュアに割り当て可能です。
ユーザ・プログラムの構成と実行
STM32N657はTrustZoneが有効であり、また内蔵FLASHを持ちません。
STM32N6570-DKボードではユーザ・プログラムは、以下のいずれかの方法で実行できます。
- Load and Run : プログラムを外部FLASHから内蔵SRAM(または外部RAM)にロードして実行します
- XIP (eXecute In Place) : プログラムを外部FLASHメモリ上で直接実行します
本記事ではLoad and Runについて説明します。
ユーザ・プログラムはTrustZoneの機能を使用する場合、セキュア部と非セキュア部から構成されます。使用しない場合はセキュア部だけとします。
なお、本記事ではユーザ・プログラムはすべてセキュア部のみで実行します。つまりTrustZoneのセキュア機能は実質使用しません。
ユーザ・プログラムの実行の流れは以下となります。
(1) マイコンのリセット後、Boot ROMのコードが実行され、外部FLASHメモリからFSBL(First Stage Boot Loader)を内蔵SRAMにロードします。Boot ROMの内容は変更できません。
(2) FSBLが実行され、外部FLASHメモリからアプリケーション・プログラムを内蔵SRAMにロードします。TrustZoneを使用している場合、アプリケーション・プログラムはセキュア部と非セキュア部に分かれています。
(3) FSBLはTrustZoneなど必要なハードウェアの設定を行ったあと、セキュア部のアプリケーション・プログラムを実行します。
(4) 非セキュア部のアプリケーション・プログラムがある場合は、セキュア部のアプリケーション・プログラムは必要な初期化処理を行った後、非セキュア部のアプリケーション・プログラムを実行します。本記事ではこれはありません。
プロジェクトの新規作成
STM32CubeMXを使用してプロジェクトを作成します。
(以前の記事では、STM32CubeN6 (STM32Cube MCU Package for STM32N6 series)に含まれるテンプレートを使用する手順も記載しましたが、現在は比較的簡単にSTM32CubeMXから作成できますので、この方法のみを記載します)
プロジェクトの選択
STM32CubeMXを実行します。以降はSTM32CubeMXでの作業となります。
(1) [File]メニューから[New project...]を選択します。
(2) [Board Selector]タグを選択し、STM32N6570-DKを選択します。「STM32N6」で検索するとすぐに見つかります。
(3) 表示された目的のボードを選択し、[Start Project]ボタンを押下します。すべてのペリフェラルをデフォルトモードで初期化するか聞かれますので[Yes]を選びます。
(4) 作成するアプリケーションは、セキュア部と非セキュア部から構成されるか、セキュア部のみか聞かれます。今回はセキュア部のみを選択し、[OK]を押下します。
(5) プロジェクトが生成されるまでしばらく待ちます。
プロジェクトの設定
ここまでで作られた新規プロジェクトはデフォルトの設定ですので、変更していきます。
[Project Manager]タブを選択すると、プロジェクトの情報を設定でききます。以下を設定します。
- Projects Name : 任意のプロジェクト名
- Project Location : プロジェクトを保存する場所(ディレクトリのパス)
- Toolchain/IDE :
STM32CubeIDEを選択
クロックの設定
[Clock Configuration]タブを選択すると、クロックの設定画面になります。今回はデフォルトの設定をそのまま使用しますが、必要に応じて変更してください。
端子とペリフェラルの設定
[Pin & Configuration]タブを選択するとマイコンの端子やペリフェラルの設定ができます。
今回はボード上のLEDを使用可能に設定します。STM32N6570-DKでは以下のLEDが使用できます。
| ポート | LED種別 | Active |
|---|---|---|
| PO1 | LED1(GREEN) | Low |
| PG10 | LED2(RED) | High |
以下の手順で設定を行います。
(1) マイコンのTop View表示から、PO1およびPG10を右クリックし、GPIO_Outputに設定します。
(2) [Categories]の[System Core]の[GPIO]を選択し、PO1を図のように設定します。PO1はFSBL用に設定しました。
(3) 続いてPG10を図のように設定します。ここではPG10はアプリケーション用に設定しました。
SysTickタイマの設定
SysTickタイマをFSBLとアプリケーションから使用可能にします。
[Categories]の[System Core]の[SYS_S]を選択し、FSBLとApplicationにチェックを入れます。
不要なペリフェラルの解除
[Categories]の[Connectivity]を選択すると、デフォルトでいくつかのペリフェラルが有効になっています。その中の[SDMMC2]と[USM2_OTG_HS]のチェックマークを外し無効とします。これが有効になっていると起動処理でハングするようです。
外部FLASHメモリの接続設定(XSPI2)
ユーザ・プログラムが格納されている外部FLASHメモリの接続を以下の手順で設定します。
(1) [Categories]の[Connectivity]の[XSPIM]を選択し、FSBLがチェックされ、[Mode]にDirectが選択されていることを確認します(異なった場合は設定してください)。
(2) 続いて[XSPI2]を選択し、Modeが図のように設定されていることを確認します(異なった場合は設定してください)。

(3) 続いて[XSPI2]のConfigurationを図のように設定します。
外部メモリ・マネージャの設定
ミドルウェアの外部メモリ・マネージャを以下の手順で設定します。外部メモリ・マネージャは、FSBLで外部FLASHメモリからプログラムをロードするのに使用します。
(1) [Categories]の[Middleware and Software Packs]の[EXTMEM_MANAGER]を選択します。
(2) [FSBL]と[Active External Memory Mabager]をチェックします。
(3) 外部メモリマネージャの[Configuration]の[Boot usecase]を選択し、図のようにロードするプログラムなどを設定します。
(4) 続いて[Configuration]の[Memory 1]を選択し、図のように外部メモリを設定します。
プロジェクトの保存
プロジェクトの設定が終わったら、STM32CubeMXの右上の[GENERATE CODE]ボタンを押下します。
設定したディレクトリにプロジェクトのディレクトリが作成され保存されます。
終了したら図のダイアログが開きますので、[Open Folder]を押下すると、プロジェクトのディレクトリが開かれます。
STM32CubeMXはいったんここで終了します。
プロジェクトのIDEへのインポート
作成したプロジェクトをSTM32CubeIDEに取り込みます。
STM32CubeIDEの起動とワークスペース
STM32CubeIDEを実行すると図のようにワークスペースを聞いてきます。ワークスペースは開発を行うディレクトリで各種の情報が保存されます。任意のディレクトリを指定します。
プロジェクトのディレクトリは、ワークスペースのディレクトリ内にを作成するのが標準のようです。この場合は、STM32CubeMXでプロジェクトの保存場所に選んだディレクトリを指定します(プロジェクトのディレクトリではなく、その上位のディレクトリです)。
ただ、ワークスペースとプロジェクトのディレクトリは、ばらばらでも問題ありません。筆者はプロジェクトと別の場所にワークスペースのディレクトリを作成することが多いです。
ワークスペースを指定し[Launch]ボタンを押下するとSTM32CubeIDEが起動します。以降はSTM32CubeIDEでの操作となります。
プロジェクトのインポート
以下の手順でプロジェクトをワークスペースにインポートします。
(1) [File]メニューの[Import...]を選び、図のダイアログの[General] の[Existing Projects into Workspace]を選んで[Next]を押下します。
(2) ダイアログの[Select root directory]の[Brows...]ボタンを押下し、プロジェクトのディレクトリを指定します。
図のように[Projects:]に3個のプロジェクトが表示されたらOKです。プロジェクトが表示されない場合はディレクトリが間違っているか、正常にプロジェクトが生成されていません(プロジェクトのIDEにSTM32CubeIDE以外のものを指定した場合もダメです)
(3) [Finish]ボタンを押下するとワークスペースにプロジェクトがインポートされ、図のように[Project Explorer]にプロジェクトが表示されます。
プロジェクトは、FSBLとアプリケーションの二つのサブプロジェクトから構成されます。
図ではtest_stm32n657_FSBLがFSBLのサブプロジェクト、test_stm32n657_Appliがアプリケーションのサブプロジェクトです。test_stm32n657はプロジェクト名ですので、指定したプロジェクト名によって変わります。
FSBLのプログラムの変更
FSBLサブプロジェクトの以下のファイルにI/O電源の設定を記述します。
Core\Src\main.c
main.cファイル中のmain関数の/* USER CODE BEGIN Init */から/*USER CODE END Init */の間に以下のプログラムを記述します。
/* USER CODE BEGIN Init */
HAL_PWREx_EnableVddIO3();
HAL_PWREx_ConfigVddIORange(PWR_VDDIO3, PWR_VDDIO_RANGE_1V8);
/*USER CODE END Init */
プロジェクトの設定の変更
作成したプロジェクトの設定は、STM32CubeMXで変更することができます。
STM32CubeMXの[File]メニューから[Load Project]を選択し、プロジェクトのディレクトリ中にある.iocファイルを指定すると、プロジェクトを読み込めます。
設定を変更したら、[GENERATE CODE]ボタンを押下すると、プロジェクトは更新されます。この際に多くのファイルは上書きされます。ユーザが記述したプログラムが上書きされないようにするには、ソースコード上の決められた場所に記載する必要があります。具体的には、それぞれの説明で示します。
次回は
今回はSTM32CubeMXを用いてSTM32N657-DK用のプロジェクトを作成し、STM32CubeIDEにインポートするまでを説明しました。
次回は、プロジェクトに簡単なプログラムを組込み、デバッグ実行するまでを解説します。

















