文章目录
-
- JLink突然连接不上MCU的处理方法
- 概述
- 备注
- [备注 - 确实是设置了PC值引起的问题](#备注 - 确实是设置了PC值引起的问题)
- [备注 - 可能是调试配置被自己改乱了](#备注 - 可能是调试配置被自己改乱了)
- 备注
- END
JLink突然连接不上MCU的处理方法
概述
用eclipse-embedcpp + JLink-edu-mini单步调试LPC1768的固件工程。
开始是能正常用的,后来修改了编译选项,尝试将PC设置到0xCC, 准备看看reset入口的汇编实现.

突然就报错,连接不上板子了。
因为0xcc是reset入口,不知道在那里设置断点,会不会影响汇编代码和JLink.
可以尝试用进入ISP模式(openpnp - MKS SGEN_L V2.0-002 烧录bootloader),用Flash Magic清除有代码的扇区,等扇区空检查都为空时,再离开ISP模式,用JLink再连接板子试试。
进入ISP模式,用Flash Magic读取签名,读取扇区,都是正常的。说明MCU还是好的。
看JLink的官方说明,如果代码不合适,导致JTAG被禁止,也可能无法用JLink连接MCU.
https://kb.segger.com/J-Link_cannot_connect_to_the_CPU#Target_connection

可能将PC指向0xcc, 也会导致JLink通讯异常。已经将eclipse-embedcpp的调试配置改了,去掉了设置PC的值为0xcc.
用J-Link Commander V8.94再去连接MCU, 已经正常了。可能就是将PC值改到0xcc引起的问题。

连接时,看到JLink-edu-mini全速是12MHZ, 将速度设置为12000kHz, 果真可以正常通讯。
可以再拿J-Flash V8.94去试试,将速度设置为12MHZ, 读取全片只要0.1S. 只有test是不行的,会闪退,应该是JFlash有bug.
用JLinkGDBServer.exe试试,也是正常的。
备注
那以后就不能做将PC设置为0xcc这种操作了。
那如何实际单步reset入口的汇编代码呢?
备注 - 确实是设置了PC值引起的问题
尝试将PC值改为0,再调试,又连不上MCU了。问题重现了。

按下reset键也不好使。
看来PC值不能改。
还是要用Flash Magic来救场,试了,不需要将有代码的页都清空,只需要将第1个页(前4KB, 0x1000)清空就正常了。
备注 - 可能是调试配置被自己改乱了
不确定调试配置改啥了,即使是不设置PC值,只要一调试,就会让JLink无效,但是可以用Flash Magic来救场.
那将现在的调试配置删了吧,重新建立一个JLink的调试配置,只改必须的设置,其他用eclipse-embedcpp默认的。
不行,删除后新建的配置,大部分选项都是和旧配置一样的。
那我将工程重新导入一次,然后再新建调试配置试试。
退出eclipse-embedcpp,清空工作区。
在工程目录中,删掉eclipse-embedcpp的4个配置文件。
这就干净了。
然后打开脚本start_only_embedcpp.bat,自动启动eclipse-embedcpp,重新引入makefile工程。
设置了工具链,工程编译过了。
设置了MCU的CMSIS包
建立调试配置,选择了elf, 设置了C:\Program Files\SEGGER\JLink\JLinkGDBServerCL.exe, 其他啥也没敢改。
查看Startup页的配置值,已经恢复成eclipse-embedcpp给的默认值了。
看来调试选项的默认值,是跟着工作区走的。
现在调试正常了。

备注
当硬件调试器不能用时,先别怀疑硬件(JLink, MCU)坏了.
可以先找调试器相关的工具(J-Link Commander V8.94, J-Flash V8.94), 看看能不能通过调试器连接MCU?
再用MCU相关的工具(Flash Magic), 看看MCU的签名是否能读到?FLASH是否能读写?
如果上述2项测试可以,那么说明可能是写固件代码软件(IDE)的调试配置可能有问题,或者代码本身有问题(是否禁止了JTAG接口?)
总之,自己在安静的调试,硬件都没动,硬件没有那么容易坏的,也不应该是硬件的问题。