
在芯片锁住的时候,我们首先要查看是那种错误,% C7 F4 E, W. q9 ]# r 正常情况下,你在Keil下载时遇到错误应该是这样的6 }# j0 X- g% Q2 N" q ![]() 找不到Cortex™-M内核 Flash下载失败 / y$ Y. E3 L! j. `9 G; |/ o 打开J-Link-Commander' `/ Q: q, ], t# a) r# g ![]() }& ]& f- W x2 {5 j 如果是正常,则是可以找到Cortex-M3/M4内核, ) U+ g2 Z4 C" j' E: O% f ![]() 如果芯片自锁之后,会发现先是JTAG方式查找,之后SWD方式查找,最后找不到任何内核 7 D G5 I3 S J$ P! S& b3 q ![]() ' R% U8 ^9 w/ ? 以下问题为J-LINK能找到芯片时的异常错误:" q) R3 J; V% s$ C1 ? BOOT脚配置问题:对于STM32往往都有些BOOT配置脚。因为BOOT脚的焊接或接触不良或者BOOT引脚没有配置正确**,导致很多问题。这种情况多表现在芯片功能时好时坏,或者部分芯片正常,部分芯片异常。 3 @3 x# `: x3 A, T' `- D/ ^! y7 b9 m 启动文件问题:经常因为选错了启动文件,导致程序无法正常运行,或者说调试时好好的,脱机运行就出鬼。这点在做不同系列芯片间移植时最容易碰到。 * J. G- j2 c& k( o# G- q 堆或栈越界溢出:这个也会导致芯片无法正常工作,调试时往往可能会有硬错提示。+ ]1 n! J6 o/ p0 y6 N- p 芯片引脚短路:这是最典型的现象,也是最常见的原因,一般不工作的时候第一反应就是检查是否发生短路,短路引发芯片无法正常工作。 外部晶振异常:外部晶振无法正常工作也是导致芯片无法正常工作的原因,如果程序时钟配置中没有增加在外部晶振无法正常工作时切换到内部晶振的代码,将导致单片机无法正常启动,进行调试会发现代码卡在了RCC时钟的初始化中 数组越界操作: 数组发生越界时,便会进行错误,结果是程序直接卡死0 b& z$ g# C- H1 W+ C 中断处理错误: 同样会导致单片机卡死: H( |8 ^9 E( ~3 [( E: A+ m" Z: H 单片机发生程序异常时,会进入到HardFault_Handler中断; l; z% e) c3 ~& {( r 解决方法: % I/ v) \: h- W2 |8 Q& [! v8 `; k ![]() * ^: ?0 c6 a5 u0 s, W7 R 在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真" v* F2 @" H( A9 Y ![]() ) Y# e7 a5 [/ Z9 K+ }# q ![]() 在Keil菜单栏点击“View”——“Call Stack Window”. p* K& `# x- l% ?4 m7 c 弹出“Call Stack + Locals”对话框。然后在对话框中右键选择“Show Caller Code”,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况 / a: Q5 a2 D: y- I7 F: x7 e) @- W ![]() 以下问题为J-LINK找不到芯片时的异常错误: 自锁原因:* o! R S6 A) Y. ]$ P. A3 G. z9 ]; B STM32单片机一般的连接方式是**主闪存存储器(flash)**启动模式,即BOOT0为0,这样在用JTAG或SWD写进程序的时候,如果该程序工程中芯片选型不正确或着程序中复用了JTAG或SW复用引脚导致程序执行后出现启动配置错误或者调试引脚被占用而引起的芯片锁死或Jlnk连接不上的问题, 3 C( k5 Y- }% { c& }. B$ B 时钟问题:时钟频率设置太高,配置超出芯片主频工作范围,导致单片机自锁+ w1 Y1 K6 |. d: M8 e& [) Q , D" `' F6 L3 l& Q 电源问题:供电电压不稳,STM32内部存在保护检测,同样会进行芯片的自锁7 B" q# c) S* K: |3 N 解决方法:0 ^0 O3 |( h* ~5 Y- g! G 把BOOT0和BOOT1跳成1和0,(这时候就看下Jlink应该可以找到芯片),让内部程序不运行,然后再重新下载另外的程序,再改回BOOT设置,便可以恢复正常。如果板子上JTAG和SW调试电路都有的话,在其中一种方式导致锁死的情况下可以用另一种方式擦除恢复,而不必调整BOOT设置。: W8 L; d {0 v; m. |1 A6 }$ q % i7 B2 m0 F' d3 K( y) K9 L% J1 s ![]() ![]() 1 r! p: t5 a& }0 x2 ]1 w 简单的说 : 正常的芯片自锁,就是将Flash存储进行读写保护,使得不能运行程序,而我们的做法就是将BOOT0置高,使程序从系统存储器启动,找到芯片之后,重新往Flash中下载一个正常的代码,之后再换回Flash启动,芯片即可完成解锁 $ }2 a- f7 e/ T$ X8 t 如果即可以JTAG下载又可以SWD下载,假设SWD方式锁了,可以换成JTAG下载方式然后下载正常程序,同样可以解锁/ x+ T ? p: U. L / B* K7 W, }2 t |
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?
【经验分享】STM32 HAL库移植FreeModbus详细步骤