秋月のAE-LPC11U35-MBでDAPLinkを動かす

この記事は、二台のAE-LPC11U35-MBを使用して、Mbed対応ボード（オレオレ版）を作成する手順を説明します。
一台はMbed OSが動作するターゲットボード、もう一台はDAPLinkファームウェアを書き込みます。

AE-LPC11U35-MBやEA LPC11U35 QuickStart Boardを使っていて、以下のようなストレスを持った事のある方にお勧めです。

* Flashのチェックサムを書き込むのが面倒
* 書き込み時に、ISPボタンを押したりfirmware.binを削除する手順が面倒
* 普通にprintfが使いたい
* デバッガも使いたい
* DAPLinkのカスタマイズ方法を知りたい

AE-LPC11U35-MBをもう一台用意すれば、全て簡単に実現できます。

## 事前準備

* [AE-LPC11U35-MB](http://akizukidenshi.com/catalog/g/gK-12144/)　2台（インタフェースとターゲット用）
* [長いブレッドボード](https://www.switch-science.com/catalog/2293/)と[固いジャンパワイヤー](https://www.switch-science.com/catalog/314/)
* （バイナリをビルドする時とデバッグを行う場合）Keil MDK v5.27.x MDK-Essentialライセンス以上

## DAPLinkファームウェアのビルド

ソースコードからDAPLinkファームウェアをビルドするときの手順を以下に示します。

ビルド済みのバイナリを使う場合は、この部分は読み飛ばしてください。バイナリは、こちらからダウンロードできます。
https://www.dropbox.com/s/36kayln4iz1vbbk/ae-lpc11u35-mb_crc.zip?dl=0

ソースコードは、こちらです。
https://github.com/toyowata/DAPLink/tree/ae-lpc11u35-mb
デフォルトのピン設定に対して、AE-LPC11U35-MB用に変更を行っています。

https://github.com/toyowata/DAPLink/commit/7e9d8014a775c4d2bf60daeb2e390543eae13376#diff-221359b2a43d25bcb67a899e4204bb62

* ターゲットをリセットするためのボタン変更
* ターゲットのSWCLKと接続するためのポートの変更
* USBドラッグ&ドロップ書き込み時のLEDポートと極性の変更

バイナリをビルドする場合は、以下のコマンドで行ってください。
Keil MDK v5.27.1（MDK-Essentialライセンス以上）が必要です。

```
> git clone -b ae-lpc11u35-mb https://github.com/toyowata/DAPLink
> cd DAPLink
> pip install -r requirements.txt
> progen generate -t uvision
```

これで、uvision用のプロジェクトが `DAPLink\projectfiles\uvision\lpc11u35_lpc11u35_if` 配下に生成されます。
`lpc11u35_lpc11u35_if.uvprojx` をオープンして、プロジェクトをビルドします。

## DAPLinkファームウェアの書き込み

インタフェース用のAE-LPC11U35-MBにバイナリを書き込みます。ISPボタンを押しながら、USBケーブルでPCと接続します。

### Windowsの場合

`CRP DISABLD`という名称のUSBマスストレージドライブがマウントされるので、ドライブ内の`firmware.bin`を消去します。続いて、DAPLinkファームウェアをコピーします。

### Macの場合

消去と書き込みは、ターミナルを使用して以下のコマンドを入力します。

```shell
$ sudo mount -u -w -o sync /Volumes/CRP\ DISABLD
$ rm /Volumes/CRP\ DISABLD/firmware.bin && cp -X <path to firmware file> /Volumes/CRP\ DISABLD/
```

コピーが終了したら、USBケーブルを抜いて電源を切断します。

## AE-LPC11U35-MB の接続

インタフェースとターゲット用のAE-LPC11U35-MBを接続します。以下の表を参照してください。

|インタフェース (DAPLink) | ターゲット (Mbed OS)|
|---|---|
|1: GND | 1: GND|
|29: +3.3V | 29: +3.3V|
|4: P0_8 | 12: SWDIO|
|8: P0_11 | 6: SWCLK|
|17: P0_18 | 18: TXD|
|18: P0_19 | 17: RXD|
|23: P0_2 | 21: RESET|

以下の写真も参考にしてください。
![lpc11u35_daplink.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75582/b70511af-80f8-bc63-d182-883361c3758a.jpeg)


## 動作確認

AE-LPC11U35-MBの接続が出来たら、インタフェース側のボードをUSBケーブルでPCに接続します（ターゲット側ボードのUSBポートには何も接続しません）。
DAPLINKという名前のドライブがマウントされれば成功です。

### ターゲットバイナリの書き込みと実行

MbedのオンラインIDEやMbed-CLIを使用してバイナリファイルを書き込みます。使用するサンプルコードは、[こちら](https://qiita.com/toyowata/items/68ca7411493c3da5446a)の記事を参考にしてください。
通常のMbedボードと同じようにUSBドライブにドラッグ＆ドロップで書き込みます。書き込み後、USBドライブは再マウントされ、書き込んだファイルはドライブには表示されませんが、これは正常な動作です。書き込みが終了すると自動的にターゲット側ボードがリセットされ、プログラムが走り出します。
ターゲットボードのユーザーボタンを押すと、ターゲットボードをリセットすることもできます。

### printfをシリアルポートに出力する

DAPLinkは、USB CDCでターゲットチップのUARTをホストのUSBに変換する機能を持っています。これを使うことによって、簡単にprintf出力をターミナルソフトウェアから受信することができます。同様に、scanfでターゲット側に送信することもできます。
ホスト側では、TeraTermやCoolTermなどのソフトウェアが利用可能です。


### デバッグする

DAPLinkは、CMSISで標準化されているバッグのためのインタフェース規格CMSIS-DAPが使用可能です。
Mbed-CLIや、Mbed StudioのTerminalビューから以下のコマンドを入力して、MDK-ARMのプロジェクトファイルを生成します。

```
> mbed export -m LPC11U35_401 -i uvision6
```

プロジェクトのルートディレクトリに、`mbed-os-example-blinky-baremetal.uvprojx` ファイルが生成されるので、ダブルクリックしてMDK-ARMを立ち上げます。

標準設定のままビルドすると大量にエラーが発生するので、以下のように`Language C++`の設定を変更します。

![armc6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75582/dfb1253f-4a91-01c0-0d8f-9571f4be6d1f.jpeg)

ビルド後、デバッグセッションを起動すると、プログラムがターゲットボードに書き込まれ、デバッグを行うことが出来ます。

![uvision6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75582/4c7d31f0-0c64-9e86-1318-14617d2d4f44.jpeg)

以上です。