使用 Clion 开发STM32 解决 OpenOCD 0x2ba01477 问题
问题
Info : STLINK V2J33S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.354924
Warn : UNEXPECTED idcode: 0x2ba01477
Error: expected 1 of 1: 0x1ba01477
in procedure 'program'
OpenOCD init failed
shutdown command invoked
原因及解决方案
原因,使用的其实是一颗被打上了 STM32F103C8T6 丝印的国产 32 芯片,也就是山寨版芯片,需要在cfg里加入一句(加在source[findtarget/stm32f1x.cfg]前):
set CPUTAPID 0x2ba0147
自定义 TAPID,或者也可以将 TAPID 值设置为0以禁用检测
根本原因
为什么会有这种差异呢?
其根本原因是国产32位微控制器和STM32使用了不同版本的内核。
参考《STM32F10xxx参考手册》第29章,其中第6节《ID代码和锁定机制》提到,在STM32F10x微控制器内部有多个ID编码。而在29.6.3和29.8.3小节中表明,不同的调试接口都有各自的IDCODE。这些IDCODE是由ARM定义的,而ST采用了默认值。实际上,这些IDCODE按照JEDEC-106 ID标准进行编码,可以用来识别设备信息,如基地址 0xE0042000的DBGMCU_IDCODE就用于描述芯片的设计信息如容量,版本等。
针对内核版本为ARM Cortex-M3 r1p1的STM32F1xxx,JTAG调试接口的IDCODE为0x3BA00477,而SWD调试接口的IDCODE为0x1BA01477。
然而,国产的32位微控制器许多都采用了ARM Cortex-M3 r2p0版本的内核。相应地,JTAG调试接口的IDCODE为0x0BA00477,而SWD调试接口的IDCODE为0x2BA01477。
文章 https://developer.arm.com/documentation/ka001301/latest 解释了ARM如何根据JEDEC-106 ID标准定义IDCODE,其中特别提到
Arm CoreSight components use the JEP-106 code to indicate the chip designer (and not the manufacturer) of the CoreSight component. A debugger uses the chip designer number and the part number of the component to identify the properties of the component. As a result, the chip designer cannot modify the properties of most CoreSight components, including the IDCODE register of the Serial Wire or JTAG Debug Port (SWJ-DP). The Test Access Port (TAP) must identify itself as an Arm SWJ-DP before the debugger can interact with it.Arm CoreSight组件使用JEP-106代码来表示CoreSight组件的芯片设计者(而非制造商)。调试器使用芯片设计者编号和组件的部分号来识别组件的属性。因此,芯片设计者无法修改大多数CoreSight组件的属性,包括Serial Wire或JTAG调试端口(SWJ-DP)的IDCODE寄存器。在调试器与Test Access Port(TAP)交互之前,TAP必须先标识自身为Arm SWJ-DP。
这就解释了为什么市场上没有看到使用了r2p0版本内核,IDCODE却与r1p1相同的芯片。
值得一提的是,ST的STM32F2系列(高性能M3)正是采用了r2p0版本的M3内核,其IDCODE与使用了该版本内核的国产芯片是相同的。
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »