如何使用 OpenOCD 通过 JTAG 链批量刷写 STM32 微控制器?

Posted

技术标签:

【中文标题】如何使用 OpenOCD 通过 JTAG 链批量刷写 STM32 微控制器?【英文标题】:How to mass flash STM32 Microcontrollers through JTAG Chain with OpenOCD? 【发布时间】:2022-01-13 04:23:08 【问题描述】:

我是 OpenOCD 的初学者,我正在尝试使用 ST-Link v2 调试器或 OLIMEX 以菊花链形式闪存 3 个 STM32 目标,如下所示,使用 OpenOCD。

我使用的代码仅在连接一个目标时有效。但是如果我将它连接到多个 Target,OpenOCD 会抛出一个错误,指出 init 失败。

"C:\Program Files\GNU ARM Eclipse\OpenOCD\0.10.0-201601101000-dev\bin\openocd" -f "C:\Program Files\GNU ARM Eclipse\OpenOCD\0.10.0-201601101000-dev\scripts\interface\stlink-v2.cfg" -f "C:\Program Files\GNU ARM Eclipse\OpenOCD\0.10.0-201601101000-dev\scripts\target\stm32f3x.cfg" -c init -c targets -c "halt" -c "flash erase_sector 0 0 127" -c "reset halt" -c "flash write_image C:/Users/Buero-1/Desktop/openOCD/init.hex" -c "verify_image C:/Users/Buero-1/Desktop/openOCD/init.hex" -c "reset run" -c shutdown

执行此代码时我得到的成功结果如下所示。

GNU ARM Eclipse 64-bits Open On-Chip Debugger 0.10.0-dev-00287-g85cec24-dirty (2016-01-10-10:13)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
none separate
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz

Info : clock speed 950 kHz
Info : STLINK v2 JTAG v29 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.223311
Info : stm32f3x.cpu: hardware has 6 breakpoints, 4 watchpoints
    TargetName         Type       Endian TapName            State
--  ------------------ ---------- ------ ------------------ ------------
 0* stm32f3x.cpu       hla_target little stm32f3x.cpu       halted
Info : device id = 0x20006432
Info : flash size = 256kbytes
erased sectors 0 through 127 on flash bank 0 in 0.025984s
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
adapter speed: 950 kHz
stm32f3x.cpu: target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
Info : Padding image section 0 with 31880 bytes
Info : Padding image section 1 with 1 bytes
stm32f3x.cpu: target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000003a msp: 0xfffffffc
wrote 47676 bytes from file Z:/Elektronik/GSV13/Fertigung_GSV-13iu/Init/GSV13init_Ver1_6.hex in 1.635796s (28.462 KiB/s)
stm32f3x.cpu: target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0xfffffffc
stm32f3x.cpu: target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0xfffffffc
verified 15795 bytes in 0.483325s (31.914 KiB/s)
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
adapter speed: 950 kHz
shutdown command invoked

但如前所述,如果我在一个 JTAG 链中连接多个目标,则该过程会在 init 处停止并且程序结束。

配置文件为 target/stm32f3x.cfg、interface/ftdi/olimex-arm-usb-ocd-h.cfg 和 interface/stlink-v2.cfg。

如果我的问题非常基本,请原谅。如果向我提供有关如何处理我的问题的最新信息,那将非常有帮助。

谢谢。

【问题讨论】:

失败时的完整错误信息是什么? 您好 Donal,我发现了如何使用 OLIMEX 闪存菊花链,因为 ST Link 不支持 JTAG 链。但是我有一个问题,一旦闪烁(并且正确闪烁),连接失败,我无法再次刷新 CPU。它说“目标中止了闪存写入算法”。我正在尝试找出问题所在。 【参考方案1】:

据我所知 STLink v2 不支持菊花链。

https://community.st.com/s/question/0D50X00009XkZTdSAN/does-stlink-utility-support-multiple-devices-on-jtag-chain

【讨论】:

以上是关于如何使用 OpenOCD 通过 JTAG 链批量刷写 STM32 微控制器?的主要内容,如果未能解决你的问题,请参考以下文章

OpenOCD 通过 JTAG 调试树莓派

通过 OpenOCD 的 STM32 读出保护

OpenOCD-JTAG调试

OpenOCD-JTAG调试

如何使用 JTAG 链接调试两个或多个微控制器?

OpenOCD的概念,安装和使用