[lang:ja] lpc21ispをLPC824でも使えるようにしてみた

  • このNotebookでは、LPC824が使われている mbed platform (LPC824MAXなど) でどうしても lpc21isp を使う必要がある特殊な方のために、わたしがやったことを書いていきます。
  • 実験した環境はUbuntu Linux のみです。 Windows、Mac環境でのコンパイル方法はよくわかりません。 でも普通のC言語で書かれているようなので、少なくともMacは比較的簡単にバイナリを作れると思います。 Windows環境のひとは頑張ってください。 Cygwinとか入れればいけるんじゃないでしょうか。
    • 追記(14.Jan.2015) gcc-mingw-w64 を使ってクロスコンパイルできました 下の方に詳細書きます
    • 追記(27.Jan.2015)動作確認できたのでバイナリを貼り付け

lpc21isp is 何

lpc21isp はPCのシリアルポートを使ってLPCマイコンに書き込みをするためのコマンドラインツールです。でも、現在のところLPC820シリーズには対応していません。それでは困る。私だけ?
lpc21ispを使うにはターゲットのマイコンをISPモードにします。LPC824の場合はP0_12,P0_4,P0_0を使います。
このうちP0_0とP0_4はシリアル通信用です。P0_12をLにしたまま電源を入れ、P0_0とP0_4で通信をします。

私がやったこと

LPC824MAXに載っているmbed HDKのIC(LPC11U35)をUSB-UARTコンバータとして使います。

  • LPC824MAXのデフォルト設定だとHDKからの受信ができず、送信には別のピンが使われているので、 いくつかのジャンパ設定を変更します。
    • R36を取り外す
      • R36の右側にHDKに行く信号が来ています。R36を取り外して左のパッドをP0_4につなげます。
    • SJ9[1-2] をつなぐ
      • SJ9[3] にHDKからの信号が来ています。デフォルトで[1-2]がつながってるので、触りません。残った[3]をP0_0につなぎます。 顕微鏡が欲しくなりますが、頑張ります
        • この信号はHDKからR27を通ってきています。SJ9にハンダするのがしんどい人はR27を取り除いて左のパッドからつなぎましょう。右のパッドとつながってしまっても実害はありません。

/media/uploads/k4zuki/2015-01-10_02.58.48.jpg

  • ソースツリーをGitHubからクローンします:
git clone https://github.com/capiman/lpc21isp.git

ソースツリーを追いかけていったところ、lpcprog.c というファイルの中で各種LPCマイコンのID、フラッシュ容量、RAM容量をリストアップしているのを見つけました(125行目付近)。このリストにLPC820シリーズの情報を追記すればそのまま対応できそうです。

lpcprog.c(抜粋)

static LPC_DEVICE_TYPE LPCtypes[] =
{
   { 0, 0, 0, 0, 0, 0, 0, 0, 0, CHIP_VARIANT_NONE },  /* unknown */

   // id, id2, use id2, name of product, flash size, ram size, total number of sector, max copy size, sector table, chip variant

   { 0x00008100, 0x00000000, 0, "810M021FN8",    4,   1,  4,  256, SectorTable_8xx,  CHIP_VARIANT_LPC8XX  },
   { 0x00008110, 0x00000000, 0, "811M001FDH16",  8,   2,  8, 1024, SectorTable_8xx,  CHIP_VARIANT_LPC8XX  },
   { 0x00008120, 0x00000000, 0, "812M101FDH16", 16,   4, 16, 1024, SectorTable_8xx,  CHIP_VARIANT_LPC8XX  },
   { 0x00008121, 0x00000000, 0, "812M101FD20",  16,   4, 16, 1024, SectorTable_8xx,  CHIP_VARIANT_LPC8XX  },
   { 0x00008122, 0x00000000, 0, "812M101FDH20", 16,   4, 16, 1024, SectorTable_8xx,  CHIP_VARIANT_LPC8XX  },
...

ところで、

日本でいちばん有名なmbedプログラム ことイカ醤油ポッポ焼き はご存知でしょうか。
このプログラムはlpc21ispと同じことをmbed LPC1768から行わせるものです。このプログラムはLPC82Xに対応済です。オンラインコンパイラでコンパイルしたLPC824用バイナリを bin という名前にリネームしてmbed LPC1768 の中に放り込めば書き込めちゃいます。 ...あれ?これがあればいいんじゃね?
このイカ醤油ポッポ焼きに新しいデバイスを追加する方法をざますさんが書いています:

この記事をヒントにして lpcprog.c に追記します(137行目付近):

lpcprog.c (抜粋)

   { 0x00008241, 0x00000000, 0, "824M201JHI33", 32,   8, 32, 1024, SectorTable_8xx,  CHIP_VARIANT_LPC8XX },
   { 0x00008221, 0x00000000, 0, "822M101JHI33", 16,   4, 16, 1024, SectorTable_8xx,  CHIP_VARIANT_LPC8XX },
   { 0x00008242, 0x00000000, 0, "824M201JDH20", 32,   8, 32, 1024, SectorTable_8xx,  CHIP_VARIANT_LPC8XX },
   { 0x00008222, 0x00000000, 0, "822M101JDH20", 16,   4, 16, 1024, SectorTable_8xx,  CHIP_VARIANT_LPC8XX },

一番左がchip ID、次の2つは他のデバイスも 0x00000000,0 なので真似します。その次はチップの名前からLPCを差し引いたもの(パッケージオプションでIDが違います)、フラッシュ容量(キロバイト)、RAM容量(キロバイト)、セクタ数、セクタの大きさ(バイト)、あとはLPC810シリーズからコピペで済ませました。
これで行けると信じてコンパイルします。 make 一発でバイナリができあがります。

yamamoto@yamamoto-desktop:~/workspace/lpc21isp$ make
gcc  -Wall -static -c -o adprog.o adprog.c
gcc  -Wall -static -c -o lpcprog.o lpcprog.c
gcc  -Wall -static -c -o lpcterm.o lpcterm.c
gcc  -Wall -static -o lpc21isp lpc21isp.c adprog.o lpcprog.o lpcterm.o

早速実行します。

yamamoto@yamamoto-desktop:~/workspace/lpc21isp$ ./lpc21isp -bin '/home/yamamoto/ダウンロード/uart_i2c_conv_824_LPC824.bin' /dev/ttyACM0 115200 12000
lpc21isp version 1.97
File /home/yamamoto/ダウンロード/uart_i2c_conv_824_LPC824.bin:
    loaded...
    image size : 15716
Image size : 15716
Synchronizing (ESC to abort)........... OK
Read bootcode version: 1
13
Read part ID: LPC824M201JHI33, 32 kiB FLASH / 8 kiB SRAM (0x00008241)
Will start programming at Sector 1 if possible, and conclude with Sector 0 to ensure that checksum is written last.
Erasing sector 0 first, to invalidate checksum. OK 
Sector 1: ...
Sector 2: ...
Sector 3: ...
Sector 4: ...
Sector 5: ...
Sector 6: ...
Sector 7: ...
Sector 8: ...
Sector 9: ...
Sector 10: ...
Sector 11: ...
Sector 12: ...
Sector 13: ...
Sector 14: ...
Sector 15: ...
Sector 0: ..
Download Finished... taking 3 seconds
Now launching the brand new code

追記:Windows用にクロスコンパイルしてみた(してみただけ)

私もWindows環境で使えない状態なのは困るのでGoogle大先生で調べたところ、gcc-mingw-w64というのをインストールしてクロスコンパイルすればWindows用のバイナリが作れそうなことがわかりました(参考)。 Makefileを改変するかMakefile.mingwみたいなファイルを作って以下の改変をします:

  • 4行目:
CC = i686-w64-mingw32-gcc
  • 32行目:
$(CC) $(CDEBUG) $(CFLAGS) -o lpc21isp.exe lpc21isp.c adprog.o lpcprog.o lpcterm.o

出来上がったファイルを確認:

yamamoto@yamamoto-desktop:~/workspace/lpc21isp$ file ./lpc21isp.exe
./lpc21isp.exe: PE32 executable (console) Intel 80386, for MS Windows

>> できたバイナリ <<

エェェェェンベッド!







こういうのめんどくさいから誰かPythonでつくって


Please log in to post comments.