LPC1114書き込みメモ

# このメモの目的
LPC系のチップは評価ボードもあり、LPCXpressoと連携すれば悩むこと無く書き込みやデバッグができます。その一方で、チップ単体から回路組んで書き込みする方法は簡潔にまとまった情報がなく、検索したりマニュアルとにらめっこしなければならないのが現状です。まぁ、マニュアルを読めば良いのですが、毎回必要になる度に調べるのも面倒なので、ざっくりとしたメモを残し、次回の糧にしたいと思います。

# 書き込み方法
LPC系はシリアルで書き込む方法と、Serial Wire Debug（SWD）と呼ばれるデバッグ機構を経由して書き込む方法の2種類があります。LPCXpressoを使っている時はSWDで繋げておくとソースコードでブレイクポイント張ってステップ実行できたりと便利なのですが、今回はIDEなしでconsoleから気軽に使う事を想定しているのでシリアル書き込みがターゲットです。

# 想定する開発環境
## コンパイラ
gccによるクロス開発環境を想定しています。Debian系ならaptで```gcc-arm-linux-gnueabi```をインストール。書き込みには関係ないですが、LPCXpressoを使わない開発方法として参考まで。リンカースクリプトとか自前で用意したりする必要があるのですが、それはまた別のお話。興味ある人は[Applerm-IIのリポジトリ](https://github.com/toyoshim/Applerm-II)あたりを覗いてみて下さい。

## 書き込み
lpc21ispを使います。これもDebianなら```lpc21isp```というパッケージがあるようですが、自分はソースからbuildしたversion 1.97を使っています。理由は覚えていないのですが、もしかしたらパッケージ版が古くてLPC1114をサポートしてなかったとか、そんな理由かもしれません。

# 書き込みの実際
## 回路
USBシリアルが必要。TXD/RXDに加えてDTR端子とRTS端子もあれば完璧なんですが、RTS端子までついてる変換器はわりと少ないので、そこは手作業で対応します。試行錯誤する場合には辛いですが、手持ちのファームをさくっと書き込むレベルならたいした手間ではありません。

写真はDTR端子はあるけどRTS端子はない例
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f31323834332f31303337363539632d383061302d666362642d633036642d3236393261353836666435372e6a706567.jpeg](https://qiita-image-store.s3.amazonaws.com/0/12843/3a387ce6-5553-f546-7b5d-944fc9038271.jpeg)

写真では右上が15ピン。左に向かって16, 17, ...となっており、隠れて見えないですが抵抗の片足は24ピンに刺さっています。

| LPC1114 | USB Serial |
|:--------|:-----------|
| 24 ISP  | RTS        |
| 23 /RST | DTR        |
| 22 GND  | GND        |
| 21 VDD  | VDD        |
| 16 TXD  | RXD        |
| 15 RXD  | TXD        |

## 手順
### 全て結線できている場合
```shell-session
$ lpc21isp -control -term -bin lpc1114app.bin /dev/ttyUSB0 115200 12000
lpc21isp version 1.97
File lpc1114app.bin:
	loaded...
	image size : 27578
Image size : 27578
Warning:  data not aligned to 32 bits, padded (length was 6BBA, now 6BBC)
Synchronizing (ESC to abort).. OK
Read bootcode version: 1
7
Read part ID: LPC1114.../102, 32 kiB FLASH / 4 kiB SRAM (0x1A40902B)
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 0: ..........................|.........................|.........................|.........................
Download Finished... taking 7 seconds
Now launching the brand new code
Terminal started (press Escape to abort)
```

こんな感じでコマンド一発で書き込みつつ、即座にシリアルコンソールを繋いだ状態で再起動してくれます。以下、簡単に引数の説明。

```-control``` はDTRとRTSを制御してISPモードでリセットかけたり、通常モードで再起動するための指定。
```-term``` をつけると再起動後はISPで繋いでたシリアルをそのままシリアルコンソールとして利用可能。
```-bin``` は後ろに書き込むファームのファイル名を指定。

その後に続く3つの引数は、USBシリアルのデバイス名、シリアルターミナルの通信速度、クロック速度(kHz)です。通信速度はファームの想定と合わせないと出力が化けるので注意しましょう。

### RTS端子がない場合
本来RTS端子が操作してくれる24 ISP端子を自力で制御します。まず24 ISPと22 GNDの間を適当な抵抗で接続し、ISPの信号をLowに落とします。この状態でlpc21ispを走らせると、RTSが結線していなくても最初のリセットでISPモードに落ちファームウェア書き込みが開始されます。書き込み完了までの間に抵抗を抜けば、書き込み完了時のリセットで通常モードに戻り、そのまま書き込んだファームウェアが走り始めます。

頻繁に書き込むようならスイッチでも挟んで、スイッチを押しながらlpc21ispをスタートするようにすれば、まぁ耐えうる開発環境にはなるかと思います。

### DTRもRTSもない場合
24 ISPに加えて23 /RSTも自力で制御しましょう。/RSTはHighに吊っておき、ISPをLowに落としながら/RSTを→Low→Highと動かすことでISPモードに入ります。このままlpc21ispを走らせれば書き込みできるはずです（試してませんが）。ファームウェアを起動するにはISPをHighに戻した状態で/RSTを→Low→Highしましょう。この場合もスイッチ挟んで回路を組んでおけば、耐えられないってほどではないかと思います。

# まとめ
以上のように、簡単な配線でUSBシリアルから書き込みできます。ただし24ピンのISPモードの入り口だけは、知らないとハマって時間を食われるので注意しましょう。説明書だけ読んでても見落としがち。

# おまけ
## SWD対応のトラ技ライター（2014年3月付録）
実はNXPのページにも[トラ技ライターのピン配置](http://www.nxp-lpc.com/lpc_boards/arm-writer/)についての情報がある。
ピンを奥に向けて上にUSB端子が来るように持つと、右から1番ピンとなり（よく見れば1番の印字あり）、順番にVDD / TARGET_SWDIO / TARGET_SWCLK / TARGET_SWO / TARGET_TDI / TARGET_nRESET / EXTPOWER / GNDとなっている。LPC810で試した限りでは電源周り以外で必須なのはSWDIOとSWCLKだけ。で、実はこの配置はLPC-Link2と同じ。LPC-Link2も高くはない（秋月で2,800円）のでデバッガ使いたい時には素直に買うほうが時間を無駄にせずにすみます。