Pico PR

【解決策あり】RaspberryPi Pico2にDebugProbe・OpenOCD・WindowsでFlashする方法 【ドはまり】

記事内に商品プロモーションを含む場合があります

はじめに

RaspberryPi Pico2に「Pico DebugProbe」と「OpenOCD」を使って「Windows」でelfファイルを書き込む(Flash)方法について解説します。

最近、上記の環境で書き込みをしようとしてハマってしまったのですが、偶然にも、解決策を見つけることができました。

ネットや公式を見てもなかなか載っていない情報だったので、失敗時のエラーメッセージなど詳細も含めて記事にしたいと思います。

結論

OpenOCDでPico2(RP2350)をFlashする場合、通常使う「openocd.exe」ではなく「openocd-rp2350.exe」を使ってください。

RaspberryPi 公式のドキュメントなどを見ると「openocd.exe」を使うコマンドが記載されていますが、そのまま使うと、

「Error: Incorrect RP2040 BOOT ROM version」

と表示されて、Flashに失敗してしまいます。

代わりに「openocd-rp2350.exe」うと上記エラー発生しなくなるので、以下のopenocd-rp2350.exeを使うコマンドを実行してみてください。

openocd-RP2350 -f interface/cmsis-dap.cfg -f target/rp2350.cfg -c "adapter speed 5000" -c "program blink_simple.elf verify reset exit"

※ openOCDへのPATHの設定し、PowerShellで実行してください。

詳細環境や、エラーなどについては、後述する内容をご覧ください。

環境

この記事で使用する環境は以下の通りです。

環境 内容 バージョン
開発(書込)用PCのOS Windows11
言語  C++
ボード RaspberryPi Pico2
デバッガ RaspberryPi Debug Probe debugprobe.uf2 Ver.2.2.1
デバッガ OpenOCD Ver.0.12.0
(openocd-20240916.7z)

OpenOCD

OpenOCDはZephyr公式からリンクされている、sysprog社(デバッグツールの開発・販売などの会社)のサイトのビルド済のファイル(2024/09/16版)を使用しています。

sysprog社 配布先URL:https://gnutoolchains.com/arm-eabi/openocd

Pico2とDebug Probeの接続

PicoProbe同梱のケーブル(デュポンコネクタのもの)を使用し、Pico2とDebug Probeを以下のように接続します。

pico2とPicoProbeの接続方法を説明する画像
pico2とDebugProbeの接続
ピン番号 内容 接続先 備考
SWDIO DebugProbe(黄) ケーブルはDebugProbe同梱の物を使用しています。
GND DebugProbe(黒)
SWCLK DebugProbe(橙)

Picoピンアサイン(Pin-Out)

RaspberryPi Picoのピンアサイン(pinout)の画像

Pico公式サイトより引用

使用する部品

RaspberryPi Pico 2

今からPicoを揃えるなら、RaspberryPi Pico2がおすすめです。Picoに比べて1.5倍高速で、値段はほぼ一緒です。

ノーブランド品
¥1,475 (2024/11/27 21:32時点 | Amazon調べ)

すぐに使えるキットもあります

ピンヘッダが半田付けされて、USBケーブルやピンのレイアウト表までついた、すぐに使えるセットもあります。

RaspberryPi Debug Probe(デバッグプローブ)

RaspberryPi 公式の低価格で高機能なデバッグプローブです

SWD(Serial Wire Debug)ラインを使って、プログラムの状態を監視したり、BOOTSELボタンを押さずに書き込みを行うことができます。

RaspberryPiのマークがついたUSBケーブルが同梱されているのもうれしいポイントです。

ハマった経緯

WindowsPCとPicoProbeを使って、Pico2で使えるRTOS 「Zephyr」の環境を構築する際にこの問題にハマってしまいました。

Zephyrでは「west」というツールを使用して、ビルドや書き込みを行うのですが、書き込みコマンドである「west flash」際に、

Incorrect RP2040 BOOT ROM version(不正なブートROMのバージョン)」
とエラー表示されて書き込みに失敗。

書き込みの際に呼び出される「OpenOCD」がエラーを出している可能性が高そうなので、調査をはじめました。

問題の切り分け

OpenOCDは「west」からも呼び出されますが、単体で使うこともできます。

RaspberryPi Picoシリーズのチュートリアル(Getting Stated. Appendix A) に起動方法が載っていたので、単体で実行してみました。

openocd -f interface/cmsis-dap.cfg -f target/rp2350.cfg -c "adapter speed 5000" -c "program blink_simple.elf verify reset exit"

実行すると以下のようにwestと同じ「Incorrect RP2040 BOOT ROM version」でエラーになるので、OpenOCDの問題であることが確定です。

oepnocdでの失敗ログ

PS C:\tmp\blink_simple\build> openocd -f interface/cmsis-dap.cfg -f target/rp2350.cfg -c "adapter speed 5000" -c "program blink_simple.elf verify reset exit"
Open On-Chip Debugger 0.12.0 (2024-09-16) [https://github.com/sysprogs/openocd]
Licensed under GNU GPL v2
libusb1 d52e355daa09f17ce64819122cb067b8a2ee0d4b
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : Hardware thread awareness created
Info : Hardware thread awareness created
ocd_process_reset_inner
adapter speed: 5000 kHz
Info : Using CMSIS-DAPv2 interface with VID:PID=0x2e8a:0x000c, serial=E66258881785842B
Info : CMSIS-DAP: SWD supported
Info : CMSIS-DAP: Atomic commands supported
Info : CMSIS-DAP: Test domain timer supported
Info : CMSIS-DAP: FW Version = 2.0.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 0 SWDIO/TMS = 0 TDI = 0 TDO = 0 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 5000 kHz
Info : SWD DPIDR 0x4c013477
Info : [rp2350.cm0] Cortex-M33 r1p0 processor detected
Info : [rp2350.cm0] target has 8 breakpoints, 4 watchpoints
Info : [rp2350.cm0] Examination succeed
Info : [rp2350.cm1] Cortex-M33 r1p0 processor detected
Info : [rp2350.cm1] target has 8 breakpoints, 4 watchpoints
Info : [rp2350.cm1] Examination succeed
Info : [rp2350.cm0] starting gdb server on 3333
Info : Listening on port 3333 for gdb connections
[rp2350.cm0] halted due to breakpoint, current mode: Thread
xPSR: 0xf9000000 pc: 0x00000088 msp: 0xf0000000
[rp2350.cm1] halted due to breakpoint, current mode: Thread
xPSR: 0xf9000000 pc: 0x00000088 msp: 0xf0000000
Error: [rp2350.cm0] Execution of event reset-init failed:
C:/Program Files/OpenOCD/bin/../share/openocd/scripts/target/rp2350.cfg:78: Error: invalid command name "rp2xxx"
in procedure 'program'
in procedure 'ocd_process_reset'
in procedure 'ocd_process_reset_inner' called at file "embedded:startup.tcl", line 1383
at file "C:/Program Files/OpenOCD/bin/../share/openocd/scripts/target/rp2350.cfg", line 78
** Programming Started **
Error: Incorrect RP2040 BOOT ROM version
Error: Debug trampoline not found in RP2040 ROM.
Error: auto_probe failed
** Programming Failed **
shutdown command invoked

改良版っぽいソースを発見

エラー表示でググっていると、今回のBOOTROMのチェック部分が改良(RP2350に対応)された、mastarマージ前のファイル(コミット?)を見つけました。

https://review.openocd.org/c/openocd/+/8440

Masterと比較すると、BOOT ROMの部分が修正されていそうなので、上記の修正を自分でマージ・ビルドする準備していたところ、当初使っていたビルド済のフォルダの中に「openocd-RP2350.exe」を発見。

openocd-rp2350の実行ファイルが存在することを説明する画像

引数を変えずに実行したところ、何もなかったように書き込みが完了しました…。

openocd-RP2350 -f interface/cmsis-dap.cfg -f target/rp2350.cfg -c "adapter speed 5000" -c "program blink_simple.elf verify reset exit"

openocd-RP2350での成功ログ

PS C:\tmp\blink_simple\build> openocd-RP2350 -f interface/cmsis-dap.cfg -f target/rp2350.cfg -c "adapter speed 5000" -c "program blink_simple.elf verify reset exit"
Open On-Chip Debugger 0.10.0 (2024-09-16)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : Hardware thread awareness created
Info : Hardware thread awareness created
ocd_process_reset_inner
adapter speed: 5000 kHz
Info : Using CMSIS-DAPv2 interface with VID:PID=0x2e8a:0x000c, serial=E66258881785842B
Info : CMSIS-DAP: SWD supported
Info : CMSIS-DAP: Atomic commands supported
Info : CMSIS-DAP: Test domain timer supported
Info : CMSIS-DAP: FW Version = 2.0.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 0 SWDIO/TMS = 0 TDI = 0 TDO = 0 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 5000 kHz
Info : SWD DPIDR 0x4c013477
Info : [rp2350.cm0] Cortex-M33 r1p0 processor detected
Info : [rp2350.cm0] target has 8 breakpoints, 4 watchpoints
Info : [rp2350.cm0] Examination succeed
Info : [rp2350.cm1] Cortex-M33 r1p0 processor detected
Info : [rp2350.cm1] target has 8 breakpoints, 4 watchpoints
Info : [rp2350.cm1] Examination succeed
Info : starting gdb server for rp2350.cm0 on 3333
Info : Listening on port 3333 for gdb connections
[rp2350.cm0] halted due to breakpoint, current mode: Thread
xPSR: 0xf9000000 pc: 0x00000088 msp: 0xf0000000
[rp2350.cm1] halted due to debug-request, current mode: Thread
xPSR: 0xf9000000 pc: 0x00000088 msp: 0xf0000000
Error executing event reset-init on target rp2350.cm0:
C:/Program Files/OpenOCD/bin/../share/openocd/scripts/target/rp2350.cfg:78: Error: invalid command name "rp2xxx"
in procedure 'program'
in procedure 'ocd_process_reset'
in procedure 'ocd_process_reset_inner' called at file "embedded:startup.tcl", line 1225
at file "C:/Program Files/OpenOCD/bin/../share/openocd/scripts/target/rp2350.cfg", line 78
** Programming Started **
Info : RP2040 Flash Probe: 33554432 bytes @0x10000000, in 8192 sectors

Info : Padding image section 2 at 0x100016b0 with 80 bytes (bank write end alignment)
Warn : Adding extra erase range, 0x10001700 .. 0x10001fff
** Programming Finished **
** Verify Started **
** Verified OK **
** Resetting Target **
shutdown command invoked

openocd-RP2350ってナニモノ?

恐らくopenocd-RP2350は、masterにマージされていない前述の修正(改善?)を追加した、別バイナリだろうと推測しています。

本来であれば、masterにマージされて「openocd.exe」として、リリースされるものが、なんらかの事情で「openocd-RP2350」という別バイナリとしてリリースされ、あまり周知されていない。という状況なのかと思います。

なお、OpenOCD本家サイトのVer.0.12.0の「Flash」の項目にも
「RP2040に対応」としか書いていないので、RP2350には公式には未対応というところなのかもしれません。

RaspberryPi Pico SDK でも同じ問題がでる?

結論から言うと、問題はでません。前述とは別のOpenOCDが呼び出されて、問題なく書き込みができます。

2025年1月現在、PicoシリーズのSDK(C++でプログラムを作成する)を使う場合は、「VisualStudioCodeの拡張機能」を使う方法が推奨されており、PicoProbe+OpenOCDによるFlashもサポートされています。

(拡張機能をインストールすると、SDKを含む必要なツールが全て自動インストールされる)

上記拡張機能で書き込みを行うと、VSCodeに以下のように表示されて、無事書き込みが完了します。

恐らく、前述したopenocdとはまた別のバイナリ(ver.0.12.0+dev-gebec950-dirty(2024-09-27-16:29))により対策しているようです。

VSCodeから呼び出されるOpenOCDのバージョンを説明する画像
VSCodeから呼び出されるOpenOCDのバージョン

まとめ

RaspberryPi Pico2にPico DebugProbeとOpenOCDを使って、elfファイルをFlashする方法について解説しました。

簡単な方法で解決できますが、2025年1月時点で検索・生成AIともに情報がひっかからず、解決策の実行ファイルも見つかりずらかったので、公開してみました。

ちょっと玄人向けの難しい内容になってしまいましたが、同じ問題にハマっている方を、少しでも早く助けられればうれしいです。

質問等あれば、お助けできることもあると思うので、ぜひぜひコメント欄で教えてください。

参考になればうれしいです。

お知らせ

MicroPythonのプログラミングガイドブックが遂に発売!

「MicroPython」の本が遂にでました。

この一冊で、MicroPythonの言語仕様から、プログラミングの仕方まで”ガッツリ”学べます!

内容は、普段別言語で開発している人や、これからマイコンを始める(工学系の)学生を対象としているので「初心者向け」ではありません。しかし、「自前のライブラリの作成」が目標なので、これ一冊で「ガッツリ」とMicroPythonを学ぶことができます。

全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。目次だけでも”ガッツリ”なのが確認できると思います。

Pico/Pico W関連のおすすめ本

RaspberryPi Pico / Pico W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Index