记录一个问题
自己画了一块电路板,上面用到STM32F103C8T6芯片。从某宝的一家正规的店里买了一片芯片,价格6元。想多买几片,于是又搜STM32F103C8T6芯片,搜到一个店(感觉不正规,店名是大公司的谐音),该芯片只要3.68元,感觉价格低,于是买了2片。
果然,焊接好电路后,使用VsCode不能下载程序。感觉芯片应该是GD32或者其他盗版的芯片。下载后,出现的报错信息为
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>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : clock speed 1000 kHz
Info : STLINK V2J29S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.116303
Warn : UNEXPECTED idcode: 0x2ba01477
Error: expected 1 of 1: 0x1ba01477
in procedure 'program'
** OpenOCD init failed **
看下报错信息,重点在
Warn : UNEXPECTED idcode: 0x2ba01477
Error: expected 1 of 1: 0x1ba01477
是设备ID的问题,于是在网上找答案
yann_qu在这篇文章提到了,原因是“开发板用的芯片不是stm32f103c8,而是一个中国国产仿制版本 CS32F103C8T6”。并给出了解决方法,对于自己的问题,可行的方法为
方案1:修改cfg文件(修改cfg中的默认id)
编辑~/.platformio/packages/tool-openocd/scripts/target/stm32f1x.cfg
把set _CPUTAPID 0x1ba01477
改为_CPUTAPID 0x2ba01477
。
方案2:增添一个id
stm32f1x.cfg在swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
后添加-expected-id 0x2ba01477
测试方案2。
下载后的信息为
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : clock speed 1000 kHz
Info : STLINK V2J29S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.123393
Info : [stm32f1x.cpu] Cortex-M3 r2p1 processor detected
Info : [stm32f1x.cpu] target has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32f1x.cpu on 3333
Info : Listening on port 3333 for gdb connections
[stm32f1x.cpu] halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08001938 msp: 0x20005000
** Programming Started **
Info : device id = 0x20036410
Info : flash size = 128 KiB
Warn : Adding extra erase range, 0x08004ad0 .. 0x08004bff
** Programming Finished **
** Verify Started **
** Verified OK **
** Resetting Target **
查看信息,发现前面几行信息与之前的报错信息很像,估计是因为方案二是在后面增加一个ID,如果用方案一直接修改ID,应该就会正常。
下载完成后,有一个Warn,但是程序有效,问题基本解决。
暂时没有发现新的问题,没有验证修改后的CFG文件,是否对原来的STM32F103C8T6芯片有效。
这篇文章也提到了该问题。
原因:使用的其实是一颗被打上了 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。
值得一提的是,ST的STM32F2系列(高性能M3)正是采用了r2p0版本的M3内核,其IDCODE与使用了该版本内核的国产芯片是相同的。
验证,修改后的CFG文件对原来的STM32F103C8T6芯片有效。但是下载程序后显示的信息和上面的类似,不知道是不是修改CFG文件后,显示信息发生了改变。之前都是下载程序成功后就结束了,都怪没有好好看信息。