Seeeduino XIAO(SAMD21)がおかしくなったので修復してみた件(ブートローダー書き直し)
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のボードの認識のさせ方を忘れてたのでリンク残しときます。
ディスカッション
コメント一覧
SAMD21のBootloaderが壊れました。メールを拝見して持っていたSTLinkを
使って復旧を試みたのですが、Bootloaderが書き込めません。
Programming finishedは出るのですが、wrote bootloader ・・・はありません。Bootloaderの置き場所が悪いのかもしれませんが、flash.cfgにはprogram
bootloaderと記述されています。
コマンド命令は苦手としています、アドバイスを戴ければ幸いです。
こんにちわ。
生憎とST-Linkを所有していないので勝手が判らないのですけれど、、
コマンドの実行結果を全て見れれば何か判るかもしれませんが、ちょっと情報不足で状況が把握できません。
コメントの内容から、bootloaderが見つからないエラーの様な気がしますね。
この手のツールのコマンドインターフェースは、ディレクトリ名に2バイト文字が入る事を想定していないものが殆どです。
bootloaderを置く場所、ツールを実行する場所、すべてCドライブ直下に半角英数字だけのディレクトリを作ってやってみたらうまくいくやも?
例えば
■NGパターン
C:\XIAOブートローダー\[Bootloaderのバイナリファイルなど]
■OKパターン
C:\xiao_bootloader\[Bootloaderのバイナリファイルなど]
こういう感じで、フォルダ名が日本語だったり全角だったりするとダメな事が多いです。
また、ST-Linkをパソコンにつないで、Arduino IDEを立ち上げた時、「書き込み装置」にST-Linkが出て来る様なら、この方のブログ記事のAtmel-ICEの方法と同じ方法でブートローダーが書き込めるのではないかと。
■Seeeduino XIAOが1日で壊れた→ブートローダを書き込んだら直った話
https://blog.revetronique.com/seeduino-xiao2/
その他、このスレッドが参考になるかもしれません。
英語ですが、ブラウザの翻訳機能を使って英文と並べて読んでみるとヒントがあるやも
■How to unbrick a dead XIAO using ST-LINK and OpenOCD
https://forum.seeedstudio.com/t/how-to-unbrick-a-dead-xiao-using-st-link-and-openocd/255562
早速のアドバイス有難うございます。
OpenOCDを利用してBootloaderを復旧させようとしましたがST-Link
のcfgがエラーを起こしているようです。
参考に送って頂いたブログにあるArduino.IDEの書込装置には残念ながらJ-Link over OpenOCDとAtmel-ICEだけでST-LINKは無くて回復は出来ませんでした。(これは以前にもやっていてダメでしたが)
最後の手段はXIAOをDAPLink化してトライしてみようと考えています。
コメントをお送りしたばかりですが、書き忘れがありました。
STLinkでFlashした際のスクリーンショットは添付できませんが、
Arduino.IDEでブートローダーを書き込もうとした時のエラーは
Erorr:unable to find CMSIS-DAP device
でした。STーLinkでは駄目そうなのでXIAOのDAP-Link化に期待しています。
コメントありがとうございます。
なるほど、ST-LinkはArduinoIDEではOpenOCDデバイスとして自動認識しない感じなのですね。
少し見てみると、恐らくST-Linkの場合はSTMの書き込みツール(多分STM32 ST-LINK Utility)を使ってやる感じなのでしょう。
手元にST-Linkが無くてほんとすみません。
XIAOのDAP-Link化のバイナリが存在するので、もしかしたら記事のこの方法が一番簡単な方法かもしれません。
背面パッドへの結線も、平面なので邪魔になったら吸い取り線で綺麗に取り除けますので、あまり気にせずはんだ付けしちゃっていいと思います。
配線付けとけばGPIOとしても使えますし^^;
昨年からArduino Zero(SAMD21搭載)をXIAO化しようと頑張ってきましたが、やっとDAP-Linkを利用して実現することが出来ました。Arduinoは後からマイコンに何を書き込んだか判らななくなりますが、MicroPythonはファイルを読めるし複数のプログラムを書き込めるので便利にしています。
Arduino.IDEからDAP-LinkでBootloaderを書き込めたのですがレポートを見ると、C:¥User¥XXX\AppDataで良い所をわざわざopenocd.exeとcmsis-dap.cfgがあるディレクトリを探し出してflash.batを編集していたためSTLinkでBootloaderを書き込めなかったと思われます。(未確認)
たーじーは80歳超の爺さんです。何度かアドバイスを頂いたことに感謝いたします。有難うございました。
XIAO化成功おめでとうございます。
MicroPythonはまだ触った事が無いのですがどんな感じでしょう。
プログラムサイズとかはやっぱり少し大きくなりますか?
インタプリタはやはり便利ですよね。
ソースツリーがパソコン内で行方不明になっても後からどうにかできるというのも魅力ですね。
何れにしてもご高齢の方がマイコンをいじられているのはちょっと嬉しくなります。
先日叔父に薦めてみたので、「こんな人もいるよ!」って話のタネにさせていただきます^^
今月からArduinoを使い始めて電子工作の楽しさに目覚、先週XIAOを購入して来た当日に色々遊んでいたら起動不可に・・。
色々調べてこちらに辿り着き、DAPLink用のXIAOをもう1個購入して作業を行い無事に復旧しました。
いやー、ほんと助かりました。
ありがとうございました!
XIAOは結構安定している方だとは思いますが、やはりダブルリセット等が原因か判りませんがブートローダーが壊れてしまう事が度々ありますね。
小さくて使い易いだけに、猶更酷使してしまいますものね^^;