使用 Openocd 刷写 nrf52 芯片时出现问题

Problem Flashing nrf52 chip using Openocd

我在 pcb 上有一个自定义的 nrf52 芯片,带有外露的 swd 引脚。我已经从 https://github.com/ntfreak/openocd 克隆并安装了最新的 openocd。最新版本包括 nrf52 芯片的所有最新路径,因此无需像许多旧版在线指南中建议的那样进行任何其他更改。我可以使用 ST-LinkV2 连接到芯片。连接后,我可以使用 mdw 和 mdb 读取和写入内存位置。我还可以 运行 一些基本的 openocd 命令,例如 dump_image e.t.c,这证实了设置是好的。但是暂停和程序命令总是会导致错误,例如:

JTAG failure -4
JTAG failure -4
JTAG failure -4
JTAG failure -4
JTAG failure -4
JTAG failure -4
target halted due to debug-request, current mode: Thread 
xPSR: 00000000 pc: 00000000 msp: 00000000
jtag status contains invalid mode value - communication failure
Polling target nrf52.cpu failed, trying to reexamine
Examination failed, GDB will be halted. Polling again in 100ms
Previous state query failed, trying to reconnect
jtag status contains invalid mode value - communication failure
Polling target nrf52.cpu failed, trying to reexamine

如果我尝试使用 flash image_write 我收到错误,

JTAG failure
Error setting register
error starting target flash write algorithm
Failed to enable read-only operation
Failed to write to nrf52 flash
error writing to flash at address 0x00000000 at offset 0x00000000
in procedure 'dap'
jtag status contains invalid mode value - communication failure
Polling target nrf52.cpu failed, trying to reexamine

我已经在线阅读了不同的指南,其中一种可能的解决方案涉及必须禁用 APPPROTECT 寄存器才能启用对闪存的任何写入。 APP_PROTECT,但是应该帮助我们访问这个位的 dap 命令,

dap apreg 1 0x04 0x01

returns一个错误:

invalid subcommand apreg 1 0x04 0x01

拜托,我想知道是否有人成功地使用 stlink-v2 和必要的步骤对一个新的空 nrf52 芯片进行了编程,或者是否有人遇到过类似的问题。谢谢。

这是我的配置文件:

#nRF52832 Target
source [find interface/stlink.cfg]

transport select hla_swd

source [find target/nrf52.cfg]

#reset_config srst_nogate connect_assert_srst

有很多 JTAG 消息。

我想你可能错过了

transport select hla_swd

您的(电路板)cfg 文件中的行。 NRF5x 芯片只能与 SWD 一起正常工作,而 ST-Link 使用 hla_swd 变体。

即使 openOCD help 列出了 dap 命令,它也没有为您必须与 ST-Link 一起使用的传输 hla_swd 实现。

如果ST-Link是来自中国的泛型,可以是upgraded to CMSIS-DAP which uses the swd transport and supports the nrf52.dap apreg 1 0x04 0x01 command to disable the readback protection and erase the flash. You'll need another ST-Link to do that, or you can instead install CMSIS-DAP on a generic STM32F103C8T6 board

之后您可以使用ST-Link对nRF52进行编程,或者继续使用CMSIS-DAP,它也可以用于对STM32 MCU进行编程。

Nucleo board embedded ST-Links 也可以是upgraded to J-Link,它允许使用nRFgo Studio中的"recover"选项来擦除flash,它应该也可以使用"nrfjtool --recover" 或 OpenOCD。

如果有人遇到这个问题,我通过获取原始的 Jlink-Edu 解决了这个问题。我还必须将微控制器的复位引脚拉高才能使 jlink 正常工作。

我在 Windows 上使用 Particle.io 调试器 https://store.particle.io/products/particle-debugger setup to program nRF52 chips from Arduino as described in https://www.forward.com.au/pfod/BLE/LowPower/index.html

以这种方式解决了 "protected nRF52" 芯片问题

注意:这里描述的恢复过程不需要安装Arduino

从 windows 下载 OpenOCD-20181130.7z 预编译 openocd http://gnutoolchains.com/arm-eabi/openocd/

https://github.com/ntfreak/openocd 上的最新版本的 openocd src 也应该可以工作,因为它在 target\arm_adi_v5.c

中包含 apreg cmd

解压,打开cmd提示解压目录,输入cmd

bin\openocd.exe -d2 -f interface/cmsis-dap.cfg -f target/nrf52.cfg 

回应

Info : auto-selecting first available session transport "swd". To override use '
transport select <transport>'.
adapter speed: 1000 kHz
cortex_m reset_config sysresetreq
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : CMSIS-DAP: SWD  Supported
Info : CMSIS-DAP: FW Version = 1.10
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Info : SWD DPIDR 0x2ba01477
Error: Could not find MEM-AP to control the core
Info : Listening on port 3333 for gdb connections

打开 telnet 程序,例如 teraTerm 并连接到端口 4444 上的本地主机,即 127.0.0.1 telnet 端口 4444

cmd window 显示

Info : accepting 'telnet' connection on tcp/4444

在 telnet(即 teraTerm)中输入

nrf52.dap apreg 1 0x04

returns 0 <<< 芯片保护 然后

nrf52.dap apreg 1 0x04 0x01

然后

nrf52.dap apreg 1 0x04

returns 1 << 芯片未保护

然后电源循环板

现在可以使用 arduino ide 来刷写软设备和编码低功耗 BLE