解决keil出现cpu is not halted && cannot read register XX while cpu is running的另类方法

在使用Keil进行ARM Cortex-M0内核MCU的硬件仿真时,遇到JLink读取寄存器失败及CPU未停止等错误。通过关闭System Viewer窗口解决了问题,可能与芯片总线访问时序有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做keil硬件仿真的时候发现了很奇怪的问题,程序应该没有问题,可以下载到板子上,但是仿真就不行,点击仿真按钮的同时可以看到jlink的灯熄灭了好一阵才亮起来,然后debug页面如图1所示,我使用的是arm cortex m0内核的某国产mcu芯片,有自己的库,但不是stm系列。出现的问题如下:

图1在这里插入图片描述图1

***JLink Error: CPU is not halted
**JLink Warning: CPU could not be halted
***JLink Error: Can not read register 15 (R15) while CPU is running
***JLink Error: Can not read register 16 (XPSR) while CPU is running
***JLink Error: Can not read register 0 (R0) while CPU is running
***JLink Error: Can not read register 1 (R1) while CPU is running
***JLink Error: Can not read register 2 (R2) while CPU is running
***JLink Error: Can not read register 3 (R3) while CPU is running
***JLink Error: Can not read register 4 (R4) while CPU is running
***JLink Error: Can not read register 5 (R5) while CPU is running
***JLink Error: Can not read register 6 (R6) while CPU is running
***JLink Error: Can not read register 7 (R7) while CPU is running
***JLink Error: Can not read register 8 (R8) while CPU is running
***JLink Error: Can not read register 9 (R9) while CPU is running
***JLink Error: Can not read register 10 (R10) while CPU is running
***JLink Error: Can not read register 11 (R11) while CPU is running
***JLink Error: Can not read register 12 (R12) while CPU is running
***JLink Error: Can not read register 13 (R13) while CPU is running
***JLink Error: Can not read register 14 (R14) while CPU is running
***JLink Error: Can not read register 15 (R15) while CPU is running
***JLink Error: Can not read register 16 (XPSR) while CPU is running
***JLink Error: Can not read register 17 (MSP) while CPU is running
***JLink Error: Can not read register 18 (PSP) while CPU is running
***JLink Error: Can not read register 20 (CFBP) while CPU is running

出现问题后只能将debug关掉,这时候的jlink相当于断开了,再就无法烧写到芯片中了,必须要重启电源,重新使用以前的代码版本,没错一开始我的确以为是代码的问题,更换了很多代码版本,因此在更换代码后好像的确可以烧写进去了,但是后来发现好像不是代码的问题,因为最后几乎不改代码但还是会出现问题。
在网上找了很多资料解决这个问题,试过了网上说的所有的办法,但是始终没能得到解决,足足憋了1天半,最后发现一件很搞笑的事。在这里插入图片描述
图2
原来每次进入debug模式后,我为了方便看寄存器的状态,总是会点击图2中1处的按钮system viewer windows,此时会在debug窗口右侧显示寄存器的状态窗口,如果此时关掉debug,那么再重新启用debug的话就会出现上面所说的问题,具体的原因我也搞不明白,可能是因为jlink盗版?还是keil的问题,亦或是电脑太卡了??给我的感觉就是在启动debug 的窗口时,jlink强行被卡住了一样,相当于jlink断开,自然无法正常的debug,关掉后也无法正常的烧写代码。

解决的办法也很简单,关掉图2中2处的窗口,这时再启动debug时候就不会出现这样的问题了。

超级可笑的一个问题。
更新:问过该芯片公司相关工程师,可能是因为当时芯片总线的访问时序并没有做好,还需要改进。
在这里插入图片描述

### KEIL 中 JLink 报错 CPU is not halted解决方案 当遇到 Keil 调试过程中提示 `CPU is not halted` 或者 `cannot read register XX while cpu is running` 时,通常表明调试工具(如 J-Link)未能成功暂停目标设备的 CPU 运行状态。以下是针对该问题的具体分析与解决措施: #### 1. **检查硬件连接** 确保开发板上的 JTAG/SWD 接口与 J-Link 调试器之间的物理连接正常。任何松动或接触不良都可能导致通信失败[^2]。 #### 2. **禁用看门狗定时器** 某些情况下,程序中的看门狗定时器可能会干扰调试过程。如果看门狗未被适当初始化或喂狗操作缺失,则可能导致 CPU 在调试期间意外复位。尝试在代码中临时禁用看门狗功能以验证其影响: ```c // 示例:STM32 平台下禁用看门狗 void Disable_Watchdog(void) { IWDG->KR = 0x5555; // 密钥写入解锁寄存器 IWDG->KR = 0xAAAA; // 关闭独立看门狗 } ``` #### 3. **避免 System Viewer Windows 的不当使用** 根据实际经验,在 Debug 模式下频繁打开或关闭特定窗口(例如 System Viewer Windows),可能引发不稳定行为并最终导致调试异常中断[^1]。建议仅在必要时访问这些高级特性,并尽量减少切换频率。 #### 4. **更新驱动程序和固件** 过时的 J-Link 驱动或者不匹配的目标器件支持库也可能引起兼容性问题。前往 Segger 官方网站下载最新版本软件包并完成安装升级[^3]。 #### 5. **调整 Keil 设置参数** 确认项目配置文件内的选项是否合理: - 在 Project -> Options for Target -> Debug 页面里指定正确的接口类型 (SWD/JTAG),以及适配的速度等级; - 如果存在多个核芯架构,请仔细甄选对应的 Core Variant。 #### 6. **重置调试环境** 对于顽固性的故障现象,可考虑执行如下清理动作后再重新加载工程: - 断电重启目标单片机; - 删除 .uvopt(x)/.settings 文件夹下的缓存数据; - 卸载/重装 J-Link Drivers 和 Runtime Components。 通过上述手段逐一排查潜在诱因后,绝大多数此类难题均能得到有效缓解甚至彻底根除。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

INFiniteCoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值