STMCU小助手
发布时间:2024-2-29 16:27
|
01前言9 b0 u* S- v. @" ?$ l 在产品开发时,经常会碰到在测试过程中或设备出厂后才发现程序异常,但当重新对设备仿真调试时却复现不出现场的问题,或者只能通过保存的日志信息艰难分析代码运行到了何处而导致的异常。 " @% N1 p, L7 G, \+ A 遇到这种场景,也并非无路可循。原则上只要我们通过仿真器调试时,做到代码不被重新下载覆盖,MCU 不被复位,就可能保留当前程序运行的状态,让 Bug 无处藏身。 8 H" z+ s" ? X/ T 8 R( \7 [# ^) O# ~7 Z" l( t' Z, j4 } 02实现方法$ j! _, d: k. [) P O8 Q) o 首先,我们将编译完成的工程烧录到 MCU,保证 MCU 中所运行的代码与要仿真的工程代码一致,这样从 MCU 获取的程序位置才能与调试符号信息一致。 6 E& z3 |6 r! {: w6 M0 p. o' J 不同的编译器可以通过不同的方法进行设置,但其目的和最终能达到的效果是一致的。我们就对常用的 MDK、IAR、STM32CubeIDE 三种不同编译器分别进行设置,使 MCU 在不复位的状态下继续调试。 + H+ K5 s3 t4 M6 y8 f, Q; _4 x 03MDK 1. 新建一个.ini 文件,在文件中写入以下内容:LOAD %L INCREMENTAL,并加载到Initialization File,同时取消 Load Application at Startup 的选项。 5 k- K( Z3 ^! S% e+ p7 e ( Z4 m3 Y; a$ j. i% s. ?
6 ]8 ?% t' _# r5 O, V0 ?# e
" [9 D. B% u: U5 B* l, T 这个脚本的目的是加载编译生成的.axf 文件到 MDK 中,该文件包含 bin 代码和调试相关的各种符号信息,以定位我们的 C 源码。 / E; O/ s; y" C2 A) e + D- K5 W" M5 A/ b3 w8 S 关于其语法说明,可参考 MDK 的 uVision User’s Guide。 & [2 X# V+ m- v' s: B
1 F: R# i! ~- a, Y$ n. e2 @$ G & l+ q2 ]6 ~6 f \2 [/ B 2. 去掉 Reset after Connect 选项! \" k( m! E- U" q : K; _' c; L9 l- r
Z; T' `0 _; K+ X! o2 H9 Y' f% _8 H& I 3. 去掉 Update Target before Debugging! w5 G$ _. O: F3 ^- U, o3 x ) ]) l) K1 Z8 G( Z+ N a
2 W) I) B; P( a4 B6 Z; U/ w# i4 F 4. 完成上述配置后,就可以在 MCU 不复位的情况下,像正常调试一样加断点调试了。 3 s/ S( r0 o; D2 A, z # w3 s# a" L: T) {- J3 h9 q7 } 9 m) s+ x5 L3 P/ v$ l 04IAR4 V3 M9 [/ ]; P8 H 使用 IAR 时,无需额外设置,直接使用其自带的功能“Attach to Running Target”即可实现。 % S+ v4 b3 `: c) I F/ Z5 C - L U+ U" k/ L8 P( u
( G7 F0 B7 N7 e- X 05STM32CubeIDE! C' y$ s& a7 V% W" l 在 STM32CubeIDE 中,配置比较灵活,可以复制一个 Debug 的配置,并在这个基础上进行修改。 5 o" B5 V. i6 E 5 e2 r7 s D) |4 f6 D9 G! x) w
& [1 x2 H6 r4 e 8 ^4 z* b- L& K3 | x * ?- S/ o5 [- k) P3 I 1. 配置 Debugger->Reset behaviour Type 为 None: m. M4 I9 f$ E5 z ' u+ I/ E5 Q2 a/ k ! v* ~5 E6 b$ `, q9 k4 [5 M
2. 在 Debugger->Misc 中取消 Verify flash download 选项- N+ o( J& \1 G/ L3 q9 W1 {0 r 7 g. E3 I; S/ s& P4 S/ j & j( Q9 I' J6 S! o: h6 z, V2 N0 z
3. 在 Startup->Load Image and Symbols 中编辑下载代码时的操作方式。并取消Download 选项. |4 E7 w; d3 S ; @. u% b% O' |$ b
4. 在 Debug 时,用上述配置好的调试配置,即可同样实现不复位的调试 % }# B5 @$ E$ w i( v# t: O 4 y6 b9 U x0 O. q. o
. T% {) F* y" S+ v+ f3 t( n9 D5 i, c9 N& p ! q) h: s3 }2 z 06总结 利用上述不复位 MCU 继续调试的方法,能够保全现场的运行状态,重新接上仿真器即可对程序进行断点调试、单步执行等操作。对查找 Bug,发现并定位问题点,尤其对不易复现的偶发性故障十分有用。但是当 RDP Level≠0 时,因为已经开启了读保护,所以无法通过上述方法调试 + n% ?( i; P/ _/ z& D 转载自: STM32单片机4 e% c4 S/ z. e' H9 D& j. _ : X* W8 q' z8 d% U( V0 R 如有侵权请联系删除 , G! X, {4 h2 k, J: V) b . w+ d! z5 g9 T9 k! ^7 }4 n |
《STM32CubeMX2 实战课程》学习笔记5+CubeMX2生成的Uart初始化代码中没有使能
《STM32CubeMX2 实战课程》学习笔记4+FreeRTOS中的SysTick错误及改正
使用stm32C542做的低功耗密码锁示例
《STM32CubeMX2 实战课程》学习笔记1+由MX2生成MDK5项目并打开
《STM32CubeMX2 实战课程》学习笔记3.+sleep/stop/standby低功耗模式的入口
《STM32CubeMX2 实战课程》学习笔记2+MX2生成的MDK5工程中添加已存在文件(*.c / *.h)
【STM32MP257-DK】01开发板开箱、ST MPU 生态资源使用、环境搭建以及镜像更新
基于STM32在线升级OTA经验分享
【STM32C0测评】Nucleo-C092开发板驱动DS1302实验
Keil下的STM32N6之RAM运行工程配置说明
微信公众号
手机版
好资料,学习~~~
值得收藏