
前文已经描述STM32CubeIDE的一些基本操作,基于前两篇文章,已经可以完成配置工程然后编译下载的目的,但是STM32开发,最重要的是实时调试,这一章描述STM32CubeIDE通过ST-Link调试,并对照Keil进行对比。+ M: t$ F, R) O" } 在Keil中,如果想调试,只需要将调试器和MCU连接好后,按下Keil中的这个按钮即可,随后程序会自动暂停到main函数第一行。 ![]() Keil中进入调试按钮 在STM32CubeIDE中,选中工程的情况下,也可以在工程上右键点击如图红框所示选项或者菜单栏上的按钮进入调试状态。* @ i/ r' L$ G6 c# c; O: t " {6 w7 F( }5 ]1 W R# |% U ![]() ( b9 m% U4 B- _' ^( B. Q' ` STM32CubeIDE进入调试 ( t7 s$ \( V4 L8 g2 C1 d 如果该工程是第一次进入调试状态,则会弹出下图所示配置窗口。3 x; k) ]$ u7 R( u; ~' i ' g x* f+ a1 W8 ]% y* G ![]() ' s8 T; [9 ~8 V 调试配置窗口 在Keil中也有类似的配置,我们对比进行说明,下图左图就是STM32CubeIDE的调试器配置栏,右图是Keil的调试配置栏目。& E# Z# [. s, {8 A" `. ? , r( k9 p7 l, [2 V 下列所有图片中,左图是STM32CubeIDE的页面截图,右图是Keil中对应页面截图,下文不在说明。/ v1 ~. N$ [) A* ]4 G 7 ?) s4 L+ Q$ P3 _+ E7 g2 ^: _ ![]() 调试器配置栏 ! `/ O6 H+ I y7 {2 a5 o! g- ~ {' `& q1 k ( k0 w B) x) h0 u: a, w% l7 b$ s! P Keil中支持很多的调试器,每种调试器都有自己不同的协议和优缺点。STM32CubeIDE目前只支持三种调试器,可通过该选项配置,其中ST-Link、J-Link,对于搞单片机的人来说再熟悉不过了,OpenOCD是一个开源的功能强大的调试器,如果要使用别的调试器,例如CMSIS-DAP等,可以通过ST-Link(OpenOCD)来实现。 ![]() 选择调试器 接口和频率选择,现在搞STM32一般都使用三线的SWD,特别是ST-Link OB,JLink OB出现后,方便、小巧,板子上也只需要留出SWDIO、SWCLK和GND三根线就行,很难看见JTAG口了。如果板子调试线过长或者干扰太大,可以尝试降低频率提高通信成功率。 7 \- x2 j' P8 E; Y5 ?. I$ t7 f$ k ![]() 接口和频率配置 8 d* X+ N* i2 R/ p% Y5 M! \, c$ [( H 复位选项,这里介绍下STM32CubeIDE中的各个选项含义,Keil中的选项可自行参考# M$ ` l9 X ^3 j I& G4 V; S2 p8 G$ R & M( R& @6 C- `. M! ^' N ![]() 复位选项 % N4 @) H7 X& J3 e4 E2 R3 [( Y( c ~& E" w! q 要想了解这些选项,必须先了解NRST异步复位引脚,STM32处理器对外都包含了一个NRST引脚,只要拉低这个引脚,MCU就会处于复位状态,复位外设和内核。而在ST-Link调试器中,对外就包含了一根NRST线,用于连接到目标硬件的NRST操作目标处理器复位。+ K: l( d1 C' V4 @- X/ v' \; O ![]() NRST引脚 : f+ m( Z O5 K+ B3 M& m% t' L) _& F& X9 s$ Y; S" }3 o! J Connect under reset:先拉低NRST线复位MCU,然后连接MCU,然后拉高NRST线MCU退出复位状态。 # |& g* P4 {5 j" L Software system reset:先连接到MCU,然后向MCU寄存器写命令来复位MCU,复位内核和外围设备。0 [( \/ m; Q" _3 T6 x3 [( S 0 d( p5 G( X4 W+ V( E Hardware reset:先拉低NRST线复位MCU,然后拉高NRST线退出复位状态,接着连接MCU。1 B. e% Q& i+ m; I9 M Z ?" ~6 L, G: U8 z% X( C0 | Core reset:向MCU寄存器写命令来复位MCU,只复位内核,不复位外围设备。! z* t5 W1 B2 m2 i* A4 j0 i ; ?$ I! d, s* N X3 O/ y6 B None:程序已经下载运行的情况下,不复位,直接连接MCU。 % n! v' _- B( w7 O* n ; Q- N" g* J" ~+ c7 h: v, H: ~3 N 可以根据实际情况选择,如果有NRST线,当然是选择Connect under reset比较好,例如当没有配置处理的Debug口或者Debug口被占用的时候,这时候普通的方式已经无法连接到处理器,就可以使用这种方式烧录入新的程序释放Debug口。如果没有NRST,那就选择Software system reset。不过只要SWDIO、SWCLK、GND线连接和功能正常,不管选那种方式,总能进入调试模式。 $ d B5 k8 Y5 `5 q" O. f _ 配置相关的文件存放在.launch文件中,如果没有这个文件,进入调试时就会弹出配置窗口。0 Z; x+ ?8 t4 J# j ![]() 1 D% x/ A N0 K$ G; G7 m1 D launch文件 7 S: Z5 z5 }3 k: K 7 P3 A4 w, m" V 点击Debug按钮进入调试,此时如果连接正确的情况下控制台会弹出若干信息,接着将程序停到main函数第一行。1 G; l2 d1 p9 Q$ r ![]() 进入调试 3 _) \# j4 x2 n2 c! ]$ k2 v: B" P$ T1 Z6 I7 W4 M 通过左上角的这些按钮,就可以达到如同Keil的单步跳过、单步进入、暂停、运行等操作。这里有一个小bug,一定要等停到main函数第一行时才可以操作调试命令,如果操之过急,在还没停到第一行就开始就进行操作,此时调试会异常退出。 ( g" `$ ]% m% i4 r+ v+ @ 点击如图所示的Resume,快捷键F8,程序开始运行。 7 p0 D9 m- ?+ l5 e ![]() 常用调试命令 * R9 {( j" a d$ l8 b% P 打断点和Keil一样,在程序左侧双击,程序就会运行到断点处停止。 5 N0 T9 b* {2 k9 r ![]() 3 d; \5 a# q3 A2 j4 w; k5 v" k4 n 打断点 9 u( n' m, Q+ Y) \ 将鼠标移动到断点上方,接着就会弹出一个小框,点击小框右侧如下图所示的图标,就可以删除这个断点。& @- o7 _- o& z# K 0 p1 _3 c0 J1 {, n) {+ ]) h ![]() $ n$ o3 m/ p9 R5 }$ V$ k8 ]9 o" l' B* d 删除断点 4 @3 o* j# I1 q7 a/ p 如果有很多个断点需要删除,就可以通过调试界面右侧进行全部删除。 8 W9 N) A0 m# ^: S2 p e3 i ![]() + t" Y$ T' E+ U, e+ i 删除所有断点 - }7 J/ }# U' U2 E) ` p 如果找不到上图这个视图界面,可以通过如下图所示的菜单栏打开。 ![]() $ p- F, g- Q2 f) S 打开各种视图 7 l: X& F$ O2 y3 R3 a4 }3 O( ]* @; L0 ~9 V4 t" p2 z6 x, u * O2 q/ q3 d/ H6 Z) T7 L 同Keil一样,断点的数量有上限,太多的断点将会报错。; L$ D4 ]: d3 y 在程序中定义了三个变量,分别为全局变量、静态变量和局部变量。并在主函数中让其自增,用来说明STM32CubeIDE中的查看变量功能。4 Z$ K: i9 C% b0 @ . w( y) ]5 ]+ q4 z ![]() 增加三个变量 % }5 g0 T" |; {0 f- ~6 n8 Q! a; A6 x. M" C5 |. Y & m" k9 N# m j# _3 H 在Expressions、现场表达式这两个试图中,都将三个变量添加进去,可以看到,在程序不暂停的情况下,现场表达式可以实时查看全局变量的变化情况,局部变量和静态变量则无法查看,而Expressions则无法实时查看任何变量。 ![]() ; \5 _) [8 `# p' u, g* p. r 现场表达式视图 / w; y) P6 D; y# Y9 k* J. C 4 g1 W& L5 b1 u7 G* O- I+ l. }: D+ D& S ![]() 4 t7 j- E. O2 ?5 Y Expressions视图 , Y j/ w7 V2 I0 V7 B& P$ W7 ?0 _: v 当程序暂停的时候,将鼠标移动到变量名称上就会自动弹出当前变量的值。; d. |+ N2 e0 k S0 ] 1 i" w% }& w3 j! v- ]' ?! o! l7 ` ![]() 查看变量 4 a3 k! Q4 h/ j) h/ [1 M5 ?7 c. n7 T / i' q( r% a1 \$ _$ D 此时在右侧Expressions试图也可以看到添加进去的变量。9 P* {, W: s* J# d! C ![]() Expressions试图 $ _* [0 q! C3 b 此外,还可以通过SFRs查看处理器各个外设寄存器的值。' t# ?1 T `, G' U ![]() 9 w. V6 ^3 h( k; g$ ^2 N SFRs视图 ( f, g3 ?7 g& F" l7 d6 M4 M- w6 W 也可以通过Registers查看内核各个寄存器的值。 ![]() Registers视图 ( @) @' \/ p. q) [ e, E6 @ $ j H" f; p( P# c6 S( R% O4 p 另外Keil中可以配置下载程序时是否擦除所有Flash、不拆除、部分扇区,这在STM32CubeIDE中是没有的(也有可能是我没找到),需要搭配STM32CubeProg实现。' R9 Y5 }' A# T8 x/ l- R ! A) L3 Q E |2 H9 P( m 从调试体验这一块来说,还是Keil体验上来的比较好,各个功能也比较人性化,STM32CubeIDE的调试各种操作接口还有可优化的空间,但目前也能满足需求,最重要的还是免费。' v! O& X [, I/ N" C7 R9 _" M # H2 n( O5 K4 Y% p9 h0 W+ j1 v. h 作者:bili_42806779649 ; e9 ?' j. h. v' ^! b7 F% D ' J4 r% ] I8 j 5 J; u4 p# g* K |
【STM32N6570-DK评测】摄像头video encoder
实战经验 | STM32CubeIDE实用技巧之工程联调
【STM32H745I-DISCO】基于TouchGFX的工业控制器界面设计
【下载问题解决】关于ST官网下载软件问题解决
【STM32N6570-DK评测】开发环境及LED debug
实战经验 | 基于STM32CubeIDE下载TouchGFX GUI应用的出错分析
实战经验 | 如何修改STM32Cube固件包的存储位置
兔哥的杂谈【002】——如何性价比更高地去编译STM32
IDE删除编译中间文件
STM32CubeIDE 快速入门指南