Longan NanoをPlatoform IOで完結

# Longan Nano：PlatformIOでBuildおよび書き込みを完結させる
１年以上前に、Longan Nanoを[Switch Scienceさん](https://www.switch-science.com/catalog/5946/)で購入し、よく見かける「Bad Apple」だけトライし、しばらくそのままにしておいたが、久しぶりに触ってみた。Windows 10のPlatform IO「のみ」を利用して、プログラムを書き込むにはポイントがあったので、備忘録としてここに残す。

## シリアル通信
例としてPCとのシリアル通信を取り上げる。このボードでは、シリアル通信はUSBポート経由ではなく、個別に用意されたピンを用いる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a95e61d4-24ae-0fed-58bf-5d45f95fe439.jpeg", width=70%>
Longan Nano（写真下）の左側のピンを、USBシリアル変換ボード（写真上）経由でPCに接続。

## ソースコード
[ここ](https://www.sigmdel.ca/michel/ha/gd32v/longan_nano_01_en.html#serial)にシリアル通信を行うサンプルがあったので、これをそのまま使う。

## Platform IOの設定
### はじめに
備忘録も兼ねているので、PlatformIOの基本的な記載も行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/cea5714d-1e09-fad9-cdda-16076084882b.png)

「New Project」を選び、「Project Wizard」で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f99ca945-f83b-932a-8900-4339695d223f.png)

「Sipeed Longan Nano Lite」ボード（フラッシュ 64KB、RAM 20KB）および「Arduino」フレームワーク（用いたソースコードに依存）を選択。

### platform.ini
書き込み方法として、「upload_protocol = dfu」を追加（他は自動的に作成される）。

```c:platform.ini
[env:sipeed-longan-nano-lite]
platform = gd32v
board = sipeed-longan-nano-lite
framework = arduino

upload_protocol = dfu
```

## DFUモード
プログラムを書き込むには、ボードをDFUモードにする必要がある。
1. BOOT0ボタンを押したまま
2. RESETボタンを押し、その後RESETボタンを離す
3. 最後に、BOOT0を離す
これで、DFUモードに入る。

## インターネットでよく見かける書き込み方法（本稿の目的ではない）
Platform IOでBuild後にできるバイナリ「firmware.bin」を
[本家サイト](http://longan.sipeed.com/en/get_started/blink.html)の「6. Install drivers using Zadig」の記載方法で書き込める。まずはボードをUSB経由でPCに接続し、ZadigによりUSBドライバをインストール。デバイスマネージャでは、
![デバイスマネージャ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5008758c-0504-89f6-22d8-98e09b3952af.png)
となる。その後、上記リンク先の「GD32 MCU DFU Tool」で書き込むことができる。

## Platform IOで書き込み（Upload）失敗
USBドライバが上述の「GD32 Device in DFU Mode」の状態で、書き込み（Upload）すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/29dd5d54-1827-214a-bc7f-e8d89b660c44.png)
と、DFUデバイスが見つからずとなり、書き込みに失敗する。

## Platform IOで書き込み（Upload）するには（本題）
### USBドライバ変更
調べたところ、[この記事](https://forum.seeedstudio.com/t/cannot-upload-firmware-to-longan-nano-board-with-latest-dfu-utils/255806)にある方法で書き込むことが可能であった。USBドライバを「Libusb-WinUSB」に変更する。[ここ](https://visualgdb.com/UsbDriverTool/)からUSBドライバ変更ツールをダウンロード。ツールを起動すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/fc610e8d-4a01-7e39-fb7c-42261f088849.png)

「GD32 Device in DFU Mode」が見つかる。「Change driver type」を選び、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/173c285f-969c-906c-7e33-d3bfa0b25fc5.png)

「Libusb - WinUSB」を選び「Install」。すると、

![USB Driver Tool 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5fd77d56-bb96-9e74-6e84-0eab8bc2e341.png)

「GD32 Device in DFU Mode (Libusb - WinUSB)」となる。デバイスマネージャでは、

![デバイスマネージャ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7473bb2f-5c88-7ff1-3371-5d2c7828eeae.png)

「libusb (WinUSB) devices」が見つかる。

### 書き込み（Upload）
「libusb (WinUSB) devices」の状態で、書き込み（Upload）実施。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/25ef9e1c-5c31-df13-1c75-3fde9d1c4841.png)

これで、「GD32 MCU DFU Tool」を使わず、Platform IOのみでビルド＆書き込みが可能となる。めでたし。

### おまけ
[本ソースコード](https://www.sigmdel.ca/michel/ha/gd32v/longan_nano_01_en.html#serial)のシリアルコンソールの状況。
![Teraterm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/94be6dea-017c-9db2-4844-a501f534c60f.png)