跳到主要内容
版本:Next

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)

keil5 报错

image-20210127141709355

image-20210127141811249

可能购买的芯片不是原装芯片,比如打磨过丝印,或者商家虚假宣传,由于部分热门芯片很多厂家都有类似的芯片,甚至PIN TO PIN 兼容,因此存在这些问题,低版本的MDK 以及 芯片支持包不会检查芯片的IDCODE,所以可能不报错,更换成高版本的MDK和 支持包,则有可能报错,具体可以核对芯片手册的IDCODE,来确定真正的芯片型号。

如STM32F1 芯片的IDCODE 为:0x1B10417

image-20210127153256529

但是样片却为: 0x2BA01477,如下图所示:

image-20210127153657350

经过查明,此芯片可能为: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.

1660532432303

处理方法:重新连接烧录器,确保烧录器连接正常,驱动连接正常,参考 驱动安装与清理

7 RDDI-DAP Error

错误信息:SWD/JTAG Communication Failure(RDDI-DAP Error)RDDI-DAP Error

1660533563586

1660533962331

解决方法:

确保烧录器和芯片烧录口连接正常,芯片没有开启高级保护或者烧录口被复用了,具体处理方法请查看:

芯片连接不上如何处理

8 编程失败

错误信息:Flash Timeout. Reset the Target and try it again.

1660535442595

1660535456993

1660542935165

image-20210127141846905

解决方法:

  • 确保芯片没有开启读保护和写保护,去除保护方法参考:解除读保护

  • 程序跑飞时或芯片复位不成功时会导致烧录不成功,请重新连接芯片并确保调试器设置选项如下图所示,并且可以尝试将boot0引脚拉高后再进行调试。

  • 更改调试时钟大小。

  • 使用PowerWriter客户端擦除目标芯片。

    1660543307115

9 校验失败

错误信息:Contents mismatch

1660546297998

排除方法:确保flash算法参数正常,或者可以重新选择芯片型号进行更新flash算法设置。

1660546203391

1660546245934

10 无法加载flash 算法

错误码:Cannot Load Flash Programming Algorithm

image-38

重新选择Flash算法

11 重复添加flash算法

错误码:Overlapping of Algorithms at Address 08000000H

image-39

检查Flash算法设置

12 调试过程断线

image-20221017173123144

如上图所示,MDK 擦除、写入、校验 都是通过的,但是在 Application running ... 之后,出现RDDI-DAP Error!

原因:程序中没有将IO 的调试功能打开,比如Cube MX 中默认调试功能是关闭的,如果直接生成代码去调试,就会出现此问题。

解决方法:在Cube MX 中,左侧,SYS->Debug 中打开 Serial Wire,如下图所示,然后更新代码。

image-20221017173423996

​ 如果直接在代码中,调整 调试模式。

image-20221017173459438

提示

其他的品牌和工具,也是类似处理,此类问题,都是因为 调试引脚没有配置为调试模式导致。

13 MDK无法识别芯片

此现象原因跟上一个现象一致,由于芯片中有代码运行,禁用了调试口,PowerWriter 响应的效率比调试器要快一些,存在PowerWriter 能识别,但是MDK 失败的情况。

处理方法:

使用PowerWriter 连接上目标芯片后,执行以下操作擦除所有数据:

  • 选项字节,恢复默认,然后写入。
  • 擦除Program Memory 程序空间数据。

执行以上操作后,再去MDK 中调试。

14 Watch变量不刷新(灰色)

数据没刷新的情况,是由于没有勾选 Periodic Window Update , 进入调试状态后,从菜单的 View -> Periodic Window Update 勾选此功能,调试器,Watch 窗口的数据将会实时刷新,如下图所示:

image-20221022112642140

变灰色的原因,在于编译器优化级别过高,导致实际生成的调试信息和源码断点位置不完全一致而出现同步的问题,此时可以通过调整整个项目的优化级别,如改为0级无优化后,源码断点位置和实际变量的访问完全一致,如下图所示:

image-20221022113055050

此外,可以单独调整部分源码的优化级别,在MDK 中通过源码文件(.c 、.cpp) 右键打开文件属性,单独设置文件的优化级别,如下图所示:

image-20221022113232228