Wio LTE Cat.1とデバッグアダプタプローブ

> 本記事は[SORACOM Advent Calendar 2021](https://qiita.com/advent-calendar/2021/soracom)の23日目です。

普段はマイコンの開発環境やライブラリをゴニョゴニョしています。時々、受託案件の開発もしています。
セルラーのSORACOM活用案件のときは、ハードウェアが出来上がるのを待たずにWio LTE Cat.1を両面テープで段ボールに貼って手配線しています。こうすることで、スーパーウルトラ早くスタートダッシュをキメています。~~納入が早いかどうかは別~~

**Wio LTE Cat.1でSPI FRAMへの通信を確認している様子**
<img width="400" alt="image.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/64ef31b6-db58-a676-1e76-75e5c402cd22.png">

電気的な振る舞いは以下の測定機器を使って確認しています。それなりにお金が飛んでいきますが、見えないものが見えるようになるのは時間短縮できるし、なにより気分がいいです。安心感あがるのでオススメです。

**測定機器:**

* 全般
  * デジタルテスター（YOKOGAWA製7536-03。反応が早くて良い。）
* UART/I2C/SPIなど
  * ロジックアナライザ（[Saleae Logic Pro 16](https://www.saleae.com/ja/)。この道具は必須！）
* インターネット通信
  * パケットキャプチャ（みんな大好き[WireShark](https://www.wireshark.org/)。言わずもがな。）

定番のオシロスコープは、最近はほとんど使っていません。アナログ回路をいじる機会が無いのと、Saleae Logicがちょこっとアナログ測定できるからでしょう。Saleae Logic神。

そうそう、以前は、セルラー通信がうまく動かないときは泣きながらひたすら脳内デバッグしていたのですが、、、[SORACOM Airは簡単にパケットキャプチャできる](https://blog.soracom.com/ja-jp/2021/05/28/soracom-peek-for-sim/)ようになったのでデバッグが捗ります。いやぁ、便利な世の中になったもんだ。

一方、ソフトウェアはというと、案件のコード量とか低レベルの操作具合で、

* [Arduino IDE](https://www.arduino.cc/en/software)（お手軽。）
* [STM32Cube IDE](https://www.st.com/ja/development-tools/stm32cubeide.html)（~~STM32 MCUなら~~便利ツールが豊富。）
* [Keil MDK](https://www.arm.com/ja/products/development-tools/embedded-and-software/keil-mdk)（Arm社純正。）

を使い分けています。
実際はArduino IDEを使っていることが多いですね。たぶん、ライブラリを使い慣れているとか、ネットでググると日本語情報が多いとか、そんな理由なのだと思います。GroveDriverPackライブラリとWio LTE for Arduinoライブラリをよく使っています。

**よく使うライブラリ:**

* コア部分
  * [SeeedJP STM32 Boards](https://github.com/SeeedJP/Arduino_Core_STM32)
* 物理アクセス
  * [GroveDriverPack](https://github.com/SeeedJP/GroveDriverPack)
* コネクティビティ
  * [Wio LTE for Arduino](https://github.com/SeeedJP/WioLTEforArduino)

ただ、このArduino IDE、デバッギング機能が弱くて、コードの途中まで実行して止める（ブレークポイント）とか、変数の値を見る（ウォッチ）といったパソコンソフト開発では当たり前な操作ができません。シリアルモニタにメッセージを表示するコードを追加（PRINTデバッグ）するぐらいで、あとはひたすら脳内デバッグという「脳トレか！」というような苦行を強いられます。

が、しかし！！
ほんのひと手間（と、ちょこっと投資）をすれば、Wio LTE Cat.1でも一般的なデバッギングの機能を使うことが可能です。

前振りが長くなりましたが、、、
本記事では、Wio LTE Cat.1のアプリをデバッグする方法を紹介したいと思います。

# PRINTデバッグ

Wio LTE Cat.1をArduino IDEでデバッグするツールは、COM通信を表示する”シリアルモニタ”ぐらいしかありません。コードに`SerialUSB.print(...)`や`SerialUSB.println(...)`などを追加して、実行箇所の把握や変数の値を確認します。これはPRINTデバッグと言われる方法で、分かりやすい反面、いちいちコードを書き換えないといけないので手間がかかります。めんどい。

**シリアルモニタに表示されている様子:**
<img width="600" alt="image.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/bcbadc07-a94f-fbdc-5829-e113b35341ff.png">

# コンパイルと書き込み、シリアルモニタの仕組み

スケッチのコンパイルとWio LTE Cat.1への書き込み、シリアルモニタに表示される仕組みを詳しく見てみましょう。

<img width="600" alt="image.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/ca29dc7f-300a-323e-cb57-a4c36ddc0286.png">

自分のコード（ここではapp.ino）をArduino IDEでコンパイルすると、ツールチェーンといわれる一連のソフトを起動して、Wio LTE Cat.1に放り込むバイナリイメージ（app.ino.bin）が生成されます。そしてArduino IDEで書き込み操作すると、DFU upload toolがバイナリイメージ（app.ino.bin）をUSB経由でWio LTE Cat.1へ転送します。このとき、Wio LTE Cat.1ではDFU upload toolからの転送を受け止めなければいけません。この受け止めるソフトがBootloaderというもので、DFU upload toolで転送する前に起動しておく必要があります。
「Bootloader起動はBOOTボタンでは？」と思ったあなた、Wio LTE Cat.1に詳しいですね。BOOTボタンを押しながらRSTボタンを押すことを「DFUモードに切り替える」と呼んでいますが、実はこの操作でBootloaderを起動しています。その後、BootloaderがUSB接続を検知するとDFU bootloaderを実行して、DFU upload toolからの転送を受け付けるようになります。そして、バイナリイメージを受け取ると、そのイメージを内蔵Flashに書き込みます。

**Wio LTE Cat.1の起動時orリセット時:**

1. BOOTボタン押してある  
  Bootloader起動 -> USB検知 -> DFU bootloader実行 -> DFU upload toolから受け取ってFlashへ書き込み
2. BOOTボタン押していない  
  Flash起動

コードで`SerialUSB.println(...)`を呼び出すと、USB経由でパソコンの仮想COMポートへ送信します。Arduino IDEにあるシリアルモニタで仮想COMポートを表示すると、Wio LTE Cat.1から送られたメッセージを知ることができます。

バイナリイメージ転送と仮想COMポートの両方とも、同じUSBポートを使用するので、パソコンとWio LTE Cat.1との接続はUSBケーブル1本だけでOKです。

# VSCodeでWio LTE Cat.1をデバッグ

「Wio LTE Cat.1はPRINTデバッグしかできないのか？」というと、そんなことはありません。
実は、Wio LTE Cat.1にはデバッグアダプタプローブを繋ぐパッドが用意されています。ここに適切な機器を繋ぎこむことで、良い感じにデバッグができるようになります。

<img width="400" alt="image.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/3e7c23b9-c1ca-6b02-90ca-049d40aebfb9.png">

わたしのデバッグ環境は以下の写真のとおりです。デバッグアダプタプローブはJ-Link PLUS Compactを使っています。Wio LTE Cat.1とデバッグアダプタプローブの接続に、中継コネクタや変換基板などを介していますが、結局のところ結線しているだけです。

<img width="600" alt="image.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/64d28db2-8121-9102-dd7a-03debf9e28e8.png">

Arduino IDEにはブレークポイントやウォッチといったデバッグ操作が無いので、デバッグ時は[Visual Studio Code](https://code.visualstudio.com/)（VSCode）を使っています。コンパイルや書き込みもVSCode+VSCode拡張で統一できなくもないですが、ちょっと不安だなと感じるところがあるので、Arduino IDEでコンパイルしてVSCodeでデバッグと併用しています。VSCode拡張は[Cortex-Debug](https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug)を使っています。いろいろ試した結果、これが一番安心感あるので。

先ず、コードを書いたらArduino IDEでコンパイルします。デバイスへの書き込みは不要です。このとき、`ツール > Debug > DebugON`を必ず選択しておきます。DebugONしておくと、生成される.elfファイルにデバッグ情報（ソースコードのフルパスなど）が書き込まれます。
次に、Cortex-Debugを加えたVSCodeを起動して、launch.jsonを適切に設定してからデバッグ実行します。すると、JLinkGDBServerCLが自動的に起動して、J-Link PLUS Compactと通信できるようになります。Cortex-Debugは、.elfファイルからバイナリイメージをWio LTE Cat.1のFlashに書き込んで、デバッグ環境下でWio LTE Cat.1を再起動します。

<img width="600" alt="image.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/12c8706e-1a34-2bd0-d0e0-21e7367593bb.png">

**launch.jsonの例:**

```
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cortex-debug",
            "request": "launch",
            "servertype": "jlink",
            "cwd": "${workspaceRoot}",
            "executable": "C:\\Users\\takashi\\AppData\\Local\\Temp\\arduino_build_922196\\LedSetRGB_JLink.ino.elf",
            "name": "LedSetRGB_JLink",
            "device": "STM32F405RG",
            "interface": "swd",
            "svdFile": "../STM32F405.svd"
        }
    ]
}
```

# 嗚呼、ややこしやデバッグアダプタプローブ

J-Link PLUS Compactはまぁまぁお高いです。他にどんな選択肢があるのか探してみると、いろいろありすぎて混乱してしまうでしょう。
Wio LTE Cat.1で使える組み合わせをいくつかピックアップしました。

<img width="600" alt="image.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/e98f8f73-2b5b-b30e-eda4-46a3dd28e984.png">

## 1. J-Link PLUS Compact

J-Link PLUS Compactに9ピン変換アダプタを付けた構成です。
わたしはこれを使っています。GDBServerとデバッグアダプタプローブがメーカー製なので、安心感があります。商用利用もOK。
J-Link PLUS Compactは、代わりにJ-Link BASE Compactを使ってもいいかもしれません。

* [J-Link Software and Documantation Pack](https://wiki.segger.com/UM08001_J-Link_/_J-Trace_User_Guide#J-Link_Software_and_Documentation_Pack)
* [J-Link・J-Traceモデルの種類](https://www.embitek.co.jp/product/jlink-compare.html)
* [J-Link PLUS Compact](https://www.embitek.co.jp/product/jlink-plus-c.html)
* [J-Link BASE Compact](https://www.embitek.co.jp/product/jlink-base-c.html)
* [J-Link 9-pin Cortex-M Adapter](https://www.embitek.co.jp/product/jlink-adapter.html#cm9p_adapter)
* [Wio LTE Cat.1用デバッグアダプタ接続基板](https://matsujirushi.booth.pm/items/2710691)

## 2. J-Link EDU Mini

J-Link EDU Miniの構成です。
価格が安いです。商用利用NG。

* [J-Link Software and Documantation Pack](https://wiki.segger.com/UM08001_J-Link_/_J-Trace_User_Guide#J-Link_Software_and_Documentation_Pack)
* [J-Link・J-Traceモデルの種類](https://www.embitek.co.jp/product/jlink-compare.html)
* [J-Link EDU Mini](https://www.embitek.co.jp/product/jlink-edu-mini.html)
* [Wio LTE Cat.1用デバッグアダプタ接続基板](https://matsujirushi.booth.pm/items/2710691)

## 3. XIAO-Link

XIAO-Linkの構成です。
GDBServerにOpenOCD、デバッグアダプタプローブのファームウェアにDAP-Link改を使用しています。
価格的にはJ-Link EDU Miniと同等ぐらい。J-Link関連を使わず、商用利用OKです。

* [OpenOCD](https://openocd.org/)
* [XIAO-Link](https://matsujirushi.booth.pm/items/3238149)
* [Wio LTE Cat.1用デバッグアダプタ接続基板](https://matsujirushi.booth.pm/items/2710691)

## 4. Seeeduino XIAO

Seeeduino XIAOを購入して、ファームウェアや配線を自力でセットアップする硬派構成です。
価格がもっとも安いです。そのかわり手間がかかります。

* [OpenOCD](https://openocd.org/)
* [Seeeduino XIAO](https://www.seeedstudio.com/Seeeduino-XIAO-Arduino-Microcontroller-SAMD21-Cortex-M0+-p-4426.html)
* [Seeed_Arduino_DAPLink](https://github.com/Seeed-Studio/Seeed_Arduino_DAPLink)

# ちなみに．．．

ソラコムが販売している、Wio 3G SORACOM EditionとWio LTE M1/NB1(BG96)には、デバッグアダプタプローブを内蔵しています。（つまり、デバッグ機能を使うのに追加部品不要なのだ。）

<img width="600" alt="image.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/1606717c-fa9c-1039-af87-893f6c9eed42.png">

# 最後に

J-Link ... プロ・セミプロ向け
XIAO-Link .... ハード苦手ホビー向け
Seeeduino XIAO ... ハード大好きホビー向け
PRINTデバッグ ... 苦行