STMCU小助手
发布时间:2025-8-26 16:45
|
1. 前言 在嵌入式项目中,我们经常会碰到各种各样的异常和故障,比如客户说,某个问题可能需要一天,一周,甚至以月为周期才能复现一次问题。诸如此类问题,着实令工程师苦恼,因为很难去捕获信息来分析和复现问题,这里给大家分享一些我的经验和技巧。1 W H" e; y4 [# @, V. o0 C9 } 2. 方法 我们都知道调试是非常高效的分析手段,相信大家对断点(breakpoint)并不陌生,事实上,断点还可以设置条件的,当条件满足时再触发断点,这对于分析疑难杂症非常有用。: ]. E/ A% @9 |5 n \/ P& y # x$ u' l' O. w 接下来我将介绍如何在 STM32CubeIDE 中使用条件断点,以及如何使用观察点。$ \& K/ W: Q5 O8 M0 O6 O/ Y4 U 2.1. 断点/breakpoint 断点就是当程序到达某个点时,断点可使程序暂停运行。 我们在调试界面先设置一个断点,鼠标右击该断点进入断点的属性界面,如下图所示" U# G6 M8 A8 |
图1. 断点的属性 ! ~' N. o& J$ O! c4 w" p为了演示,我在断点的属性界面中,为断点增加了一则条件:(*(int *) 0x42020414 == 0x01)&&(hspi1.Init.NSSPMode == 0x40000000)。 U4 F5 e, R% ?9 s2 m' n8 \ 此处的“0x42020414”就是 GPIOB 的 ODR 寄存器的地址, “0x40000000”就是 “SPI_NSS_PULSE_ENABLE”的宏定义,所以该条件的含义是:当 PB0 输出高电平时,并且SPI1 的 NSSPMode=SPI_NSS_PULSE_ENABLE 时,触发该断点,如下图所示。
图2. 设置断点的条件 如此一来,我们在调试的时候,就能看到,当且仅当上述条件满足时,程序才会停留在该断点上,如下图所示:
图3. 设置断点的条件 2.2. 观察点/watchpoint 与条件断点稍微不同,观察点也是一种特殊的断点,当表达式的值发生变化时,它会使程序暂停运行。那么如何设置观察点呢? % i9 r; | m* R ]& e% l" ? 还是在调试界面,首先我们在 outline 界面,或者将变量添加到Variables / Expression / LiveExpression 界面,然后找到该变量,右击选择“Toggle Watchpoint”,如下图所示。6 T% G0 `5 V$ `, F' g
图4. 添加观察点 # T" d; }4 e% p6 C' G a在之后出现的界面中,设置观察点的属性。为了演示,我这里设置了这样的条件:当 ret 变量被写入的时候,并且 ret 的值不等于 2 的时候,观察点生效,如下图所示。大家还可以根据需要,勾选上“Read”选项,就可以设置变量在被读的时候是否生效,非常的方便实用。
图5. 设置观察点的属性 - i: r6 X( V2 n8 c: t( {添加的 watchpoint 也会放置在 breakpoint 界面中,这里可以看到所有的断点,如下图所示:# N4 B4 x& N7 m6 q ( V. U: \ V6 q" [ D" V" A
图6. 修改 APP 工程的中断向量表偏移值 5 ?3 z+ R, h* |, c: \5 c/ p; |然后在程序中,当全局变量 ret 的值被修改,且值不等于 2 的时候,观测点会生效,直接暂停住程序。注意这里没有设置断点。如下图所示:8 P" n) o, Z4 E- R
图7. APP 工程的主循环 3. 小结" {' l+ y i9 r9 _& H3 L; Y 这些方法在调试疑难杂症时是非常有用的,但是弊端在于,必须连接仿真器进入调试模式。 : i% {( ?5 i4 y! k 在 Cortex-M3 以及更高级的内核 (如 M4,M33,M7 等) 中,对于不连接调试器的场景,我们还可以利用 SWV,以及 DWT 等调试单元来提前预埋监控程序,实现对内存/变量,以及函数的监控和调试。如“LAT1256 使用 STM32 的 DWT 单元监控内存”提供了类似的调试方法的说明。 3 x& X0 |1 V& o7 f' c' {" f 同样,我们还可以通过 STM32CubeMonitor 来实现非侵入式的监控。9 b9 I; L6 q) |- T# ` 对于疑难杂症,我们的方法是非常多的,大家可以选择合适的方式来分析问题。& r4 h, s7 J8 ~+ J7 k; ~0 Y 7 Q" U9 D" Y+ S* C! e |
【NUCLEO-C562RE】OLED 显示
保姆级教程:CMake 工程导入 STM32CubeIDE 步骤
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
《MCUBoot课程》学习笔记+从信任链原理到量产实践
STM32CubeIDE 2.2.0新版本发布
CubeMX生成CubeIDE工程代码乱码
STM32CubeIDE实时时钟(RTC)经验分享
微信公众号
手机版