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

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

[复制链接]
STMCU小助手 发布时间:2022-6-10 19:22
01. 概述$ a" u) y  a4 t! q4 X7 G
在实际的开发过程中,如果程序比较简单就不需要调试程序,但是对于比较复杂的程序,往往需要通过调试来解决bug。串口只能下载代码,并不能实时跟踪调试,而利用调试工具,比如 JLINK、ULINK、STLINK等就可以实时跟踪程序,从而找到你程序中的 bug,使你的开发事半功倍。* h* X8 y  n2 w( h
1 {; m' m9 i# t7 d
STLINK 支持 JTAG 和 SWD,同时 STM32F4 也支持 JTAG 和 SWD。所以,我们有 2 种方式可以用来调试,JTAG 调试的时候,占用的 IO 线比较多,而 SWD 调试的时候占用的 IO 线很少,只需要两根即可。
) _* g, V# y' r% `8 F. m
  q$ h4 }' ]; U
$ s$ B# `/ J" R- O# [; G
02. STLINK调试程序
  L% J, F# y8 a  E9 r2.1 点击开始调试按钮

: I5 f( j, o4 a% j9 T9 j/ Z8 J1 t6 U/ }5 z
%BIO6FXL$P[8`3%NQRPTPUF.png
6 O. j: j' G" ^0 T1 Z  i5 p6 P) c' I( N
编译一下工程。然后点击:(开始/停止仿真按钮),开始仿真(如果开发板的代码没被更新过,则会先更新代码(即下载代码),再仿真,你也可以通过按下载按钮,只下载代码,而不进入仿真。特别注意:开发板上的 B0和 B1 都要设置到 GND,否则代码下载后不会自动运行的!)
- u1 f* W8 s# P3 u" a  @3 L# R/ C5 W& a# m

0 V& R' }$ E$ M( o* [2.2 跳转到主函数执行: a0 a6 m" G6 K6 N2 h2 k0 q0 ~

7 r7 I& ~% {/ |3 s. c: ^
OODEKLTDP67N[E1S2[ZRO%N.png . E0 _  i0 m3 V6 ?# Y
# @) a# g2 q# c. E# _: F' ?
2.3 Debug工具条介绍8 Y- s/ j# D2 t( }1 u4 }

: q2 v& B: b5 L* ]因为我们之前勾选了 Run to main()选项,所以,程序直接就运行到了 main 函数的入口处。另外,此时 MDK 多出了一个工具条,这就是 Debug 工具条,这个工具条在我们仿真的时候是非常有用的,下面简单介绍一下 Debug 工具条相关按钮的功能。! z/ S& C+ z" o/ @

8 D+ z5 f& i% I7 s) C. ^

5 G7 r3 P8 r$ ~  n7 J$ l* @) w 20200819105104317.png
) j1 S1 I9 v0 x6 \' A! H* W$ _
8 K4 p8 y, q( y  b8 ~6 J4 M) B
复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。
! }0 ]- k% D, z# F1 p" G1 c6 `: M4 m$ J
执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。
1 _5 ?2 ?6 N6 g% {# H9 g
, i! c) i" ~/ Y' s2 N& A6 Y4 p停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。
- ~! U4 F; m5 D

4 c$ b, }7 I- v4 B' w6 \执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。
8 G0 ?! g# M# U

  C; b$ F/ r8 L4 n执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。
, @- `% S% [1 ?, i

" g  @9 X4 @- }9 f' H. [* }执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。
: N- T' l3 m# f3 R  {7 _0 W3 ^
6 |0 E+ O# r. R9 U  R+ G6 P执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
$ v# N' J) u. T! V" c
8 L) w3 R' m$ J0 X汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。
' o5 c9 Z4 c' ?& ]( P: K/ _
# d. Y8 |5 @% c4 a( [: J堆栈局部变量窗口:通过该按钮,显示 Call Stack+Locals 窗口,显示当前函数的局部变量及其值,方便查看。
9 Q. ^. v/ q- l7 w) m5 P7 {6 b2 |. f0 g* K
观察窗口:MDK5 提供 2 个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。1 N' F& L* u! R" C* ^

: C0 l# Y. l" V内存查看窗口:MDK5 提供 4 个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口
$ _0 T0 o/ Z( s% n7 k( j6 I4 ^: O; _
" X. y; ?  y3 }# f& j6 p
串口打印窗口:MDK5 提供 4 个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。8 h, |& |' l1 i" ~: n4 J

+ u4 I/ [) ^, M& q# V* H0 A逻辑分析窗口:该图标下面有 3 个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(Logic Analyzer),点击即可调出该窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。
% z9 K7 p4 {! x, w# N7 A% J% s
4 m5 D" }7 m5 X" E0 h6 G0 P  T系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。
  T) o& W& H6 [6 ~+ m
' ^) c$ U1 v- p; zDebug 工具条上的其他几个按钮用的比较少,我们这里就不介绍了。以上介绍的是比较常用的,当然也不是每次都用得着这么多,具体看你程序调试的时候有没有必要观看这些东西,来决定要不要看。
) e5 K) q' O9 a3 n" Y7 Q. b& T' d5 W1 C+ l" i/ J
特别注意:串口打印窗口和逻辑分析窗口仅在软件仿真的时候可用,而 MDK5 对 STM32F4的软件仿真,基本上不支持(故本教程直接没有对软件仿真进行介绍了),所以,基本上这两个窗口用不着。但是对 STM32F1 的软件仿真,MDK5 是支持的,在 F1 开发的时候,可以用到。+ j+ B0 h; h/ o. C8 |) g. I2 R

% r; `% t& A# h- c+ X; e

3 j3 }! ~. n" q, _" a2.4 设置和取消断点

; U7 ^5 D5 S% ~8 s* D
4 O# Y4 S' K! m# ~我们把光标放到 test.c 的第22行左侧的灰色区域,然后按下鼠标左键,即可放置一个断点(红色的实心点,也可以通过鼠标右键弹出菜单来加入),再次单击则取消。- s' C# E9 ~8 a8 `4 J/ k

( B' Z- ]* B4 \* s$ y

) a3 C2 r8 }+ ?. g$ ?
0 F/ z. g* ^# L5 G" E$ y" B2 Z6 j
9 w4 @) e! J% q) y% I, H
2.5 点击run执行到断点处1 B1 M# ?5 z, t7 Q( U# g+ {. ^
' N4 ~1 s8 R( P* \) a
R231TA{7ZTNZX$WRX[HP3NQ.png 0 ^% ?# l& h  U: ]. @- t/ P

; n( n& }" H2 {) z2.6 查看外设信息

* _) L( j' E$ ?( r( |. Q
6 @' \( X# V7 h点击菜单栏的 Peripherals→System Viewer→GPIO→GPIOF。可以看到,有很多外设可以查看,这里我们查看的是GPIOF 的情况。
# B1 \  M' J8 M" b5 Z4 G5 _# c! L
# t& J) u* o5 I- j8 X) O$ D5 T
IHWTPD(IF%V2I376$A)H8BO.png
% q$ O# F  X% _" l! q) M* T! w  |2 v+ E6 v. E
单击 GPIOF后会在 IDE 右侧出现一个如图
# i$ b: m$ h6 h  o6 i0 C0 \/ E
/ f* o) U& \* ]6 h0 |
PG{2JRET4FFJ9KX$Z6@7COR.png
6 x: @8 x7 x$ ^: E& R
$ O1 Q/ \/ R& Q9 [, E- o8 \3 e
+ L4 S) y; c1 a1 |8 g
2.7 执行完初始化
) t# A3 Q7 P; a7 c9 y5 c$ e$ Z9 T7 i) j9 l' Y# F# Y( ]
20200819105226499.png
5 J9 ^7 ?* n% V/ B8 E, J, A7 T
- ~, G* T" w0 ]# R* w4 e5 z我们可以查看GPIOF 的各个寄存器设置状态,从而判断我们写的代码是否有问题,只有这里的设置正确了之后,才有可能在硬件上正确的执行。同样这样的方法也可以适用于很多其他外设,这个读者慢慢体会吧!这一方法不论是在排错还是在编写代码的时候,都是非常有用的。5 F* n$ v1 G$ w( P5 Q
( V; L7 P9 F. A
! a9 K* P' n' X
2.8 查看栈信息
) N( E' @$ n; T7 S2 ?: u0 A
* P0 D7 u) c7 i9 S' z  E7 z J%H{{R{8B8LX9~CT(]0QAUO.png
! B- [8 L2 j5 q& u9 ^1 S% G( i3 w5 w5 \. Z* n- S
* M" J3 n8 a. ~2 n
收藏 评论0 发布时间:2022-6-10 19:22

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版