【解决】J-LINK找不到芯片时的异常错误
前言
前几天做项目时在CSDN下了个F103的程序,烧到我的F103里面测试,又作死往我的另一块F411里面烧其它程序的时候,没有把
J-LINK从F103上拔下来。。。然后就没有然后了。。。
总之是一大堆报错。点完后程序当然烧不到F103里面的。因为F411内核是Cortex-M4,F103内核是Cortex-M3。
然后我又用这块F103烧程序的时候,出现:
然后在Debug里的Settings里看到神奇的一幕:
芯片无法识别了。网上给出的解释也是五花八门,最终认定这块F103是自锁了。
啥叫自锁?
STM32单片机一般的连接方式是主闪存存储器(flash)启动模式,即BOOT0为0,这样在用JTAG或SWD写进程序的时候,如果该程序工程中芯片选型不正确或着程序中复用了JTAG或SW复用引脚导致程序执行后出现启动配置错误或者调试引脚被占用而引起的芯片锁死或Jlnk连接不上的问题。
时钟问题:时钟频率设置太高,配置超出芯片主频工作范围,导致单片机自锁。
电源问题:供电电压不稳,STM32内部存在保护检测,同样会进行芯片的自锁。
用人话解释:
单片机正常情况,程序是从Flash区开始跑的,但是因为你写的软件代码有问题,下进去后,程序跑飞了,单片机卡死。按下复位(因为复位后程序也是从Flash区开始跑)也会卡死。所以芯片就禁掉SWD接口,自锁。
这里显然是芯片选型不正确导致的自锁。
解决
我尝试了一些方案,找到了一个最有效也是最快的办法。我们要先准备一个F103程序(随便什么程序,空程序也可)。
用人话解释:
正常的芯片自锁,就是将Flash存储进行读写保护,使得不能运行程序,而我们的做法就是将BOOT0置高,使程序从系统存储器(ROM区)启动,找到芯片之后,重新往Flash中下载一个正常的代码,之后再换回Flash启动,芯片即可完成解锁。
因为ROM区是存储存储固化程序的(存放指令代码和一些固定数值,程序运行后不可改动。例如c文件及h文件中所有代码、全局变量、局部变量、’const’限定符定义的常量数据、startup.asm文件中的代码),不会卡死,也就不影响单片机SWD口的下载。
先掉电,将BOOT0=1后,将代码下进去,然后再掉电,再把BOOT0=0,再上电,即可正常运行了。
如何改变BOOT0和BOOT1脚的电平?
如图红框处为STM32F103C8T6核心板的BOOT引脚:
图中黄色的是跳线帽,作用是将插入的两脚短接,从而实现BOOT引脚电平的选择
如图BOOT0=1,BOOT1=0