技術メモ

プログラミングとか電子工作とか

LPCXpresso4337のCortex-M4/Cortex-M0マルチコアのサンプルプロジェクトをビルド+書き込みしてみる

お恥ずかしいことにLPC4337を使ったボードをよく開発しているにもかかわらず、マルチコア開発はしたことがありませんでした。
ただ最近になってマルチコアの需要がでてきた(とはいえ要求スペック的にはシングル処理でも間に合ってはいるんですが・・・)のでマルチコア開発の一歩としてサンプルプロジェクトをビルド+書き込みしてみます。

f:id:ysmn_deus:20200612183508j:plain

環境

前提としては

  • 使用するマイコンはLPC4337で、サンプルなのでボードはLPCXpresso4337を使用する
  • 上記につき、デバッガプローブはボード上にあるLPC-Link2相当のものをそのまま利用する
  • 開発IDEはMCUXpresso IDE v11.1.1

という感じです。
LPC-Link2を使ってもいいんですが、まぁ最初は軽い気持ちでやりたいので。

プロジェクトの作成

LPCOpenからインポート

NXP製のマイコンをいじるならいまだとLPCOpenを使って開発することが多いと思います。
ここでは郷に従ってLPCOpenからライブラリとサンプルプロジェクトをインポートします。

MCUXpressoのおそらく左下にある「Quickstart Panel」から「Import projetc(s) from file system...」を選択します。

f:id:ysmn_deus:20200612171407p:plain

出てくるウィンドウの「Project archive (zip)」から「Browse」でLPCOpenのzipファイルを選択します。

f:id:ysmn_deus:20200612171453p:plain

f:id:ysmn_deus:20200612171739p:plain

f:id:ysmn_deus:20200612171749p:plain

f:id:ysmn_deus:20200612171759p:plain

今回はマルチコアのLチカのみ利用するので、LPC43xxのチップ用のプロジェクト(lpc_chip_43xx(m0))とLPCXpressoボード情報のプロジェクト(lpc_board_nxp_lpcxpresso_4337(m0))とマルチコアのサンプルプロジェクト(multicore_mc_sa_blinky_m4(0app))の6プロジェクトをインポートします。

f:id:ysmn_deus:20200612172257p:plain

「Finish」を選択すればIDEに戻り、Project Explorerにプロジェクトが6つ増えていると思います。

f:id:ysmn_deus:20200612172411p:plain

プロジェクトの設定を調整する

チップとボードのプロジェクトには手直しが必要ありませんが、サンプルプロジェクトはそのままではビルドが通らないのでマルチコアの設定を行っていきます。
最初にCortex-M0側から設定します。

Cortex-M0側のプロジェクト(Slave)

メモリ設定

こちらから設定するのは、Cortex-M4のプロジェクトでこちらのビルド済みオブジェクトファイルを指定する必要があるためです。
まずはプロジェクト設定を開きます。

f:id:ysmn_deus:20200612172801p:plain

C/C++ Build」→「MCU settings」の箇所を修正します。
一見「Cortex-M0」などを選択されてるのでよさそうですが、メモリ設定が適応されていないようです。
設定をインポートするため、下の方にある「Import」でメモリ設定をインポートします。

f:id:ysmn_deus:20200612173025p:plain

インポートするファイルはデフォルトの設定でIDEをインストールしている場合は「C:\nxp\MCUXpressoIDE_11.1.1_3241\ide\Wizards\MemConfigs\NXP」にある「LPC43x7-M0_BankB.xml」を読み込みます。
(MCUXpressoIDE_11.1.1_3241の箇所はバージョン毎に違います。)
メモリの設定が写真の様に変わっていればたぶん大丈夫です。(Cortex-M0のプログラム領域はLPC43x7では0x1b000000からなのでよさそう)

f:id:ysmn_deus:20200612173401p:plain

「Apply」を選択して適応しておきます。

MCU Linkerの設定

あとはMCU Linkerの設定だけしておきます。
同じ様にプロジェクトの設定で「C/C++ Build」→「Settings」→「MCU Linker」→「Multicore」を参照します。

f:id:ysmn_deus:20200612173931p:plain

デフォルトでは「None」になっていると思いますが、「M0APP」にしておきます。
設定は以上なので「Apply and Close」で設定ウィンドウを閉じておきます。

以上の設定を行い、プロジェクトのビルドをしておきます。
プロジェクトを右クリックし、「Build Project」を選択します。

f:id:ysmn_deus:20200612174159p:plain

関連プロジェクトは勝手にビルドされると思います。
問題なければCortex-M0の方のプログラムのオブジェクトが「Debug」下に生成されているかと思います。

f:id:ysmn_deus:20200612174359p:plain

ここまで出来ればCortex-M0の方は終わりです。

Cortex-M4側のプロジェクト(Master)

基本的な動作としてはCortex-M4側のプログラムが起動し、Cortex-M0を起動するという流れなので、こちらのプロジェクトがメインになります。

メモリ設定

基本的にデフォルトの設定で問題ありません。
念のためCortex-M0に割り当てるFlashの領域が0x1b000000になってるかぐらいはチェックしましょう。
該当箇所は先ほどと同様にプロジェクトの設定を開いて「C/C++ Build」→「MCU settings」です。

f:id:ysmn_deus:20200612174705p:plain

MCU Linkerの設定

こちらも上記と同様に「C/C++ Build」→「Settings」→「MCU Linker」→「Multicore」を参照します。

f:id:ysmn_deus:20200612174856p:plain

先ほどとはちょっと表示が違います。
この「M0APP」にチェックを付け、残り二項目も設定します。

f:id:ysmn_deus:20200612175120p:plain

f:id:ysmn_deus:20200612175132p:plain

設定できたら「Apply and Close」で設定を適応させてウィンドウを閉じます。

Cortex-M4側のプロジェクトのビルド

プロジェクトのビルドはこちらから行います。
上記までの設定をしていれば、通常のビルドで問題無い筈です。プロジェクトを右クリックし、「Build Project」しましょう。
M0APP execute address differs from address provided in source imageと怒られる場合はCortex-M0側のメモリ設定ができていない可能性が高いです。

問題無くビルドができれば実際にデバッガを起動して書き込んでみます。
簡単な動作なのでGUI Flash Toolを使って書き込みだけするのでも良いと思います。

f:id:ysmn_deus:20200612175705p:plain

接続しているデバッガが出てくるので、該当するデバッガを選択してOKします。

f:id:ysmn_deus:20200612175916p:plain

とりあえずマルチコアデバッグもしたいのでJTAGがいいです。

f:id:ysmn_deus:20200612180045p:plain

以上でM4の方のデバッガが起動し、書き込みまで完了しています。
ここでM0のほうもマルチコアデバッグする場合は、デフォルトのデバッグ設定に一箇所設定を追加します。
Cortex-M0側のプロジェクトを右クリックして「Debug Configurations」を開きます。

f:id:ysmn_deus:20200612181713p:plain

開かれた時にはM4のデバッグ設定しかないと思いますので、「C/C++ (NXP Semiconductors) MCU Application」をダブルクリックします。

f:id:ysmn_deus:20200612182026p:plain

ダブルクリックするとプロジェクト名でデバッグ設定が新しく追加されます。

f:id:ysmn_deus:20200612182102p:plain

このままではデバッグできないので、「Search Project」から対象ファイルを選択します。

f:id:ysmn_deus:20200612182242p:plain

更に、「LinkServer Debugger」のタブで「LinkServer Options」の「Debug Cnnection」にある「Attach only」にチェックを付けておきます。

f:id:ysmn_deus:20200612182430p:plain

まず最初にCortex-M4側のデバッグを開始してから、デバッグを停止せずにCortex-M0のデバッグ(上記で設定したやつ)を開始します。
基本的にはメニューバーの虫ボタンをクリックすればデバッグできると思いますが、Cortex-M0側のデバッグの初回は表示されてないかもしれないので再度「Debug Condiguration」を開いてみてください。たぶん先ほど設定したものがありますので、そちらを選択して「Debug」すれば大丈夫だと思います。

Debugのウィンドウに2個スレッドが表示されていればマルチコアデバッグ出来てると思います。

f:id:ysmn_deus:20200612182935p:plain