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

【经验分享】STLINK调试程序教程

[复制链接]
STMCU小助手 发布时间:2022-3-25 13:56
01. 概述% g5 c( k% t' _+ M/ W* H
在实际的开发过程中,如果程序比较简单就不需要调试程序,但是对于比较复杂的程序,往往需要通过调试来解决bug。串口只能下载代码,并不能实时跟踪调试,而利用调试工具,比如 JLINK、ULINK、STLINK等就可以实时跟踪程序,从而找到你程序中的 bug,使你的开发事半功倍。
' R$ m/ b6 \2 z$ q6 o5 C8 u4 n: ^  g: t. z+ w5 w
STLINK 支持 JTAG 和 SWD,同时 STM32F4 也支持 JTAG 和 SWD。所以,我们有 2 种方式可以用来调试,JTAG 调试的时候,占用的 IO 线比较多,而 SWD 调试的时候占用的 IO 线很少,只需要两根即可。
4 F) G3 u( B- T8 F  u) K5 ?: _1 }1 o5 r. y) n9 O
02. STLINK调试程序; }  G7 V" q* U" h: X7 R  t/ D
2.1 点击开始调试按钮) T3 K# Y, C; {8 U$ i3 z

. g* g$ l1 C9 S6 t; c& _ 20200819105044779.png + n- r& n! _& n0 q/ \

0 L# B$ s4 e7 G编译一下工程。然后点击:(开始/停止仿真按钮),开始仿真(如果开发板的代码没被更新过,则会先更新代码(即下载代码),再仿真,你也可以通过按下载按钮,只下载代码,而不进入仿真。特别注意:开发板上的 B0和 B1 都要设置到 GND,否则代码下载后不会自动运行的!)( b8 q' X  z& a2 |( r$ V0 }: \  c

, P6 v9 z0 s+ l% j' l2.2 跳转到主函数执行
; ]# @  R* i: k  n
$ ?6 f; i2 ?5 x& |5 ^- i# u1 f( I
20200819105051100.png ; _+ }3 w  p: r$ u; Z' Z& e

" q% o. t& S/ b/ `$ C* J2.3 Debug工具条介绍/ f0 U' u3 R' `" W; ?
) R6 Q' t  k9 ^/ [. t5 ~1 \
因为我们之前勾选了 Run to main()选项,所以,程序直接就运行到了 main 函数的入口处。另外,此时 MDK 多出了一个工具条,这就是 Debug 工具条,这个工具条在我们仿真的时候是非常有用的,下面简单介绍一下 Debug 工具条相关按钮的功能。
& o6 P/ w& G* E- |" g/ z, X' D( @
+ s: w% Y# h, I2 s0 s$ o 5X824O[YUUS2S7W}0SMD3FP.png
& g: V7 M# U! W! T- E' |' H$ d# y  O/ q: ]+ J* w6 C
复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。' D! {& k& j2 M) @

1 u; W- N- v! g9 k# ~执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。
1 }- ?7 B' T4 [( }  b
0 T! p# e$ w3 S& X: ]" Z停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。# Y9 k9 k+ h9 x1 u: K
# R, t( A1 x# Z7 x9 F7 u  i
执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。
. F# L# s. P: b
/ Z3 \/ b, M/ M( Y+ V! d执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。
- {9 O+ @* U8 p) x
: Y% j$ `7 C* [执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。6 }; t  ]0 @9 R5 V7 e' g# i5 M2 j
$ \9 C6 x( t" M4 ?) D4 M
执行到光标处:
该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
) N1 L/ L. p9 c+ c; k! ?0 U( r8 d0 J8 }* F3 w
汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。
& o: G: L2 M4 W1 r' j8 h& p+ }
5 r* D6 m6 Q" H( o7 M. g( a' L, s: e8 |堆栈局部变量窗口:
通过该按钮,显示 Call Stack+Locals 窗口,显示当前函数的局部变量及其值,方便查看。
$ w3 A) H% w" c6 |4 E3 v* z) f& i0 ?' P2 s
观察窗口:
MDK5 提供 2 个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。' a1 @4 a8 L5 a, m$ s

/ a2 N' J# N( k9 `' @$ m0 m内存查看窗口:MDK5 提供 4 个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口, `0 }0 }' |8 J8 ~

, [' G. G" N1 M  ]7 E  D4 k串口打印窗口
:MDK5 提供 4 个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。* q! q6 }+ w1 S

( q; L$ l7 g* a& I6 a5 T4 d# U逻辑分析窗口:该图标下面有 3 个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(Logic Analyzer),点击即可调出该窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。) \# |& p& Z, c0 d- O7 M3 n& w
% E+ q% k! M! M
系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。) B- z5 f) V: ?' [7 t& ?, a

7 `2 z: C& F' w- }& |Debug 工具条上的其他几个按钮用的比较少,我们这里就不介绍了。以上介绍的是比较常用的,当然也不是每次都用得着这么多,具体看你程序调试的时候有没有必要观看这些东西,来决定要不要看。
! \5 `* a: p# |5 a# t( t5 k! D( s* B2 Y% y4 d' {
特别注意:串口打印窗口和逻辑分析窗口仅在软件仿真的时候可用,而 MDK5 对 STM32F4的软件仿真,基本上不支持(故本教程直接没有对软件仿真进行介绍了),所以,基本上这两个窗口用不着。但是对 STM32F1 的软件仿真,MDK5 是支持的,在 F1 开发的时候,可以用到。0 ~, ]' L  f/ l5 ~3 Z1 G$ |
1 n. l4 R  j7 n* U. C+ h
2.4 设置和取消断点. a% }: s2 [- Q0 m3 ?

3 H2 Q, O8 b9 d3 y% F+ r5 Y我们把光标放到 test.c 的第22行左侧的灰色区域,然后按下鼠标左键,即可放置一个断点(红色的实心点,也可以通过鼠标右键弹出菜单来加入),再次单击则取消。4 k3 S; l% e# [9 o2 {9 M
( M3 b' X, Q  l6 V2 g6 |- Y$ w1 M
3$@`BP[H4WIA1WBN8M}LBH0.png   v; Y4 e7 o1 e/ V+ U( z: K! U7 z
& H4 ?, |6 f/ O/ Q" V' o
2.5 点击run执行到断点处4 t4 ~: e# K7 T1 d9 z
3 U: i# A* C2 _" Z; G) T
0 \- U3 W3 _, z1 E+ ~6 [% l' q, F- `
1 e6 A5 d$ s$ _: X1 I3 l1 o
2.6 查看外设信息

! Q: _1 t+ O( L. J, E3 C9 w7 G. }
3 G' `. V1 e) _点击菜单栏的 Peripherals→System Viewer→GPIO→GPIOF。可以看到,有很多外设可以查看,这里我们查看的是GPIOF 的情况。
* Y$ ~% y- x+ n
& ?9 Z  X8 W4 {- U9 ]* F8 U O41)XFU_UNV6$FPQTRX)O4I.png . w/ X" ^$ z5 B6 S. [$ X# |
9 A# l& M) G) S' ~
单击 GPIOF后会在 IDE 右侧出现一个如图. `: b% \. {# Y+ b  s$ W# y* D

! z5 j) K+ i6 x; p# v 20200819105211271.png , c  Z0 S# d5 T
+ a- }( s  {  H
2.7 执行完初始化) Z+ ~" T3 C. n, x: E

, f0 S) U+ k6 G( M" |' v 20200819105226499.png / S! u5 [0 {- y7 R

1 v: z  U4 I. A# \- d0 ?; u0 P我们可以查看GPIOF 的各个寄存器设置状态,从而判断我们写的代码是否有问题,只有这里的设置正确了之后,才有可能在硬件上正确的执行。同样这样的方法也可以适用于很多其他外设,这个读者慢慢体会吧!这一方法不论是在排错还是在编写代码的时候,都是非常有用的。
3 y* Z0 p/ s" h2 }& a$ h3 d6 ?
3 j7 L% U6 i3 n3 z2 I: n2.8 查看栈信息* Y  ~0 t* x+ i/ }# `
Y8QI6RZS{T[@)[39QG44`HU.png
, W  \. o( h& c: n$ }( F5 {) E- c' \- L
3LF_PDD{_34[X$Q0%$]3AQ6.png
赞 收藏 评论0 发布时间:2022-3-25 13:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

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