Seeeduino XIAO(SAMD21)がおかしくなったので修復してみた件(ブートローダー書き直し)

Arduino/SAMDDAPLink,SAMD21,Seeeduino,XIAO,ブートローダー

Seeeduino XIAOさんは小さくて大変使い勝手の良いマイコンです。

がっ

MIDIインターフェース関連のプログラムをガチャガチャやってる内に、ウンともスンとも言わなくなってしまい。

定番のダブルリセットでも全く反応しなくなりお手上げ状態。

スンって誰か言うのか

ググってみるとブートローダーが破損しやすいそうで。

再度書き込めば治る様なのですが、、、

OpenOCD?SWD?J-Link?

うんわかんない。

ST-Linkという大変安価なSTのUSBドングル型のツールが販売されている様ですが、持っている筈もなくニワカっぷりを自認。

しばらくお待ちください・・・

なんか正常に動くもう一台のXIAOを使ってブートローダーを書き込めるみたいな記事を発見。

How to unbrick a dead XIAO using a XIAO(DAPLink) and OpenOCD

正常なXIAOさんを簡易デバッガにしてブートローダーの壊れたXIAOさんに書き込むという感じらしい。

なんかプログラムを入れて?結線して?バッチファイルをポチってやるだけという簡単仕様。

大変簡潔。

中身とか理解しなくてもいい安定感。

というわけで記事のリンクにあるzipファイルをダウンロードしてきて展開します。

XIAO_BootloaderRescueTool_DAPLink.ZIP (49.2 KB)

バッチファイルを修正する

どうやらXIAOはブートローダー領域が書き込み保護されていない為に、度々この様なブートローダー領域の破損が起こるらしい。

書き込み保護も出来る様ですが、とりあえずこの方法で復旧できるならしなくてもいいや的な感じで書き込み保護は行わない事に。

書き込み保護を付加しない場合、「flash_unprotect.bat」を使えってある。

書き込み保護する場合には「flash.bat」を使用するみたい。

という訳で「flash_unprotect.bat」を編集。

C:\Users\XXXXXXXX\AppData\Local\Arduino15\packages\arduino\tools\openocd\0.10.0-arduino7\bin\openocd -f flash_unprotect.cfg -s C:\Users\XXXXXXXX\AppData\Local\Arduino15\packages\arduino\tools\openocd\0.10.0-arduino7\share\openocd\scripts
pause

たった1行のバッチファイルだと・・・?

「openocd.exe」と「cmsis-dap.cfg」があるディレクトリをご自身のPC環境にあわせて編集するだけとの事。

「XXXXXXXX」を自分のwindowsのユーザー名に変えればいいのね。

健康なXIAOをDAPLinkにする

で、XIAOをDAPLinkなるものにするにはどうするかってぇと

  • 健康なXIAOを用意します
  • ダブルリセットしてブートローダーモードにする
  • エクスプローラでDAPLinkのファイル(simple_daplink_xiao.uf2)をポン置きする

えっ

えっ

できたみたい。

DAPLinkデバイスになったXIAOと壊XIAOを接続

念のため、DAPLink化したXIAOをPCから取り外しておきます。

で、親MOSI(9番)と壊SWDIO(背面パッド)、親MISO(10番)と壊SWCLK(背面パッド)を接続

親5Vと壊5V、親GNDと壊GNDを接続

背面パッドは摘まむだけにしようかと思ったのですが、最近老眼でトホー

安全のためにはんだ付けしますた。

接続してみた。

バッチファイル実行・動作確認

接続したら親XIAOをPCに繋ぎ、先頃編集したバッチを実行するだけ。

一応この手のコンソール操作は日本語ディレクトリ名が混じってるとしぬしぬなので、半角英数字だけのディレクトリ階層で実行すべし。

Z:\XIAO_BootloaderRescueTool_DAPLink>flash_unprotect.bat

Z:\XIAO_BootloaderRescueTool_DAPLink>C:\Users\[ユーザー名]\AppData\Local\Arduino15\packages\arduino\tools\openocd\0.10.0-arduino7\bin\openocd -f flash_unprotect.cfg -s C:\Users\[ユーザー名]\AppData\Local\Arduino15\packages\arduino\tools\openocd\0.10.0-arduino7\share\openocd\scripts
Open On-Chip Debugger 0.10.0+dev-gf0767a31 (2018-06-11-13:36)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
none separate
adapter speed: 400 kHz
cortex_m reset_config sysresetreq
none separate
adapter_nsrst_delay: 100
adapter_nsrst_assert_width: 100
Info : CMSIS-DAP: SWD  Supported
Info : CMSIS-DAP: JTAG Supported
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : CMSIS-DAP: FW Version = 1.10
Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 400 kHz
Info : SWD DPIDR 0x0bc11477
Info : at91samd21g18.cpu: hardware has 4 breakpoints, 2 watchpoints
Error: at91samd21g18.cpu -- clearing lockup after double fault
Polling target at91samd21g18.cpu failed, trying to reexamine
Info : at91samd21g18.cpu: hardware has 4 breakpoints, 2 watchpoints
Info : Listening on port 3333 for gdb connections
    TargetName         Type       Endian TapName            State
--  ------------------ ---------- ------ ------------------ ------------
 0* at91samd21g18.cpu  cortex_m   little at91samd21g18.cpu  halted
target halted due to debug-request, current mode: Thread
xPSR: 0x71000000 pc: 0xfffffffe msp: 0xfffffffc
target halted due to debug-request, current mode: Thread
xPSR: 0x71000000 pc: 0xfffffffe msp: 0xfffffffc
** Programming Started **
auto erase enabled
Info : SAMD MCU: SAMD21G18A (256KB Flash, 32KB RAM)
wrote 8192 bytes from file bootloader-XIAO_m0-v3.7.0-33-g90ff611-dirty.bin in 2.200855s (3.635 KiB/s)
** Programming Finished **
** Verify Started **
verified 8192 bytes in 0.809837s (9.879 KiB/s)
** Verified OK **
shutdown command invoked

Z:\XIAO_BootloaderRescueTool_DAPLink>pause
続行するには何かキーを押してください . . .

さて、治ったのかどうなのか。

一応デバイスマネージャにはXIAOさんのポートが現れたので、適当なスケッチを流し込んでハロワ。

最大262144バイトのフラッシュメモリのうち、スケッチが34204バイト(13%)を使っています。
Atmel SMART device 0x10010005 found
Device       : ATSAMD21G18A
Chip ID      : 10010005
Version      : v1.1 [Arduino:XYZ] Nov 27 2019 16:35:59
Address      : 8192
Pages        : 3968
Page Size    : 64 bytes
Total Size   : 248KB
Planes       : 1
Lock Regions : 16
Locked       : none
Security     : false
Boot Flash   : true
BOD          : true
BOR          : true
Arduino      : FAST_CHIP_ERASE
Arduino      : FAST_MULTI_PAGE_WRITE
Arduino      : CAN_CHECKSUM_MEMORY_BUFFER
Erase flash
done in 0.862 seconds

Write 34820 bytes to flash (545 pages)

[===                           ] 11% (64/545 pages)
[=======                       ] 23% (128/545 pages)
[==========                    ] 35% (192/545 pages)
[==============                ] 46% (256/545 pages)
[=================             ] 58% (320/545 pages)
[=====================         ] 70% (384/545 pages)
[========================      ] 82% (448/545 pages)
[============================  ] 93% (512/545 pages)
[==============================] 100% (545/545 pages)
done in 0.272 seconds

Verify 34820 bytes of flash with checksum.
Verify successful
done in 0.044 seconds
CPU reset.

書き込めた。

なおた。

えっ

(´・ω・`)

いやぁ助かりますた。

XIAOさんはとても使い勝手の良いデバイスですから、大事に使いたいですね。

結局DAPLinkの事はなんにも調べないで終わりましたがっ。

そうそう、Arduino IDEを入れ直したついでにXIAOのボードの認識のさせ方を忘れてたのでリンク残しときます。

How to Add Seeed boards to Arduino IDE