はじめに
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で実行してください。
詳細環境や、エラーなどについては、後述する内容をご覧ください。
~ この記事の内容 / Contents ~
環境
この記事で使用する環境は以下の通りです。
環境 | 内容 | バージョン |
開発(書込)用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版)を使用しています。
Pico2とDebug Probeの接続
PicoProbe同梱のケーブル(デュポンコネクタのもの)を使用し、Pico2とDebug Probeを以下のように接続します。
ピン番号 | 内容 | 接続先 | 備考 |
– | SWDIO | DebugProbe(黄) | ケーブルはDebugProbe同梱の物を使用しています。 |
– | GND | DebugProbe(黒) | |
– | SWCLK | DebugProbe(橙) |
Picoピンアサイン(Pin-Out)
※ Pico公式サイトより引用
使用する部品
RaspberryPi Pico 2
今からPicoを揃えるなら、RaspberryPi Pico2がおすすめです。Picoに比べて1.5倍高速で、値段はほぼ一緒です。

すぐに使えるキットもあります
ピンヘッダが半田付けされて、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 -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))により対策しているようです。
まとめ
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です。