你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeIDE 实用技巧之条件断点的妙用

[复制链接]
STMCU小助手 发布时间:2025-8-26 16:45
1. 前言6 J" M3 W4 c5 b' @  t0 T; I9 f
在嵌入式项目中,我们经常会碰到各种各样的异常和故障,比如客户说,某个问题可能需要一天,一周,甚至以月为周期才能复现一次问题。诸如此类问题,着实令工程师苦恼,因为很难去捕获信息来分析和复现问题,这里给大家分享一些我的经验和技巧。
' S+ g/ L* [. m- v0 ]- e  o

( i+ _2 A9 K0 B+ C; R2. 方法; t" Y: {8 Z# `# e* {. U; z
我们都知道调试是非常高效的分析手段,相信大家对断点(breakpoint)并不陌生,事实上,断点还可以设置条件的,当条件满足时再触发断点,这对于分析疑难杂症非常有用。
6 p2 e; C4 y* L) _6 h, Q! s- ~

' K0 ?  w. P% X& H接下来我将介绍如何在 STM32CubeIDE 中使用条件断点,以及如何使用观察点。. g5 y, A9 l( C; h; C2 \

& |* @* O' V) h7 z2.1. 断点/breakpoint
- J9 ?. n6 y/ i4 {断点就是当程序到达某个点时,断点可使程序暂停运行。
) |. t! i" N9 D" t/ J4 ~% L2 W我们在调试界面先设置一个断点,鼠标右击该断点进入断点的属性界面,如下图所示
. g* I: U/ Z2 J8 \
10.png
图1. 断点的属性

, Y* Y; \; y5 `, \# u为了演示,我在断点的属性界面中,为断点增加了一则条件:(*(int *) 0x42020414 == 0x01)&&(hspi1.Init.NSSPMode == 0x40000000)。
) b* l, s9 g$ B" \- K- P' d* b
1 C; S" {+ \  V9 {4 w
此处的“0x42020414”就是 GPIOB 的 ODR 寄存器的地址, “0x40000000”就是+ D: Z: k# w2 \3 Z9 h7 R
“SPI_NSS_PULSE_ENABLE”的宏定义,所以该条件的含义是:当 PB0 输出高电平时,并且SPI1 的 NSSPMode=SPI_NSS_PULSE_ENABLE 时,触发该断点,如下图所示。
! a- E: k. v$ b9 v" {: c' A7 G
9.png
图2. 设置断点的条件

' q" g' ^8 f# |& X1 ?如此一来,我们在调试的时候,就能看到,当且仅当上述条件满足时,程序才会停留在该断点上,如下图所示:
. r6 s6 d8 A5 `: S, T8 ^( ~
8.png
图3. 设置断点的条件
1 G. R. V* h4 T& e- R4 d; E- s7 }
8 B% m  y' F3 X0 D. ~: |2 d
2.2. 观察点/watchpoint. X% K5 T3 O  W# ?+ L3 o
与条件断点稍微不同,观察点也是一种特殊的断点,当表达式的值发生变化时,它会使程序暂停运行。那么如何设置观察点呢?
7 r1 B/ s# T* A* Q$ `+ X# H
& n( p0 f; c' B! e9 x" U* B' H
还是在调试界面,首先我们在 outline 界面,或者将变量添加到Variables / Expression / LiveExpression 界面,然后找到该变量,右击选择“Toggle Watchpoint”,如下图所示。! |, R/ [9 t. Y- \0 i% r1 a/ ]  S
11.png
图4. 添加观察点
* ^% y0 }- n6 J7 ~4 z, R! t$ p2 o9 t
在之后出现的界面中,设置观察点的属性。为了演示,我这里设置了这样的条件:当 ret 变量被写入的时候,并且 ret 的值不等于 2 的时候,观察点生效,如下图所示。大家还可以根据需要,勾选上“Read”选项,就可以设置变量在被读的时候是否生效,非常的方便实用。
6 t1 u- n' V; Y" k. [. I& _7 f
12.png
图5. 设置观察点的属性
8 f# x+ Z7 C3 j5 F, J. S+ e
: y* N3 l# q" e. H- l; e# }( j
添加的 watchpoint 也会放置在 breakpoint 界面中,这里可以看到所有的断点,如下图所示:3 R) Q3 S  _3 H( w: y; ?
. q1 H7 \* q* E0 C& ^
14.png
图6. 修改 APP 工程的中断向量表偏移值

. _: b$ \1 l- B- i8 A4 @# S然后在程序中,当全局变量 ret 的值被修改,且值不等于 2 的时候,观测点会生效,直接暂停住程序。注意这里没有设置断点。如下图所示:
' V, a4 n0 H' _$ y( @
15.png
图7. APP 工程的主循环

/ p9 G( }9 B2 P2 L; W( B
2 H6 d; {7 s4 h& {% e1 `* N/ `5 _( \
3. 小结1 b( \; F0 x/ s# C, e7 G7 k
这些方法在调试疑难杂症时是非常有用的,但是弊端在于,必须连接仿真器进入调试模式。
4 e$ L, d) J3 f" o# o
  ]0 K2 O& e* p/ K9 I. G
在 Cortex-M3 以及更高级的内核 (如 M4,M33,M7 等) 中,对于不连接调试器的场景,我们还可以利用 SWV,以及 DWT 等调试单元来提前预埋监控程序,实现对内存/变量,以及函数的监控和调试。如“LAT1256 使用 STM32 的 DWT 单元监控内存”提供了类似的调试方法的说明。
! w8 P9 x5 w; H+ o) h5 q& w
1 `7 @& }0 O4 s" f6 `
同样,我们还可以通过 STM32CubeMonitor 来实现非侵入式的监控。6 H/ A/ ~7 z/ o) S' m
! F. D3 j1 \0 s) S2 |
对于疑难杂症,我们的方法是非常多的,大家可以选择合适的方式来分析问题。
( k3 V# n! M& k; O+ h3 i+ s6 U2 b6 n3 w

2 w, n/ M0 V6 X( s1 g
赞 收藏 评论0 发布时间:2025-8-26 16:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版