【i.MXRT1050】外部フラッシュ(QSPI/Hyperflash)直接実行(XIP)する方法


NXP社から昨年、新しいカテゴリのプロセッサが発表になりました。クロスオーバープロセッサというマイコンとプロセッサの融合したものです。今回は、このIMXRT1050プロセッサで肝になる実行コードのRAM実行イメージ、外部フラッシュROMから実行するイメージのビルド方法をご紹介したいと思います。

I.MXRT1050ブロック図

IMXRT1050 ブロック図
出典:NXP Semiconductors (https://www.nxp.com/products/processors-and-microcontrollers/applications-processors/i.mx-applications-processors/i.mx-rt-series/i.mx-rt1050-crossover-processor-with-arm-cortex-m7-core:i.MX-RT1050)

RAMが、TCM-RAMが512kBが内蔵されていますね。結構、大きいメモリです。

一方、i.MX RT1050には、実を言うと内蔵フラッシュROMがありません!じゃ、プログラムコードはどこに格納するのでしょうか?

プログラムの格納場所と実行方法

それは、外部フラッシュROM(ブロック図ではQuad SPI、NOR Flash, Nand Flash)にコードを格納することになります。

でも、これは特に珍しいことではなく、LinuxやAndroidOSといった世界では、NXP社のプロセッサで言うとi.MX6とか7とかCortex-A系コアのプロセッサでは、外部フラッシュROMにプログラムコードを格納しています。

そして、SDRAMなどのRAM領域にプログラムコードをダウンロードしてそこから実行しています。

i.MXRT1050も同じように、外部フラッシュROMにプログラムを格納して、SDRAMや内蔵のTCM-RAMなどのRAM領域にプログラムコードをダウンロードして実行することになります。

Quad SPI メモリから直接実行

ここまでは、i.MX6とかとなんら変わらないんですよ。

でも、i.MXRT1050は、さらに外部フラッシュROMからプログラムコードを直接実行できるんです。普通、直接実行できる外部フラッシュROMはパラレルのNOR FLashメモリなんですが、i.MXRT1050は、Quad SPIメモリから直接実行(XIP: eXecute In Place)できるアーキテクチャになっているんです!これは、かなり珍しいアーキテクチャです!

注意: ただし、IMXRT1050-EVKBボードには、Hyper FlashとQuad SPIフラッシュがそれぞれ実装されています。デフォルトでは、Hyper Flash側が設定されています。 Quad SPIを使用するには、ボード上の0ohm抵抗の位置を変える必要があります。

部材コストが大きく下げられる!

Quad SPIメモリは、特に、少ピン、小型パッケージで特に価格が安いのが特徴です。

このQSPI Flashメモリから直接実行できると何が嬉しいかと言うと、今までプログラムコードのダウンロードや実行先に必要だったSDRAMなどが不要になり、外部メモリ素子としてはQSPI フラッシュメモリのみになりシステム全体の部材コストが大きく下げられるんです。

もちろん、LCDディスプレイを扱うアプリケーションなどのようにRAMを多く使うアプリの場合には、フレームバッファとして外付けにSDRAMが必要になるとは思いますが、Quad SPIメモリから直接実行できれば、RAMの削減に繋がるのは間違いありません。RAMって高いんですよね。

一般的には、フラッシュROMを内蔵するマイコンの価格とフラッシュを内蔵しないマイコンとQuad SPIメモリを外付けにした場合の価格は、断然フラッシュを外に持った方が安いとされています

Quad SPIメモリの単価が大きく下がっているので、XIP対応のアーキテクチャは今後のMCUのトレンドになるのではないかと思います。

プログラムコードの配置とビルド

さて、前置きが長くなってしまいましたが、i.MXRT1050は、プログラムコードの実行場所を内蔵RAMや外部SDRAM、そして外部フラッシュROMから直接実行させるXIPに対応しています。

プログラムコードを配置する場所を、リンカーで設定し、ビルドすることで、これら異なるメモリから実行させることが可能ですが、では、実際にどのように設定するのかをこれからご紹介します。

では、行ってみましょう。

まず、MCUXpresso IDEを開いて、IMXRT1050用SDKをダウンロードします。

MCUXpresso IDEのインストール、SDKが未だの人は、以前の記事でもインストール方法など紹介しているので、参考にしてください。もちろん、完全フリーで使用することが出来ます。

以前の記事では、LPC802用のSDKをインポートしていますが、IMXRT1050に読み替えて進めてください。


MCUXpresso IDEダウンロードページ

Hello Worldプロジェクトを開いたところ

Hello Worldプロジェクトを開いたところ
Hello Worldプロジェクトを開いたところ

ここから、プログラムコードのメモリ配置を設定していきます。

MCUXpresso SDKのサンプルコードでは、デフォルトでQuad SPIから直接実行するように、Quad SPIメモリに配置されます。

HyperFlash(またはQuad SPI)に配置する

次に、外付けのフラッシュメモリに配置、直接実行できるように設定します。

IMXRT1050-EVKBでは、デフォルトでHyperFlashが設定されています。Quad SPIフラッシュを使用する場合には、若干変更(ソフトウェアとEVKボードの0ohm抵抗の配置変更)が必要です。

実は、MCUXpresso SDKに収められているIMXRT1050のサンプルコードは、全てデフォルトでHyperfashにコードを配置、実行できるようになっています

そのまま、トンカチマークのビルドボタンをクリックするだけで、HyperFlash ROMへの配置と実行が可能になります。

ただし、外部フラッシュメモリにプログラムコードを配置する場合には、プロジェクトに組まれている、「xip」フォルダを一緒にビルドしないといけません

「xip」フォルダには、HyperFlashとSDRAM用のBootコンフィグヘッダ情報が設定されていて、HyperFLashのヘッダ情報は、0x60000000番地の頭に配置されるようになっています。これが無いと、FlexSPIインタフェース経由によるコードの直接実行が出来ません。

このBOOT コンフィグ情報は、「XIP_BOOT_HEADER_ENABLE=1」のdefineを設定する必要があります。

BOOT コンフィグ Define
BOOT コンフィグ Define
注意: Quad SPIを使用する場合には、HyperflashのBootcコンフィグ部分をQuad SPI用に修正する必要があります。残念ながら、Quad SPI用のBootコンフィグは、サンプルコードに用意されていないので、アプリケーションノート(AN12183 )を見て自分で修正する必要がありそうです。

AN12183 How to Enable Debugging for FLEXSPI NOR Flash

 

RAMに配置する

RAMに配置する方法から説明します。RAMに配置するのは、とっても簡単です。

エディットプロジェクトセッティング
エディットプロジェクトセッティング
セッティング
セッティング
RAMにリンクするをクリック
RAMにリンクするをクリック

これで、設定は完了です。たったこれだけで、プログラムコードはRAMに配置されます。

早速、ビルドしてみましょう。

ビルド後の結果

コンソールにビルド結果が表示されます。結果から、SRAM_DTCという RAMに23.4kBが配置されているのが分かると思います。

では、マップファイルではどのようになっているか確認してみます。

マップファイル
マップファイル

確かに、hello_worldのオブジェクトファイルは、SRAM_DTC領域に配置されています。また、そのほかのオブジェクトも同様にSRAM_DTCに配置されているのが分かります。

SDRAMに配置する

最後に、SDRAMに配置する方法をご紹介します。

エディットプロジェクトセッティング
エディットプロジェクトセッティング

メモリコンフィグを変更する

メモリコンフィグを変更して、SDRAMにコードが配置されるように修正します。

メモリコンフィグ設定
メモリコンフィグ設定
メモリコンフィグの修正
メモリコンフィグの修正

右側にある上矢印を使って、SDRAMを一番上に持ってきます。

そして、OKをクリック。

ビルドして確認してみる

ビルド結果
ビルド結果

確かに、コードがSDRAMに配置されているのが分かります。

次に、マップファイルでも確認して見ます。

マップファイル
マップファイル

確かに、Hello world.oオブジェクトがSDRAMに配置されていますね。それ以外のオブジェクトもSDRAMに配置されているのが分かります。

まとめ

今回は、プログラムコードの外部メモリへの配置、RAMやSDRAMへの配置を紹介しました。

HyperFlashは、予めBOOTコンフィグファイルが用意されているので、そのままビルド出来ますが、Quad SPI メモリーの場合は、自分で修正する必要があります。

SDRAMへの配置は、メモリコンフィグ設定を変更することで、簡単に配置させることが出来ました。

是非、参考にしてください。