こんにちは。Seeed K.K.の中井です。
Grove ShieldやExpansion boardとアクリルケース、ピンヘッダがはんだ付けされた状態で購入できるPre-Solderedも追加され、はんだ付け不要で一層使いやすくなったSeeeduino XIAOですがお使いいただいているでしょうか? そんなXIAOですが、今回はExpansion boardを利用してデバッグが可能な開発環境を構築する方法についてご紹介したいと思います。
Seeeduino XIAO Expansion board
Raspberry Piの半分の大きさに、OLEDディスプレイやTFカードスロット、Groveコネクタなどが搭載したSeeduino XIAOの拡張ボードです。Groveコネクタにセンサーモジュールを接続すれば、PCなど他の表示端末を用意することなくステータスや測定データなどをOLEDに表示することができます。 また、Seeeduino XIAOのSWDパッドをピンヘッダからアクセスできるようになる機構も備えています。 これらの機能を使えば、簡単に素早くSeeeduino XIAOのパフォーマンスを引き出すことができます。
デバッグプローブを接続
Seeduino XIAO Expansion boardには、XIAO本体のSWDパッドに接続できるようにスプリングプローブ(下図緑枠)が実装されています。Seeeduino XIAOをExpansion boardに接続すればPADとプローブが接触し、ピンヘッダ(下図赤枠)からアクセスできるようになっています。
実際にデバッグプローブを接続して通信確認をしてみます。デバッグプローブには一例としてJ-Linkを用い、下図のように接続しています。
通信確認用のソフトウェアは、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>
もしうまくいかない場合はスプリングプローブがまともに接触しているか確認してみてください。 もしかするとパッドからずれてしまっているかもしれません。
Visual Studio Code + Arduino Extensionでデバッグ環境のセットアップ
Arduinoの開発環境としてもっとも普及しているのはArduino IDEです。最近ようやく2.0(のベータ版)がリリースされデバッグも実施できるようになりましたが、まだベータ版ということもあり未知な部分もあります。ちなみに2.0はArduino Pro IDEというコードネームで開発されていました。 ベータ版ということもあり今回はVisual Studio Code + Arduino Extensionでデバッグ環境をセットアップしてみます。この構成ではビルド時にArduino IDEと同じコンパイラやリンカが利用されるので安心感があります。 また、デバッグをサポートしてくれるExtensionとしてNative DebugやCortex-Debugなどがあり、インストールするとセットアップが簡単になるのでこちらも利用します。この記事ではCortex-Debugを利用します。
Visual Studio Codeに拡張機能をインストール
Visual Studio CodeとArduino Extensionを利用するためのArduino IDE自体のインストール方法については検索すれば色々とみつかるので割愛します。
Visual Studio Codeに拡張機能(Extensions)をインストールしていきます。 左側のメニューから拡張機能を選択し検索します。"Arduino"と入力すれば候補となるものが表示されるので、発行者が"Microsoft"のものをインストールします。
続いて "Cortex-Debug" 。
ボードパッケージのインストール
拡張機能のインストールが完了した後、対象となるSeeeduino XIAOのボードパッケージをインストールします。 コマンドパレットを開き、"Arduino: Board Manager"と入力し、表示されたタブ内で"Seeeduino XIAO"を検索し、"Seeed SAMD Boards"をインストールします。
コマンドパレット
Visual Studio Codeでは、拡張機能によって様々な機能を扱えるようになります。各機能はコマンドパレットからの実行、または、キーボードショートカットに割り当てることができます。
Arduino Extensionの各機能を利用する場合も同様に、コマンドパレットに入力して実行します。 コマンドパレットは、Ctrl + Shift + Pまたは、"表示 > コマンドパレット"で開くことができます。
内容 | コマンド | 設定 |
---|---|---|
ボードの選択 | 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を利用します。
"Arduino: Exampls"でBlinkを選択すると、対象のスケッチが自動的にコピーされファイルが作成されます。どこにファイルが作成されたかは、エクスプローラーで確認することができます。
ビルド時の出力ファイルの保存先を指定
デフォルトの状態では、ビルドされたファイルの保存先はテンポラリフォルダ(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を右クリックし"新しいファイル"で作成します。
下記をコピーし赤文字の部分を環境に合わせて変更します。このサンプルでは、デバッグプローブに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または実行ボタンをクリックするとデバッグを開始することができます。 下記は、loop()にブレークポイントを貼りデバッグ開始後にコンティニュー(F5)させた時の状態です。
他のIDEと同様にステップ実行や現在の変数の値、コールスタックなどの確認ができます。
まとめ
Seeeduino XIAO単体ではSWDの各信号がPADとなっていて、SWD経由でデバッグしようにも信号を引き出すためにははんだ付けが必要でした。 Expansion Boardを利用するとはんだ付け不要でデバッグプローブを接続することができるようになります。 複雑なプログラムの開発やポーティングなど、開発作業が捗ります。
おまけ. Bootloaderのリカバリ
なんらかの理由でBootloaderが壊れてしまったと稀に耳にするので、Bootloaderのリカバリ方法を記載しておきます。 上述のように、Expansion boardを使えば容易にデバッグプローブとつなげることができるのでROMを書き換えることが可能です。
出荷時に書き込まれているブートローダーは、Arduinoのボードパッケージに収録されています。 こちらのリンクからダウンロードすることができます。
J-Linkを使った一例となりますが、J-FlashやJ-Flash Liteを使い、ブートローダーファイルをオフセット0x0番地から書き込むことでリカバリすることができます。
Seeeduino XIAO関連製品
変更履歴
日付 | 変更者 | 変更内容 |
---|---|---|
2021/3/18 | mnakai | 作成 |