LPC-Link2ですが、LPC4370評価ボードとして自前のファームウェアを動作させてみる手始めとしてLチカしてみました。
本来ならいろいろツールを自前で準備して、理解を進めながら到達すべきLチカだとは思うのですが、NXPのサイトにサンプルが用意されていますので、それを使ってしまいます。
開発環境は無料で利用できるLPCXpresso6を使用します。実は初めて使うLPCXpressoです。この環境のことは良く知らないので、その学習も兼ねてます。
まずはLPCXpressoをダウンロードして、インストールしておきます。
LPC-Link2用のサンプルをこちらのページからダウンロードしておきます。LPC4370_LPCLink2_LEDblinky.zipというのがLチカサンプルです。
LPCXpressoを起動し、さきほどダウンロードしたプロジェクトをインポートします。Quick Start PanelにあるImport Project(s)ボタンを押して、さきほどダウンロードしたzipファイルを取り込みます。zipファイルのままインポートすることができますので、解凍する必要はありません。
インポートが成功したら、さっそくビルドしたいところですが、このままビルドすると失敗してしまいます。ターゲット用のヘッダやライブラリがLPCXpressoに取り込まれていないためです。ファイルそのものはLPCXpressoに添付されていますので、これも同様にインポートしておく必要があります。改めてImport Project(s)ボタンを押して、Archiveファイルとして、LPCXpressoをインストールしたフォルダ(/Applications/lpcxpresso_6.1.2_177)の中にある、 lpcxpresso>Examples>NXP>LPC4000>LPC43xx>LPC43xx_Libraries.zipを指定します。
アーカイブ中に含まれるプロジェクトが列挙されますので、すべて取り込みます。サンプルとライブラリのプロジェクトが並んだ状態になります。
この状態からビルドボタンを押せばビルドに成功するはずです。
さて、これをLPC-Link2ボードにロードしてみたいと思います。LPC-Link2ボードにはLEDが一つだけ用意されています。回路図を参照してみると、MPUのP1_1端子に接続されており、LPC4370のデータシートを参照してみると、これはGPIO0の8番に割り当てられているようです。正直わかりにくいです。
一方コードの方ですが、さきほどのサンプルのLチカ部分は以下のようになっていました。
while(1) {
systick\_delay(500);
GPIO\_SetValue(0,1<<8);
systick\_delay(1000);
GPIO\_ClearValue(0,1<<8);
}
GPIO0の8ビット目をオンオフしているようですので、ボード上に用意されているLEDが操作対象らしいです。そのため別途LEDを接続する必要はありませんでした。
さて、ビルドに成功すると、プロジェクトフォルダの中に、DebugまたはReleaseフォルダができ、その中にaxfという拡張子のファイルが作られます。ELFフォーマットのバイナリファイルです。
LPC-Link2は、そのままの状態では、DFUデバイスとして認識されるので、dfu-utilコマンドで書き込むことができそうな気がしました。LabToolのファームウェアや、LPCExpressoで使用するRedLinkのファームウェアはdfu-utilで書き込まれていますし。
ところが、dfu-utilで書き込みを試してみたのですが、書き込みがうまくいきません。調べてみたところ、LabToolやRedLinkのファームウェアのファイルの先頭には何かヘッダが追加されているらしく、これが無いと書き込みが成功しないようです。真似てヘッダを追加して試してみたのですが、書き込みは成功するようになったのですが、やはり動作しません。何か違いがあるようです。
実は、LPC-Link2で開発を行うためには、別途デバッグ用のインターフェースとしてanother LPC-Link2が必要とWebサイトに書かれています。Lチカしたいだけなのにもかかわらず、2台もLPC-Link2が必要なのは、正直みっともないと思いますが、ちょうど良いことになぜか手元にはLabTool用のLPC-Link2がもう1台あるので、それを使って試してみました。
10Pリボンケーブルを使って、LPC-Link2同士をつなぎます。ホスト側のJ7とターゲット側のJ2を接続します。ホスト側のLPC-Link2から電源供給できるようJP2をショートしておきます。そしてホスト側のLPC-Link2にUSBで接続します。
準備ができました。さっそくLPCXpressoでデバッグボタンを押します。そうすると最初の起動時には、デバッガの起動設定画面が表示されますので、C/C++ (NXP Semiconductors) MCU Applicationsを選択し、+ボタンを押して設定を追加します。
そしてDebugボタンを押すと、デバッグプローブ(エミュレータ)の選択ダイアログが出ます。OKを押します。
そうするとホスト側のLPC-Link2にファームウェアが書き込まれて、デバッグプローブとして動作するようになります(LEDが消えます)。
続いて、MCUの選択ダイアログが現れます。選択肢が三つありますが、LPC4370はマルチコアで、M4/M0/M0と三つのコアがあることを示していると思われます。最初のデバイスにチェックを入れてOKを押します。
そうすると、ターゲットにバイナリがロードされて、main関数の最初の行で停止します。
Resumeボタンを押すと動作を開始します。うまく動作していれば無事Lチカできたと思います。ブレークやステップ実行など自由にできるようです。
dfu-utilでのLPC-Link2への書き込みは、他のファームウェアは.hdrという拡張子を持ち、16バイトのヘッダが追加されています。labtoolのソース中にその書き換えを行っている部分があります。同様の書き換えをするツールをpythonで作ったのでgistに上げておきます。lpcxpressoディレクトリにarm用のコマンドラインツールが揃っていますので、objcopyでbinaryフォーマットに変換してから、スクリプトhdr.pyに掛けます。このままでは動作しませんが、dfu-utilでの書き込みはできるようになります。おそらくロードされるアドレスの問題だろうと予想しています。設定をもう少し見直してみようと思います。
$ /Applications/lpcxpresso\_6.1.2\_177/lpcxpresso/tools/bin/arm-none-eabi-objcopy -O binary LPC4370\_LEDblinky.axf LPC4370\_LEDblinky.bin
$ ./hdr.py LPC4370\_LEDblinky.bin LPC4370\_LEDblinky.bin.hdr
$ dfu-util -D LPC4370\_LEDblinky.bin.hdr
- LPC-Link2を評価ボードとして使う https://www.lpcware.com/content/faq/lpcxpresso/using-lpclink2-as-lpc4370-eval
- LPC-Link2詳細。回路図もあります。https://www.embeddedartists.com/products/lpcxpresso/lpclink2.php
- LPC4370データシート https://www.nxp.com/documents/data_sheet/LPC4370.pdf
- ヘッダ追加スクリプトhdr.py https://gist.github.com/8976352.git
- LPC-Link2活用の先人ねむいさんのぶろぐ https://nemuisan.blog.bai.ne.jp/?eid=204485