Seeeduino XIAO Expansion boardでデバッグ環境構築

こんにちは。Seeed K.K.の中井です。

Grove ShieldやExpansion boardとアクリルケース、ピンヘッダがはんだ付けされた状態で購入できるPre-Solderedも追加され、はんだ付け不要で一層使いやすくなったSeeeduino XIAOですがお使いいただいているでしょうか? そんなXIAOですが、今回はExpansion boardを利用してデバッグが可能な開発環境を構築する方法についてご紹介したいと思います。

f:id:mnakai:20210308101544p:plain

Seeeduino XIAO Expansion board

Raspberry Piの半分の大きさに、OLEDディスプレイやTFカードスロット、Groveコネクタなどが搭載したSeeduino XIAOの拡張ボードです。Groveコネクタにセンサーモジュールを接続すれば、PCなど他の表示端末を用意することなくステータスや測定データなどをOLEDに表示することができます。 また、Seeeduino XIAOのSWDパッドをピンヘッダからアクセスできるようになる機構も備えています。 これらの機能を使えば、簡単に素早くSeeeduino XIAOのパフォーマンスを引き出すことができます。

youtu.be

デバッグプローブを接続

Seeduino XIAO Expansion boardには、XIAO本体のSWDパッドに接続できるようにスプリングプローブ(下図緑枠)が実装されています。Seeeduino XIAOをExpansion boardに接続すればPADとプローブが接触し、ピンヘッダ(下図赤枠)からアクセスできるようになっています。

f:id:mnakai:20210308104311p:plain

実際にデバッグプローブを接続して通信確認をしてみます。デバッグプローブには一例としてJ-Linkを用い、下図のように接続しています。

f:id:mnakai:20210318142850p:plain

通信確認用のソフトウェアは、J-Linkのものを使いました。J-Link CommanderなどのソフトウェアはSEGGER社よりダウンロードすることができます。

J-Link Commanderを起動し、下記のように入力・表示されれば接続に問題はありません。

J-Link>connect
Please specify device / core. : ATSAMD21G18
Type '?' for selection dialog
Device>ATSAMD21G18
Please specify target interface:
  J) JTAG (Default)
  S) SWD
  T) cJTAG
TIF>S
Specify target interface speed [kHz]. : 4000 kHz
Speed>4000
Device "ATSAMD21G18" selected.


Connecting to target via SWD
InitTarget() start
InitTarget()
InitTarget() end
Found SW-DP with ID 0x0BC11477
DPIDR: 0x0BC11477
Scanning AP map to find all available APs
AP[1]: Stopped AP scan as end of AP map has been reached
AP[0]: AHB-AP (IDR: 0x04770031)
Iterating through AP map to find AHB-AP to use
AP[0]: Core found
AP[0]: AHB-AP ROM base: 0x41003000
CPUID register: 0x410CC601. Implementer code: 0x41 (ARM)
Found Cortex-M0 r0p1, Little endian.
FPUnit: 4 code (BP) slots and 0 literal slots
CoreSight components:
ROMTbl[0] @ 41003000
ROMTbl[0][0]: E00FF000, CID: B105100D, PID: 000BB4C0 ROM Table
ROMTbl[1] @ E00FF000
ROMTbl[1][0]: E000E000, CID: B105E00D, PID: 000BB008 SCS
ROMTbl[1][1]: E0001000, CID: B105E00D, PID: 000BB00A DWT
ROMTbl[1][2]: E0002000, CID: B105E00D, PID: 000BB00B FPB
ROMTbl[0][1]: 41006000, CID: B105900D, PID: 001BB932 MTB-M0+
Cortex-M0 identified.
J-Link>

もしうまくいかない場合はスプリングプローブがまともに接触しているか確認してみてください。 もしかするとパッドからずれてしまっているかもしれません。

f:id:mnakai:20210217164216j:plain

Visual Studio Code + Arduino Extensionでデバッグ環境のセットアップ

Arduinoの開発環境としてもっとも普及しているのはArduino IDEです。最近ようやく2.0(のベータ版)がリリースされデバッグも実施できるようになりましたが、まだベータ版ということもあり未知な部分もあります。ちなみに2.0はArduino Pro IDEというコードネームで開発されていました。 ベータ版ということもあり今回はVisual Studio Code + Arduino Extensionでデバッグ環境をセットアップしてみます。この構成ではビルド時にArduino IDEと同じコンパイラやリンカが利用されるので安心感があります。 また、デバッグをサポートしてくれるExtensionとしてNative DebugCortex-Debugなどがあり、インストールするとセットアップが簡単になるのでこちらも利用します。この記事ではCortex-Debugを利用します。

marketplace.visualstudio.com

marketplace.visualstudio.com

Visual Studio Codeに拡張機能をインストール

Visual Studio CodeとArduino Extensionを利用するためのArduino IDE自体のインストール方法については検索すれば色々とみつかるので割愛します。

Visual Studio Codeに拡張機能(Extensions)をインストールしていきます。 左側のメニューから拡張機能f:id:mnakai:20210315163347p:plainを選択し検索します。"Arduino"と入力すれば候補となるものが表示されるので、発行者が"Microsoft"のものをインストールします。

f:id:mnakai:20210315163559p:plain

続いて "Cortex-Debug" 。

f:id:mnakai:20210315164140p:plain

ボードパッケージのインストール

拡張機能のインストールが完了した後、対象となるSeeeduino XIAOのボードパッケージをインストールします。 コマンドパレットを開き、"Arduino: Board Manager"と入力し、表示されたタブ内で"Seeeduino XIAO"を検索し、"Seeed SAMD Boards"をインストールします。

f:id:mnakai:20210317135126p:plain

コマンドパレット

Visual Studio Codeでは、拡張機能によって様々な機能を扱えるようになります。各機能はコマンドパレットからの実行、または、キーボードショートカットに割り当てることができます。

Arduino Extensionの各機能を利用する場合も同様に、コマンドパレットに入力して実行します。 コマンドパレットは、Ctrl + Shift + Pまたは、"表示 > コマンドパレット"で開くことができます。

f:id:mnakai:20210318093924p:plain

内容 コマンド 設定
ボードの選択 Arduino: Board Config "Seeeduino XIAO (Seeed SAMD Boards)"を選択。"Debug"は"On"を選択
シリアルポートの選択 Arduino: Select Serial Port PCにSeeeduino XIAOを接続したときに認識したシリアルポートを選択
サンプルスケッチの選択 Arduino: Exampls 例としてBuilt-in Examples > 01.Basics > Blinkを選択
コンパイル Arduino: Verify スケッチを検証(ビルド)
アップロード Arduino: Upload ビルドされたバイナリを書き込む

スケッチ

テスト用のスケッチはいわゆるLチカのBlinkを利用します。

f:id:mnakai:20210317140922p:plain

"Arduino: Exampls"でBlinkを選択すると、対象のスケッチが自動的にコピーされファイルが作成されます。どこにファイルが作成されたかは、エクスプローラーで確認することができます。

f:id:mnakai:20210317140634p:plain

ビルド時の出力ファイルの保存先を指定

デフォルトの状態では、ビルドされたファイルの保存先はテンポラリフォルダ(Temp)以下となるため、以降の設定を簡単にするために出力先のフォルダを固定しておきます。出力先の指定は.vscode/arduino.jsonに下記のように"output"を追加します。

{
    "sketch": "Blink.ino",
    "port": "COM13",
    "board": "Seeeduino:samd:seeed_XIAO_m0",
    "configuration": "usbstack=arduino,debug=on",
    "output": "./build.vscode"
}

デバッグ設定

デバッグ設定は、.vscode/launch.jsonに記述します。Exampleをコピーした状態では対象のファイルが存在しない状態のため、エクスプローラーの.vscodeを右クリックし"新しいファイル"で作成します。

f:id:mnakai:20210317154500p:plain

下記をコピーし赤文字の部分を環境に合わせて変更します。このサンプルでは、デバッグプローブにJ-Link、GDBサーバーはJ-Link GDB Serverを用いる例となります。

{
    "version": "0.2.0",
    "configurations": [
        {
            "cwd": "${workspaceRoot}",
            "name": "Cortex-Debug_J-Link",
            "type": "cortex-debug",
            "request": "launch",
            "executable": "${workspaceRoot}\\build.vscode\\Blink.ino.elf",
            "servertype": "jlink",
            "device": "ATSAMD21G18",
            "interface": "swd",
            "serverpath": "C:\\Program Files (x86)\\SEGGER\\JLink\\JLinkGDBServer.exe",
            "armToolchainPath": "C:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\tools\\arm-none-eabi-gcc\\7-2017q4\\bin"
        }
    ]
}

いざ、デバッグ!

ここまで色々と設定し、デバッグ環境が整いました。

"Arduino: Upload"でSeeeduino XIAOにビルド済みのバイナリを書き込み、F5または実行ボタンf:id:mnakai:20210317165542p:plainをクリックするとデバッグを開始することができます。 下記は、loop()にブレークポイントを貼りデバッグ開始後にコンティニュー(F5)させた時の状態です。

f:id:mnakai:20210317165337p:plain

他のIDEと同様にステップ実行や現在の変数の値、コールスタックなどの確認ができます。

まとめ

Seeeduino XIAO単体ではSWDの各信号がPADとなっていて、SWD経由でデバッグしようにも信号を引き出すためにははんだ付けが必要でした。 Expansion Boardを利用するとはんだ付け不要でデバッグプローブを接続することができるようになります。 複雑なプログラムの開発やポーティングなど、開発作業が捗ります。

おまけ. Bootloaderのリカバリ

なんらかの理由でBootloaderが壊れてしまったと稀に耳にするので、Bootloaderのリカバリ方法を記載しておきます。 上述のように、Expansion boardを使えば容易にデバッグプローブとつなげることができるのでROMを書き換えることが可能です。

出荷時に書き込まれているブートローダーは、Arduinoのボードパッケージに収録されています。 こちらのリンクからダウンロードすることができます。

https://github.com/Seeed-Studio/ArduinoCore-samd/raw/master/bootloaders/XIAOM0/bootloader-XIAO_m0-v3.7.0-33-g90ff611-dirty.bin

J-Linkを使った一例となりますが、J-FlashやJ-Flash Liteを使い、ブートローダーファイルをオフセット0x0番地から書き込むことでリカバリすることができます。

f:id:mnakai:20210317171128p:plain

Seeeduino XIAO関連製品

www.seeedstudio.com

www.seeedstudio.com

www.seeedstudio.com

www.seeedstudio.com

変更履歴

日付 変更者 変更内容
2021/3/18 mnakai 作成