統合開発環境 MCU Xpressoを使ってみよう

旧フリースケール・セミコンダクタと合併したNXPセミコンダクターズからリリースされた新しいマイコン製品がMCXと名付けられたマイコン・ファミリです.MCXはNXPセミコンダクターズ(以降NXP)やフリースケール・セミコンダクタの従来品種の後継品種として位置付けられています.
前回はこのMCXマイコンの概要(ファミリの分類,内部ブロック)について解説しました.今回は開発環境 MCU Xpressoの使い方を紹介します.ターゲット・ボードには,前回紹介したFRDM-MCXN947(写真1)を引き続き使用します.
MCUXpressoは,MCXマイコンだけでなく,従来のマイコン・ファミリもサポートしています.豊富なサンプル・プログラムがきちんと整理されており,MCUXpresso上から簡単にワークスペースに取り込んで動作を確認できるようになっています.今までLPCやKinetisを利用してきた方もスムーズに移行できるのではないでしょうか.

MCUXpressoには,次の2つがあります.今回はスタンドアロン版を使用します.
・スタンドアロン版(独立したアプリケーションとして動作するもの)
・VSCode上のプラグイン版
OSはLinux(Ubuntu22.04LTS)を使用しました.Windows版やMacOS版もあります.画面や使い方は基本的に同じ(ディレクトリやFRDMボードを接続したときのデバイス名が異なる程度)です.
NXP社のウェブ・ページで「MCUXpresso」で検索すると図1のようなダウンロード・ページが見つかります.

図1に示すリンクをクリックすると,図2のように開発ツールの一覧が表示されます.ここでMCUXpresso IDEを選択します.するとMCUXpresso IDEのページになります.図3右側の「ダウンロード」をクリックすると図4-1のようなページが開くので,再度「ダウンロード」をクリックします.
ダウンロード時にはNXPアカウントへのサイン・インが必要です.NXPアカウントを持っていない場合は,ここで新たに作成します.サイン・インが完了すると,図4-2の画面が表示されるので,「MCUXpresso IDE」をクリックします.するとライセンスの同意に関する画面が表示されるので,[I Agree]をクリックします.図4-3の画面が表示されるので,使用するOSに合わせたファイルをダウンロードして実行すればインストールされます.





インストールしたMCUXpressoを新たに起動すると,図5のようなワークスペース(プログラム作成作業場所)の指定画面が表示されます.独自のディレクトリを指定したいときはここで指定します.指定したら[Launch]ボタンをクリックします.

ワークスペースを指定すると図6のようなホーム画面になります.ここではサンプル・プログラム(SDK Examples)を取り込むので,[Import SDK Examples]をクリックして,次の画面(図7)で[Go straight to the Wizard]をクリックします.


図8のような画面が表示されます.サンプル・プログラムは使用するマイコン・ボードやデバイスごとに用意されているのですが,インストールした直後はまだボードもデバイスも登録が無いので空白になっています.使用する評価ボード(ここではFRDM-MCXN947)を登録します.分かりにくいのですが,左上にある「X」型のアイコンをクリックします.

図9のように,「Boards」タブ下に評価ボードの型名と基板の写真が並んでいます.評価ボードの名前順に並んでいるので,この中から対象とするボードを選択します.ここではFRDM-MCXN947を選択して[Install]ボタンをクリックします.
すると,図10のようなダイアログが出て,ボードのSDKサンプルがインストールされます.


ボードのインストールが終わると,図11のようにインストールしたボードが表示されます.このボードを選択して[Next]ボタンをクリックします.もし,インストールが終わっても図11にならない場合は,もう一度Go straight to the Wizard ... を開くと表示されるようになります.
図12のようにdemo_appsフォルダ下にサンプルが大量に用意されています.ここでは次のサンプルを動かしてみます.
・demo_apps\hello_world_cm33_core0
このサンプルはターミナルに「hello world.」と表示した後,キーボードから入力された文字をそのままエコーバックするものです.
インストールしたいサンプルを選んで[Finish]ボタンをクリックすると,最初に作成したワークスペースの下にサンプル・プロジェクトが生成されて,図13のようなIDE(統合開発環境)画面になります.



サンプルをそのままビルドして動かしてみましょう.図14のように,Projectメニューから「Build All」を選択してビルドを実行します.
図15のようにエラーが無く正常終了したことを確認します.今回はサンプルに手を加えていないのでエラーは出ないはずです.


▼IDE内蔵ターミナルを使う
サンプルからはターミナルを使用するので,最初にターミナルを設定しておきましょう.専用のターミナル・ソフトウェアを起動しても良いのですが,ちょっとしたテスト程度ならIDEに内蔵されたターミナルが使えます.
図16のように「Terminal」タブを選択します.もし,「Terminal」タブが無い場合は図17のように,IDEのWindowメニューから「Show View」→「Other」と選択すると,図17下側のような選択画面になるので,ここにある「Terminal」を選択して[Open]ボタンをクリックすると,「Terminal」タブが現れます.


▼ボードを接続する
ここからはボードを使用します.ボード上にあるMCU-LINK(USB Type-C)コネクタとPCをUSBケーブルで接続します.
▼ポートを選択する
使用するポートの選択などを行います.図18のようにTerminalタブ画面にあるアイコンをクリックすると,図19のようなターミナルの接続先の選択ダイアログが表示されます.ここではPCのシリアル・ポートを使用しますので,「Serial Terminal」を選択して[OK]ボタンをクリックします.
▼デバイス名を選択する
次に図20の画面になるので,FRDMボードが接続されているポート(デバイス名)を指定します.筆者の環境では/dev/ttyACM0でしたが,環境によって異なります.そのほかの部分は変更せず,そのまま[OK]ボタンをクリックします.
図21のようにシリアル・ポート名が付いたターミナル画面が現れます.




ターミナルの準備ができたので,プログラムを書き込みます.図22のように,ワークスペース一覧の一番上にあるプロジェクトをクリックしてから,画面上部の「GUI Flash Tool」アイコンをクリックします.
アイコンの位置は図22とは異なる場所に移っていることもありますが,虫の形をしたDebugアイコンを目印に探すと良いようです.
「GUI Flash Tool」アイコンをクリックすると,図23のようにMCU-LINKが見つかるはずですので,そのまま[OK]ボタンをクリックします.
図24のような警告ダイアログが現れます.プロジェクトの設定がMCXN947なのに検出されたデバイスがMCXN947DVFTなので,名前が不一致(プロジェクト側が詳細型名になっていない)となっています.問題ないので「Yes」をクリックして先に進みます.
図25の画面が表示されます.デフォルトのままで構いませんので,そのまま[Run]ボタンをクリックします.
最後に図26のようなプロセッサ・コアの選択ダイアログが現れますが,デフォルトのまま「OK」をクリックします.これで書き込みが行われます.





書き込みが終わったら,「Terminal」タブを選択し,ターミナル画面に切り替えます.図27のように「hello world.」と表示されていて,キーボードから文字入力すると,入力した文字がエコー・バックされます.
IDEとは別のターミナル・アプリケーションを使うこともできます.IDEのターミナルを閉じて,シリアル・ターミナル・ソフトウェア(moserial)を使ってみたのが図28です.


上記のhello world.サンプルに,LEDの点滅機能を追加してみましょう.機能追加のために,SDKに用意されている「SysTickタイマ割り込みを使ったLED点滅のサンプル」を参考にします.
LED点滅のサンプルを取り込むため,いったんホーム画面(Welcome画面)に戻りましょう.IDE上の家の形のアイコン(マウスカーソルを近づけると「Welcome」と表示される)をクリックすると,ホーム画面に戻ります(図29).

サンプル・プログラムは多数あるので検索機能を使って絞り込みます.図30のように検索窓に「led」と入力して絞り込みます.この中でdemo_appsフォルダの下にあるled_blinky_peripheral_cm33_core0を選択します.

サンプルのソース(sourceの下のled_blinky.c)を開くと,図31のようになっています.SysTick割り込み処理が,SysTick_Handler()関数です.試しにこのサンプルのプロジェクト名のところをクリックして選択した後,ビルドして書き込むと,LEDが1秒ごとに点滅を繰り返します.

この関数がどこから呼ばれているのかをちょっと探してみましょう.IDEの検索機能を使ってみます.関数名を左クリックで選択した後,右クリックして出てくるメニューから「References」→「Project」でプロジェクト内から検索します.
図32のようにstartupの下のファイルで参照されています.図33は,これをダブルクリックして開いてみたところです.CPUの割り込みベクタ・テーブルの定義で,ここに関数名が書かれています.
ところで,SysTick_Handler()の記述をコメント・アウトしてビルドしてもエラーにはなりません.これは別の場所でも同じ名前の関数が定義されているからです.先ほどと同じように関数名を右クリックして表示されたメニューから「Declarations」を使って定義場所を検索すると,ベクタ・テーブルと同じファイルの中でWEAK_AV void SysTick_Handler(void)という関数が定義されています(図34).このWEAK_AVという属性は,「他で定義されていないならこれを生かすけれど,他で定義されているものがあればそっちを優先(こちらは使わない)」というものです.



SysTick_Handler()関数をコピーしてhello_world.cに貼り付けてビルドしても,エラーになってしまいます.理由は現状のhello_worldサンプルでは,
・LEDが接続されているGPIOピンの定義,設定がされていない
・SysTickタイマの初期化が行われていない
そこで図35のように,「ConfigTools」メニューから「Pins」を選択します.すると,ピン設定ツールが起動します.最初に起動した後はまだプロジェクトを選択していないので空白のままです.図36のようにプロジェクトを選択します.ここではhello_world_cm33_core0を選択します.


▼B12がLED(赤色)端子
図37のようなピン設定画面になります.B12(P0_10)がフルカラーLEDの赤色端子につながっています.FRDMボードに合わせてLED_REDという名前が既に付けられていますので,これをそのまま利用することにします.この名前がポートの名称などとして使われます.

▼GPIOモードに設定する
このピンの左端のチェック・ボックスをクリックすると図38のように,モード設定画面になりますので,ここでGPIOモード(GPIO0.GPIO.10)を選択して「Done」をクリックします.

▼出力モードに設定する
GPIOモードに設定した後,GPIOを出力モードに設定します.図39のように,プルダウン・メニューを使ってB12(P0_10)端子をOutput(出力)モードに設定します.

▼Develop(ソフト開発画面)に戻る
設定が終わったら,MCUXpressoが自動生成したライブラリ・ファイルを更新します.図40のように,画面上部の「Update Code」をクリックします.
ちなみに,更新せずにソフトウェア開発画面を開く(現在仮設定している状態はそのまま保持されます)ときは,右側の「develop」アイコンをクリックすれば,現在設定している状態を保持したままソフト開発画面に戻ります.
図41のような更新されるファイルが示されます.特に変更するところは無いので,このまま[OK]をクリックします.


LED点滅サンプルのソースコードである,led_blinky.cのSysTick割り込み処理にあるBOARD_LED_RED_GPIOやBOARD_LED_GPIO_PINが定義されている場所をIDEの検索機能で検索すると,app.hの中で,
#define BOARD_LED_GPIO BOARD_LED_RED_GPIO
#define BOARD_LED_GPIO_PIN BOARD_LED_RED_GPIO_PIN
となっています.
ここで,さらにBOARD_LED_RED_GPIOなどを「Search Text」で検索すると,board.hの中で定義されていることが分かります.
そこで,hello_worldのプロジェクトでboard.hを見ると,同じように定義されていることが分かります(図42).
ここではapp.hの中での置き換えは行わずに,この定義をそのまま使ってしまいましょう.サンプルのソースコードのSysTick_Handler()関数をhello_world.cの中にコピーしたら,
・BOARD_LED_GPIOをBOARD_LED_RED_GPIO
・BOARD_LED_GPIO_PINをBOARD_LED_RED_GPIO_PIN
に書き換えておきます.これで仮ビルドしてみたのが図43です.エラーが出ていないことを確認します.


SysTickタイマの初期化(周期設定)が必要です.これもLED点滅サンプルの中から探すと,boardの下のhardware_init.cの中にあるBOARD_InitHardware()関数の中で行われています.図44が該当部分で,ここのSysTick_Config()関数がSysTickタイマの初期化です.
hello_world.cでも同じようにしても良いのですが,ここではmain()の中に入れてみました.図45が追加したところです.これでhello_worldのときと同じようにビルドして書き込むとカラーLED(D2)が赤く点滅します.SysTickタイマに与えている周波数が異なりますので,点滅周期はだいぶ速いです.


2回に分けてNXPセミコンダクターズの新しいマイコン・ファミリ MCXの話題を紹介しました.全てをここで紹介していくのはとても無理なほど多彩な機能が盛り込まれています.興味を持たれた方はぜひ同社ウェブ・ページを訪れてみてください.
本稿はなるべくクリーンな状態からインストールしていきたかったので,仮想マシン下にLinux(Ubuntu22.04LTS)をインストールして試しています.LPCXpressoでプログラムを書き込もうとしたとき,「FRDMのファームウェアのアップデートがあるよ」というメッセージを見ました.そこで,試しに実行したところ,いったんUSBが切り離された後,再接続に時間がかかったためか,途中でエラーになってしまいました.
ファームウェアのアップデートが途中で止まってしまったために,再度,FRDMボードを接続してもUSBデバイスとしては認識されるものの,FRDMの内蔵デバッガ(MCU-Link)が認識されなくなってしまいました.使い物にならないのかと思いましたが,次のような手順で復旧できました.
図Aのように,NXPセミコンダクターズのウェブページにあるLinkserverソフトウェアを探します.「Linkserver installer」で検索すると見つかると思います.本稿執筆時点でのバージョンは25.3.31(2025年3月25日)でした.
macOS用,Windows用,Linux(Ubuntu)用があります.筆者はテスト環境にLinux(Ubuntu 22.04LTS)を使っているので,Ubuntu用をダウンロードしました.ダウンロードされたファイル名は「LinkServer_25.3.31.x86_64.deb.bin」です.
Linux版の場合,シェル(ターミナル)から管理者権限で起動します.ダウンロードしたファイルのあるディレクトリで,
chmod +x ./ LinkServer_25.3.31.x86_64.deb.bin
として実行権を付けた後,rootで(sudoを付けて)実行します.
sudo ./ LinkServer_25.3.31.x86_64.deb.bin
これで必要なファイルが/usr/local/MCU-LINK_installerにインストールされます.
Linuxの場合には,/usr/local/MCU-LINK_installer/scripts/program_CMSISにファームウェア書き込み用のスクリプトが置かれています.

FRDM-MCXN947ボードのJ21をショートします.ショート用のプラグは評価ボードに添付されています.J21はFRDMボードをシルクが読める向きに置いたときに中央左側にあります(図B).J21をショートしたたら上側のUSBコネクタに接続します.

書き込み用のスクリプトである
/usr/local/MCU-LINK_installer/scripts/program_CMSIS
を実行します.
図Cのようにスクリプトを起動したら,FRDMボードが接続されているのを確認して[スペース]バーを押すと書き込みが行われます.
書き込みが正常に終了したら[Enter]キーを押すと終了します.図Dは筆者が書き込みを行ったときの画面です.
この後USBケーブルを切り離し,USBJ21を外し,再度USBケーブルを接続すると復旧できていました.


・組み込みマイコン入門講座
-- https://interface.cqpub.co.jp/mcu-hands-on/
・登録内容の変更,メール・マガジン配信中止はこちらからお願いします.
-- https://cc.cqpub.co.jp/system/auth/