STMCU小助手
发布时间:2022-3-24 21:53
|
在芯片锁住的时候,我们首先要查看是那种错误,/ E+ F( i4 p9 O( T( R4 y& ] 正常情况下,你在Keil下载时遇到错误应该是这样的3 {2 P5 O5 G- e) N7 ^& p2 z
找不到Cortex™-M内核 Flash下载失败, C+ v* f1 d. Q7 U) B 打开J-Link-Commander# o+ Y; \8 p8 [! l7 G' L
! U4 X/ f1 M4 x+ A3 x4 P( J 如果是正常,则是可以找到Cortex-M3/M4内核,
如果芯片自锁之后,会发现先是JTAG方式查找,之后SWD方式查找,最后找不到任何内核 E' e! ]* B, W" h+ E" w& V* a
; p7 P# e7 x$ M, c- q: u 以下问题为J-LINK能找到芯片时的异常错误: ?& o+ c, L: a# @+ g BOOT脚配置问题:对于STM32往往都有些BOOT配置脚。因为BOOT脚的焊接或接触不良或者BOOT引脚没有配置正确**,导致很多问题。这种情况多表现在芯片功能时好时坏,或者部分芯片正常,部分芯片异常。, T# n9 e( g# W" p; M 9 q( f9 c G( M _3 a% J" } 启动文件问题:经常因为选错了启动文件,导致程序无法正常运行,或者说调试时好好的,脱机运行就出鬼。这点在做不同系列芯片间移植时最容易碰到。9 b+ B c( s9 C7 F5 M: o 堆或栈越界溢出:这个也会导致芯片无法正常工作,调试时往往可能会有硬错提示。& [8 ~' O2 i7 E" _( D3 v / h& r9 L' Q" t3 s0 z 芯片引脚短路:这是最典型的现象,也是最常见的原因,一般不工作的时候第一反应就是检查是否发生短路,短路引发芯片无法正常工作。 ! Q" I# ]7 D+ } 外部晶振异常:外部晶振无法正常工作也是导致芯片无法正常工作的原因,如果程序时钟配置中没有增加在外部晶振无法正常工作时切换到内部晶振的代码,将导致单片机无法正常启动,进行调试会发现代码卡在了RCC时钟的初始化中0 \2 I3 C& X! _ 2 l; |' Q) c4 ` 数组越界操作: 数组发生越界时,便会进行错误,结果是程序直接卡死" s3 p! z5 M3 e0 }; X& }* Z5 \ ; c ^5 ^$ X% K5 V 中断处理错误: 同样会导致单片机卡死 ( n; U* {4 C% H w6 g% y 单片机发生程序异常时,会进入到HardFault_Handler中断 ' }( L8 k- H* I* f 解决方法:
在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真 ; }) c) S" B- L+ L# h
; U" X5 z3 e* n6 U' G, ~- ^
$ r0 B, S4 |7 S+ I' f5 j 在Keil菜单栏点击“View”——“Call Stack Window” 弹出“Call Stack + Locals”对话框。然后在对话框中右键选择“Show Caller Code”,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况7 V+ A- A8 H5 N, b* ~% O 6 w4 i; `3 @2 F1 @
以下问题为J-LINK找不到芯片时的异常错误: 自锁原因:" k1 @8 I( @; X5 J" l5 I STM32单片机一般的连接方式是**主闪存存储器(flash)**启动模式,即BOOT0为0,这样在用JTAG或SWD写进程序的时候,如果该程序工程中芯片选型不正确或着程序中复用了JTAG或SW复用引脚导致程序执行后出现启动配置错误或者调试引脚被占用而引起的芯片锁死或Jlnk连接不上的问题,6 F* b" c* Q# @5 z: O1 p6 g 时钟问题:时钟频率设置太高,配置超出芯片主频工作范围,导致单片机自锁 ^3 c6 P; j& L" s6 } 电源问题:供电电压不稳,STM32内部存在保护检测,同样会进行芯片的自锁8 G1 H6 G3 M* g; B& ` ^& s 0 r& n; O5 ~, E; M8 M; s4 z + {4 G, z. J5 ?. m/ ~+ z* G 解决方法:% J: N7 H v0 I$ n9 Z 把BOOT0和BOOT1跳成1和0,(这时候就看下Jlink应该可以找到芯片),让内部程序不运行,然后再重新下载另外的程序,再改回BOOT设置,便可以恢复正常。如果板子上JTAG和SW调试电路都有的话,在其中一种方式导致锁死的情况下可以用另一种方式擦除恢复,而不必调整BOOT设置。4 T& L' s: v* p9 ^6 t1 H
4 ~- K/ l0 \) A% w. m+ G$ r
) J. z1 _, N ~; u 简单的说 : 正常的芯片自锁,就是将Flash存储进行读写保护,使得不能运行程序,而我们的做法就是将BOOT0置高,使程序从系统存储器启动,找到芯片之后,重新往Flash中下载一个正常的代码,之后再换回Flash启动,芯片即可完成解锁$ R9 b4 p+ H1 x1 }/ Q 6 ?$ B8 ~1 B' B# ~# q 如果即可以JTAG下载又可以SWD下载,假设SWD方式锁了,可以换成JTAG下载方式然后下载正常程序,同样可以解锁: z; L/ z% Y2 `9 Z8 ^3 r |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版