3.1.8:调试器常见问题
1 MDK自动启动无效
程序下载之后发现没运行,需要注意以下几点:
- 检查Debugger设置中的复位模式是否正确。
- Reset and run 是否勾选。
- Flash Algorithm 设置是否正确。
2 断点不生效
请检查编译的设置。如优化级别、debugger 设置、以及本身的代码功能,如是否开启了看门狗等。
3 断点数量限制
硬件断点数量与芯片本身有关系,取决于 MCU 内核版本单元, 手册上会列出当前芯片支持的断点数量,请查看所使用的芯片手册关于调试章节内容。
4 下载时删掉了Bootloader
- IROM 的设置,首选要确保生成的 Image 地址是正确的
- 写入 Flash 的时候注意选择,页面擦除,在 Debugger 页面设置,这样就可以避免整片擦除,保留了芯片里面的其他数据。
5 提示设备不匹配
提示内容:Connection refused due to device mismatch!(Not a genuine ST Device! Abort connection)
可能购买的芯片不是原装芯片,比如打磨过丝印,或者商家虚假宣传,由于部分热门芯片很多厂家都有类似的芯片,甚至PIN TO PIN 兼容,因此存在这些问题,低版本的MDK 以及 芯片支持包不会检查芯片的IDCODE,所以可能不报错,更换成高版本的MDK和 支持包,则有可能报错,具体可以核对芯片手册的IDCODE,来确定真正的芯片型号。
如STM32F1 芯片的IDCODE 为:0x1B10417。
但是样片却为: 0x2BA01477,如下图所示:
经过查明,此芯片可能为:CS32F103C8T6(CKS32F103C8T6)。
5.1 解决方法1
根据 IDCODE 查找芯片真正的厂商型号,下载对应厂商芯片的 备包,安装之后,切换成实际芯片型号,再进行调试即可。
CKS32F103C8 资料下载 (需要安装Keil.CS32F1xx_DFP.pack、内有采用STM32F103 库、CKS32F103 库可正常运行Demo)
5.1 解决方法2
首先找到所选芯片的 pack 包,找到当前芯片的 pdsc 文件,如 C:\Keil_v5.25\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Keil.STM32F1xx_DFP.pdsc
<sequence name="CheckID">
<block>
__var pidr1 = 0;
__var pidr2 = 0;
__var jep106id = 0;
__var ROMTableBase = 0;
__ap = 0; // AHB-AP
ROMTableBase = ReadAP(0xF8) & ~0x3;
pidr1 = Read32(ROMTableBase + 0x0FE4);
pidr2 = Read32(ROMTableBase + 0x0FE8);
jep106id = ((pidr2 & 0x7) << 4 ) | ((pidr1 >> 4) & 0xF);
</block>
//注释掉芯片ID 检查配置
//<control if="jep106id != 0x20">
// <block>
// Query(0, "Not a genuine ST Device! Abort connection", 1);
// Message(2, "Not a genuine ST Device! Abort connection.");
// </block>
//</control>
</sequence>
- PowerWriter 团队不对真正的芯片型号进行溯源,以上的芯片IDCODE只是说明实际案例,特此说明。
- pdsc 文件只是一个示例,不同版本的pack 包路径,设置可能不一样,请根据实际情况进行调整。
6 无法识别调试器
错误代码:No Debug Unit Device found.
处理方法:重新连接烧录器,确保烧录器连接正常,驱动连接正常,参考 驱动安装与清理。
7 RDDI-DAP Error
错误信息:SWD/JTAG Communication Failure(RDDI-DAP Error)、RDDI-DAP Error。
解决方法:
确保烧录器和芯片烧录口连接正常,芯片没有开启高级保护或者烧录口被复用了,具体处理方法请查看:
8 编程失败
错误信息:Flash Timeout. Reset the Target and try it again.
解决方法:
确保芯片没有开启读保护和写保护,去除保护方法参考:解除读保护。
程序跑飞时或芯片复位不成功时会导致烧录不成功,请重新连接芯片并确保调试器设置选项如下图所示,并且可以尝试将boot0引脚拉高后再进行调试。
更改调试时钟大小。
使用PowerWriter客户端擦除目标芯片。
9 校验失败
错误信息:Contents mismatch
排除方法:确保flash算法参数正常,或者可以重新选择芯片型号进行更新flash算法设置。
10 无法加载flash 算法
错误码:Cannot Load Flash Programming Algorithm
重新选择Flash算法
11 重复添加flash算法
错误码:Overlapping of Algorithms at Address 08000000H
检查Flash算法设置
12 调试过程断线
如上图所示,MDK 擦除、写入、校验 都是通过的,但是在 Application running ... 之后,出现RDDI-DAP Error!
原因:程序中没有将IO 的调试功能打开,比如Cube MX 中默认调试功能是关闭的,如果直接生成代码去调试,就会出现此问题。
解决方法:在Cube MX 中,左侧,SYS->Debug 中打开 Serial Wire,如下图所示,然后更新代码。
如果直接在代码中,调整 调试模式。
其他的品牌和工具,也是类似处理,此类问题,都是因为 调试引脚没有配置为调试模式导致。
13 MDK无法识别芯片
此现象原因跟上一个现象一致,由于芯片中有代码运行,禁用了调试口,PowerWriter 响应的效率比调试器要快一些,存在PowerWriter 能识别,但是MDK 失败的情况。
处理方法:
使用PowerWriter 连接上目标芯片后,执行以下操作擦除所有数据:
- 选项字节,恢复默认,然后写入。
- 擦除Program Memory 程序空间数据。
执行以上操作后,再去MDK 中调试。
14 Watch变量不刷新(灰色)
数据没刷新的情况,是由于没有勾选 Periodic Window Update , 进入调试状态后,从菜单的 View -> Periodic Window Update 勾选此功能,调试器,Watch 窗口的数据将会实时刷新,如下图所示:
变灰色的原因,在于编译器优化级别过高,导致实际生成的调试信息和源码断点位置不完全一致而出现同步的问题,此时可以通过调整整个项目的优化级别,如改为0级无优化后,源码断点位置和实际变量的访问完全一致,如下图所示:
此外,可以单独调整部分源码的优化级别,在MDK 中通过源码文件(.c 、.cpp) 右键打开文件属性,单独设置文件的优化级别,如下图所示:
15 不识别WINUSB模式
一般情况下调试器选择界面下是可以看到双模的调试设备:
HID通道,标准模式
WINUSB 模式,高速模式
如下所示,推介高速模式:
如果调试器选择界面中,看不到WINUSB模式,可能有以下两种情况:
1.keil版本是在5.28或者更早之前的版本,keil本身不支持WINUSB;
2.keil版本是5.28往后的,但是仅PowerDebugger设备不显示WINUSB模式;
根据ARM官方解决方案,对于Keil V5,如果是早期版本,用ARM官网Documentation – Arm Developer提供的CMSIS_DA.dll文件,备份并替换keil安装目录Keil_v5\ARM\BIN下同名文件,即可识别WinUSB。
上述两种情况均可以通过替换CMSIS_DA.dll文件来解决此问题。
如无法识别到调试器设备,请尝试更新驱动程序,见驱动安装,如果能正常使用,则无需安装!