RORO

ふつうの日記

LPC11U35をPlatformIOで使おうとした

なんとなく秋月のLPC11U35ボード (EA LPC11U35 QuickStart Board互換) を買った。macOS + PlatformIOでLチカさせようとしたら、いくつかハマったすえに、ようやくなんとか動作させられたので、それについて記録しておく。ただしMbed OS 5.xをRTOSなしでビルドすることになるため、USBDeviceなどの古いライブラリは使えないようだ…。

(ちなみに私はマイコンの知識はほとんどないし、MbedもPlatformIOも今回はじめて触るので、暗中模索でやっている。)

このボードの特徴は、Mbed対応のボードとしては安い(1個850円)ことと、シリアル経由ではなくMbed的に単体でUSB経由で書き込めること(USBマスストレージとして認識されるので、そこにfirmware.binを突っこむだけで書き換えられる)。

ハマった点

Mbed公式のオンラインコンパイラでビルドしたBlinker(Lチカ)をFinderでいくら書き込んでも全く動作しなくて10分くらい悩んでいて、ふと思いついてコマンドラインからcpやddを使って書き込んだらうまくいった(Linuxでも同様?)。

しかし、PlatformIOで同じLチカコードをビルドしても全然動かない。PlatformIOがMbed OS 5.x系を使うからなのかなと思ったが(このボードはMbed OS 2まで対応と書いてあるので、解決は面倒くさそう…)、そういう話ではなかった。

どうやらマイコン側でファームウェアのチェックサムを調べるらしくて、PlatformIOでビルドしたあとにファームウェアのチェックサムを適切に書き換えてやる必要があるようだ。シリアル (SWD?) で書き込むときは書き込みツールがこの辺の面倒をみてくれるんだと思うけど、mbed的に書き込むときはチェックサムの書き換えが必要になる。

準備

LPC用ファームウェアのチェックサムを書き換えるPythonスクリプトを入れておく。

pip3 install lpc_checksum -U

PlatformIOでの開発

PlatformIOを初めて使うので、安直にVSCodeのPlatformIO IDEを使った。

まずふつうに適当なプロジェクトを作る。ボードは EA LPC11U35 QuickStart Board を選択し、フレームワークはmbedを選択する。

アップロードスクリプトを作る

~/.platformio/nxplpc_osx_usbisp.sh(名前はてきとう)に以下のようなシェルスクリプトを置いておく。ファイルのパーミッションを755にするのを忘れずに。

#!/bin/sh

SOURCE=$1

lpc_checksum $SOURCE
rm -f /Volumes/CRP\ DISABLD/firmware.bin
dd if=$SOURCE of=/Volumes/CRP\ DISABLD/firmware.bin

これは一度作っておけば他のプロジェクトでも使い回せる。

platformio.ini

プロジェクト直下の platformio.ini を開き、アップロード時に上記のアップロードスクリプトが実行されるように設定する。

[env:lpc11u35]
platform = nxplpc
board = lpc11u35
framework = mbed
upload_protocol = custom
upload_command = $PROJECT_PACKAGES_DIR/nxplpc_osx_usbisp.sh $SOURCE

これで終わり。

ボードを書き込みモードにして、PlatformIOのUploadを実行すれば書き込まれる。無事にLチカが動いた。

問題

結局のところ、Mbed OS 5.x系のライブラリを使ってRTOSなしでビルドしているようだ。USBHIDなどのライブラリを使おうとするとビルドが通らなくなる。…だめじゃん。

それと、自分の設定が悪いのかもしれないけど、PlatformIOでmbedプロジェクトをビルドすると、毎回すべてのファイルをコンパイルするのでめちゃくちゃ時間がかかる。

その後、PlatformIOじゃなくてmbed-cliも少しだけ試したけど、Mbed 2.x 対応 (--mbedlibオプション) 周りのライブラリダウンロードの仕組みが壊れてるっぽい… 手動でライブラリをダウンロードしてやっと動いた。

つらい。