LPC1114FN28，10年の時を経て🦑

部品入れから発掘したDIP28のArmマイコン：LPC1114FN28を久しぶりに動かした．
過去にやったことなどを思い出しながら作業．
これはその記録．

# IchigoJamは11歳．そしてLPC1114FN28を発掘

あの`IchigoJam`はもう[11歳になった](https://fukuno.jig.jp/4633)らしい．
さらに[NXPのFRDM-MCXA153](https://www.nxp.jp/design/design-center/development-boards-and-designs/FRDM-MCXA153)にも対応したというニュース！

それからさらに，先日ラボの引越しでDIP28ピンパッケージのArmマイコン：[LPC114FN28](https://www.nxp.com/products/LPC1100)が発掘されたばかり．


![DSC_2372.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/67f4a4cd-ae4b-4b5a-8680-63a9661fc8e8.jpeg)

# mbedがないから🦑できない

そんなこんなで懐かしいこのチップにファームを書き込んで，久しぶりに[IchigoJam](https://ichigojam.net)をさわってみようと思ったけど，もう[mbed.orgのオンライン・コンパイラは使えなくなってしまった](https://os.mbed.com/blog/entry/Important-Update-on-Mbed/)ので，以前のように気軽に[イカ醤油ポッポ焼き](https://os.mbed.com/users/okano/code/ika_shouyu_poppoyaki/wiki/Homepage)できなくなってしまった( i꒳i ）

ちなみに「イカ醤油ポッポ焼き」の本名は「ISP = In System Programming」．LPC1114が持っているフラッシュ・メモリ書き込みの機能を指す言葉．

# 残された手段
## もっとも簡単な方法
もちろんデバッグ・インターフェースを使って開発ツールから書き込むことはできる．たとえば[mbed LPC1114FN28](https://os.mbed.com/platforms/LPC1114FN28/)のような基板があれば，USBに接続して，ストレージデバイスとして現れたそれにドラッグ・アンド・ドロップすればOKなんだけど，これを読んで「久しぶりに自分もやってみよう」と考えた人がもし居たとしても，このmbedがなければ試せない．
(「もう買えないし」って書こうかと思って調べてみたら.. [まだ買えるっぽい！](https://www.switch-science.com/products/1714)(2025年4月5日現在))

でもISPを使えば当別なハードウェアは不要で，USB↔︎シリアル変換器さえあれば書き込みができる．[FlashMagic](https://www.flashmagictool.com)や[lpc21isp](https://github.com/capiman/lpc21isp)というこの機能をサポートしているアプリケーションがあった．

## FlashMagic
当時よく使われた「[FlashMagic](https://www.facebook.com/notes/833249204082398/)」ってアプリがあったんだけど，もうとっくにメンテされてないみたいで，Mac用の最後のバージョンはダウンロードしてきても動かなかった (´・ω・｀)

## lpc21isp
そんなわけで最後の望み．lpc21ispを試す．こちらももう[更新は止まってるみたい](https://github.com/capiman/lpc21isp)．でも昔のコードは少しの変更で問題なく動いた (ところでこのページ，なぜか自分のアイコンが出てるではないか．このころプルリク出したりしてたのを完全に忘れてた)．

今回の変更は[フォークしたリポジトリが自分のアカウントにそのまま残ってた](https://github.com/teddokano/lpc21isp)ので，その中に反映させておいた(ついでにプルリクも出しといた．どうなるかわからんけど)．

このコードのビルドは，[上記のリポジトリ](https://github.com/teddokano/lpc21isp)をクローンするかダウンロードして`make clean; make`するだけ．なーんも面倒なことはない．

```
alice:~/dev/lpc21isp % make clean; make
rm -f adprog.o lpcprog.o lpcterm.o lpc21isp
gcc  -Wall -D__APPLE__ -c -o adprog.o adprog.c
gcc  -Wall -D__APPLE__ -c -o lpcprog.o lpcprog.c
gcc  -Wall -D__APPLE__ -c -o lpcterm.o lpcterm.c
gcc  -Wall -D__APPLE__ -o lpc21isp lpc21isp.c adprog.o lpcprog.o lpcterm.o
alice:~/dev/lpc21isp % ls
adprog.c     lgpl-3.0.txt lpc21isp.h   lpcprog.h    lpcterm.o    StdAfx.h
adprog.h     lpc21isp     lpcprog.c    lpcprog.o    Makefile
adprog.o     lpc21isp.c   lpcprog.dsp  lpcterm.c    Makefile.vc
gpl.txt      lpc21isp.cbp lpcprog.dsw  lpcterm.h    README
```

# ハードウェア

## 用意するもの
- ブレッドボード
- USB↔︎シリアル変換のケーブル．今回は部屋に転がってたコレを使う → [FTDI C232HD-DDHSP-0](https://ftdichip.com/products/c232hd-ddhsp-0/)
- ジャンパ線
- 抵抗数百Ω〜1kΩぐらいのを1個 (オプション)
- LED 1個 (オプション)

## 接続
MacとLPC1114の接続はブレッドボードとUSB↔︎シリアル変換のケーブル：FTDI C232HD-DDHSP-0を使うとこんな感じになる．

![lpc1114fn28_breadboard_connection_via_ftdi_c232hd_ddhsp_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/96e870c1-72e9-441b-97d8-e09c36bee7ad.png)

:::note warn
警告
USB↔︎シリアル変換のケーブルには**3.3V対応品**を使うこと．同様の製品で電源と信号に5Vが出るものがあります．信号は5Vでも構いませんが(LPC1114は5Vトレラント入力なので)，電源に5Vを入れるとチップがダメになる可能性大です．
:::
:::note info
図にはいい感じに書くことができなかったので省略したけど，LPC1114の3.3V電源(pin21)とGND(pin22)は，ピンのすぐそばで100nF程度のコンデンサを入れておきましょう．
:::

USB↔︎シリアル変換ケーブル信号は色分けされていて，それぞれに電源や信号が割り当てられています (下の図は[データシート](https://ftdichip.com/wp-content/uploads/2023/05/DS_C232HD_UART_CABLE.pdf)から抜粋)．

![ftdi_cable_colors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/8b421252-1dcb-4e0b-b8f9-23016f868580.png)

緑と灰色(図では黄土色)の線は，lpc21ispを使ってのフラッシュ・メモリへの書き込みを行うときだけに使うもの．
でもこの2本の線は絶対必要なわけではなくて，無くてもフラッシュの書き込みは可能です(後述)．

![DSC_2375.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/03f02b28-952c-4610-a513-f736d936ec43.jpeg)

### LPC1114のISPモード

LPC1114FN28のpin23は`リセット`．pin24は`PIO0_1`というピンになっていて，この`PIO0_1`は特別な機能を持っています．
リセットを解除(pin23がLOWからHIGHに変化)する時に`PIO0_1`がLOWであると，LPC1114は内部ROMから立ち上がり「ISPモード」に入ります．これはシリアル・インターフェース経由で内部フラッシュメモリにアクセスするための特別なモード．
`リセット`と`PIO0_1`ピンにボタン・スイッチをつけておいて手動でこの手順を行ってもいいのですが，書き込みのたびに操作するのは面倒．なので書き込みソフトからこれをやってもらいます．
灰色の線は`リセット(pin23)`，緑は`PIO0_1(pin24)`に接続しておきます．

一旦フラッシュへの書き込みが済んだら，あとは電源の再投入やリセットのたびに内部フラッシュに書き込まれたコードが実行されるようになります．ただし電源投入直後やリセット解除時の`PIO0_1`は，非接続状態かまたはHIGHになるようにしておく必要があります．

# 書き込む

LPC1114に書き込むIchigoJamのファームウェアは[このページ](https://ichigojam.net/download.html)から入手できます．

「ver1.4.3」のリンクをクリックすると`ichigojam-1.4.3.zip`ががダウンロードされます．
このzipを解凍すると「ichigojam-jp-ntsc-jpkbd.bin」や「ichigojam-jp-ntsc-uskbd.bin」のファイルが出てきます．たぶんどっちでも問題ないはずですが，私はもとからUSキーボード・ユーザだし，それっぽい名前のファイルがあるのでそれを書き込んでみます．

さっきmakeしたアプリケーションを下のようなコマンドで動かします．
```bash
./lpc21isp -control -bin /Users/tedd/Downloads/ichigojam-1.4.3/ichigojam-jp-ntsc-uskbd.bin /dev/tty.usbserial-FTUMFUSM 115200 48000
```
このコマンドは..
- 最初はもちろん，アプリケーションの名前．`lpc21isp`をビルドしたディレクトリ内でコマンドを打っているので，最初に`./`をつけています．(カレント・ディレクトリにパスが通っていれば`./`は必要ありません)
- 次の-controlはリセットとISPモードに入れるためのピンの制御を行う指定
- 次の-binは，それに続く文字列が書き込むデータ・ファイルへのパスで，それがbinフォーマットであることを示す．このファイル・パスは手で打ち込む必要はなく，書き込みたいファイルをターミナルソフトのウィンドウにドラッグ・アンド・ドロップすれば入力できます
- その次は書き込むデバイスを接続したシリアルポートの指定．WindowsならCOM3のようなポートの指定になるけど，Macの場合は/dev/tty.usb*のようなスペシャル・ファイルとして見える．(これはあらかじめ`ls /dev/tty.usb*`のようなコマンドを実行して確認しておきます)
- さらに次はボーレート設定．これは9600，19200，38400や57600でも構いません(LPC1114はISPの際のボーレートを自動認識する)．でも書き込みは早く終わってくれる方がうれしいから一番高いボーレートを設定
- 最後はLPC1114のクロック周波数を指定

コマンド実行後に「Download Finished... taking 〇〇 seconds」のような表示が出れば完了です．下の画像は，lpc21ispのビルド→シリアルポートの確認，lpc21isp実行を行って完了した様子．

![スクリーンショット 2025-04-05 4.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/20ef9a32-673a-467b-919c-e1bfaf7c543c.png)

# IchigoJamの動作確認

## ターミナルソフトの設定
そのあとは**ターミナルソフト**を開いて，先ほどのシリアルポートを指定して，ボーレートを115200に．さらにローカル・エコーを有効にして接続すれば，**IchigoJamが使えます**．

参考として[SerialTools.app](https://apps.apple.com/jp/app/serialtools/id611021963?mt=12)と[CoolTerm 2.3.0](https://freeware.the-meiers.org)を使用した場合の設定を載せておきます．

### SerialTools.appで使う

[SerialTools.appはAppleのApp storeに登録されている](https://apps.apple.com/jp/app/serialtools/id611021963?mt=12)アプリケーションなのでインストールが簡単です．

:::note warn
注意：
SerialTools.appを使うときには，フラッシュ書き込み時に使った緑と灰色の線を外しておきましょう．  
接続したままだとリセットがかかったままの状態となって動きません．
緑と灰色の線はフラッシュ書き込みにだけ必要なものでした．なのでこれ以降は外したままでOKです．
:::

上記のリンクからインストールしてアプリケーションを開くと次のようなウィンドウが開きます．2箇所を設定して(フラッシュ書き込み時に使った値と同じ)「Connect」ボタンを押します．

![スクリーンショット 2025-04-10 18.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/444f5cd6-b7fe-4f7f-a510-8833531d14d8.png)

この状態では何も表示されませんが，`reset`コマンドを打つとLPC1114にリセットがかかり，IchigoJamが再起動されます．

![スクリーンショット 2025-04-10 18.19.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/1b83e9b2-fdc0-4b3e-a9f0-caa43cb78111.png)

![スクリーンショット 2025-04-10 18.28.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/5a4616eb-f3e7-4cdd-9629-b35605d079cf.png)


### CoolTerm 2.3.0で使う

CoolTermはApp storeに登録されてないアプリケーションで，[作者の配布ページ](https://freeware.the-meiers.org)からダウンロードしてきます．

![スクリーンショット 2025-04-10 18.32.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/b633475a-480c-4d16-a4cc-646cbe896810.png)

このアプリケーションを最初に開くと警告メッセージが出て起動することができません．完了ボタンを押して一旦閉じます．

![スクリーンショット 2025-04-10 18.35.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/8988e476-0ef7-411d-969f-786e4085dff2.png)


このあとで，Macの「システム設定.app」を開き，「プライバシーとセキュリティ」項目のアプリケーション実行許可を設定します(もしこの設定を行うことが不安な場合は，上記の別のアプリを使いましょう)．

![スクリーンショット 2025-04-10 18.37.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/1b70d8ed-3452-4dfb-b78d-ab182b5ef20a.png)

アプリケーション実行許可の設定後は，問題なく開くことができます．  
開いたウィンドウ上部のOptionsボタンを押して，下図のように設定を行いましょう．  

「![スクリーンショット 2025-04-10 18.43.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/8349c05d-2885-4606-be8e-170ad5d5fd4a.png)
」

![スクリーンショット 2025-04-05 6.21.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/9c00c772-ff85-46f1-a2b4-0f7b7569ced7.png)

上図の下部にある`DTR Off`と`RTS Off`のチェックは必須ではありませんが，両方ともデフォルト状態の`On`になっていると，`リセット`と`PIO0_1`がLOWのままになってしまいます．USB↔︎シリアル変換のケーブルを繋いだままにしているなら，この設定をしないと動きません．

![スクリーンショット 2025-04-05 6.21.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/3a5d6f86-7179-4009-8e32-106b205b183a.png)

## 動かしてみる

次のようなコードを動かせば，`Hello, world!`を10回表示して終了します．

```basic
10 for i=0 to 9
20 print "Hello, world!"
30 next
```

![スクリーンショット 2025-04-05 6.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/4ae7d32f-d339-466f-aff7-11875bc8368e.png)

無事に動いたら，めでたしめでたし( ´ ▽ ` )ﾉ
接続しておいたLEDは次のようなコードで点滅させることができます．
```basic
10 print "Hello, LED blinker!"
20 for i=0 to 10
30 led i%2
40 wait 6
50 next
```

:::note info
コードを毎回打ち込むのは大変．なのでパソコン上で編集しておいたテキストを流し込むことも可能です．

CoolTermはバージョン1.x.xのころは，通信状態の画面へのコピペでコードを書き込むことができたのですが，2.3.0では`Send string...`メニューを使わないとダメっぽいです．
![send_string.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/eb260104-4ebd-4ca4-9818-562b3340105e.png)
:::

# このあとは..

次回以降はファームウェアの書き込みは必要ありません．そのため，ケーブルも4本だけ接続すればOKです．

![no_firm_programming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/fec4d7ca-3c2a-4150-aa20-d1d863db5f69.png)

![DSC_2390.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/1af0f380-4c33-4901-a190-f0b28fb4bf19.jpeg)

これで簡単手軽なミニマムなIchigoJam環境の完成です．

そうそう．FRDM-MCXA153にポートされたIchigoJamも動かしてみたので，これもそのうち書いてみることにしよう😃

![スクリーンショット 2025-04-04 17.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/1c9487ed-10f2-4a06-953c-36c370ad3e34.png)

:::note info
[LPC1114FN28，10年の時を経て🦑](https://qiita.com/teddokano/items/0c6f0490cfade4f40795) © 2024 by Tedd OKANO is licensed under [CC BY 4.0](http://creativecommons.org/licenses/by/4.0/?ref=chooser-v1) 
[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by/4.0/88x31.png)](http://creativecommons.org/licenses/by/4.0/deed.ja)
:::