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

STM32分享笔记之新建工程模板下载与调试

[复制链接]
STMCU小助手 发布时间:2023-3-10 11:53
前言
! o% X/ Q6 a" O$ ^5 U该文档主要讲解内容有:6 o. ?* X5 u7 s& E! T
在Keil环境下新建工程——基于寄存器版本
) m6 ~. c$ t3 s程序下载方法1——ISP串口下载$ J" k+ i8 x% G" k3 |
程序下载方法2——JLINK程序下载% o; {& B  e" B/ M, d
JLINK在线调试+软件调试方法0 q! K; N6 z* T% X+ J) p
一、新建工程
( ~9 y/ A# U3 Z, s1 n8 [# k建立存放工程的文件夹:包含三部分7 l. |! `+ I& J( y8 x# }, K

' W; t: \$ g5 y/ p- U0 R( I
4ca8dcc1db5a4f09aa93eb5d3c185203.png
9 {0 @; o7 ]. X# r, ^, k: j# B! U! j  _& L" g! u* _- n0 G
打开keil软件(MDK5),点击新建工程:
8 H- ~( G1 X. W' O& K" o
. V! Z, ]% r& `8 H/ ?
12effd611a0a4ef99a3b39d061f16160.png 0 @* ]; i$ i/ a% }1 G0 I" W* Z

& W# x6 k4 c2 K3 o7 A8 Z: f. Y5 z保存新建工程
3 H3 w! e9 a# Y找到刚才建立的工程文件种的USER文件,选中并保存:& T1 _4 x! T8 `

/ U, u) m- ^3 d) ]2 `
eabeefa690c944fe9400ca6ecfeb7184.png ' j4 X7 \/ x8 P* x4 k: k

. L) K( H0 w& h" g$ [( [选择芯片型号: z+ W- C7 P+ y) r
这里本人使用的信号型号为:STM32F407ZGT6,找到点击ok选择即可。
3 l: O2 s) {4 h# z9 p7 [* {3 j! J3 s/ K8 l
ec1143c365b34f01bebee42a09ec77d2.png
9 y# e  U3 Q* ]+ C  N

& s0 y* G6 t% Y  U/ v8 m6 ^ 添加功能组件
  O9 t, F1 p2 l% w! ~这里会提示你是否添加功能组件,由于这里是建立工程,先不需要添加直接关闭即可。
* L! ?! x' C/ Q  N0 X! h, t5 I7 P$ m& q; o9 w9 p; r' q
a65b28b85da842ae9b5ee8fe563c98ee.png 5 @6 O3 T4 w5 Q& h4 e; x6 d
3 S$ V" @6 Z3 }. M6 u
建立好的工程目录8 |. c, `( k7 M
, b0 l# }" A5 ]8 [) p4 d# Y
1c2a846f667e47d08abc7d55849ab81f.png
; r6 A( O, r: _+ s  l1 T3 D/ }1 m5 Q1 }9 A6 m
. i) ~6 _& `  w( W0 N; s5 H8 v
启动文件设置
' L' w3 y& \0 O$ O, [! T启动代码是一段和硬件相关的汇编代码,主要作用:1、堆栈(SP)初始化;2、初始化程序计数器(PC);3、设置向量表异常事件的入口地址;4、调用函数main函数。
" _( I% {2 T4 \$ C: d

& l0 X8 y) O0 YST公司对于STM32F40X和STM32F41X系列统一使用:startup_stm32f40_41xxx.s启动文件。2 x/ _; d! T7 v' T5 P$ R" N  Q
5 _" g! S* W! ^
由于使用STM32F407ZGT6开发板因此上述启动文件正常使用,但是需要对启动文件做一下修改,这里将寄存器版本代码用不到的代码屏蔽掉,主要是Reset_Handler函数修改。4 ^! a6 y# ?  Z, F: D6 z9 J& [
  1. Reset_Handler PROC7 O4 }, U( X4 K' k
  2. EXPORT Reset_Handler [WEAK]7 x: A9 T6 C: X$ [- ], T+ u% X
  3. ;IMPORT SystemInit ;寄存器代码,不需要在这里调用 SystemInit 函数, , y9 U7 E% A; P0 J7 |( l9 F/ A% q
  4.                     ;故屏蔽掉,库函数版本代码,可以留下
    - P6 t3 i7 Z/ r+ u/ ^: I8 h5 n
  5.                     ;不过需要在外部实现 SystemInit 函数,否则会报错.
    1 {, @8 z, T, A- f1 S
  6. IMPORT __main, A( ]/ o7 h+ k$ _/ _
  7.          LDR R0, =0xE000ED88     ;使能浮点运算 CP10,CP11
      C% H5 A, n3 N. g0 \
  8.          LDR R1,[R0]
    ; Q+ K: w" u' I4 H* ~
  9.          ORR R1,R1,#(0xF << 20)
    : ~$ h% B& L: q% i/ \7 _% O
  10.          STR R1,[R0]
    6 A$ o# [! l7 V! d# v6 v
  11.          ;LDR R0, =SystemInit    ;寄存器代码,未用到,屏蔽) ~: f; G! M3 s& d
  12.          ;BLX R0                 ;寄存器代码,未用到,屏蔽
    ' n, {' X0 z/ e+ n5 @6 |
  13.          LDR R0, =__main" N% s0 M$ U! \1 ?2 e
  14.          BX R0
    ; z7 Q  t0 \7 Z$ q0 O" X
  15. ENDP
复制代码
3 z+ C8 R$ l) U
上述代码:
) z2 v$ x/ O! O# ?+ [* Z1、开启了STM32F4硬件FPU的代码,以使能浮点运算单元。其中0xE000ED88就是协处理器控制寄存器(CPACR),该寄存器第20~23位用来控制是否支持浮点运算,这里全部设置为1。6 y- L, {8 r. s$ d
2、由于使用的是寄存器版本的代码,这里屏蔽了SystemInit函数。
/ c7 r' v1 x+ }) z9 v- Z! B* }. W: U$ \
由于使能了FPU,在MDK里也需要对FPU进行设置,否则代码无法运行,设置方式:打开Options for Target,如图进行设置2 ~4 G* D  v6 t) R+ t  Z

5 y# D& s4 f, C$ w由于开发板上晶振为8MHz所以这里将其改为8
9 T6 {  b; i$ a' t* [0 M0 i1 U/ V) g; R% }- n
da55b094c40e495b8cd9c9ab53f0580b.png & P; o8 ]: L( s8 t$ N! I! R

3 U3 G4 r8 _# A1 {2 V  H

' i* R" c0 ]* e9 g 添加启动文件
" H+ M) s. b+ k0 q* d将启动文件startup_stm32f40_41xxx.s启动文件拷贝到刚刚新建立的USER文件里面。
3 y) a: [- N$ d/ d3 U5 K- w+ T" Z- G$ i( m" T) X& a
f4e9a947f0814eb4a045a6dc529e920a.png
$ x$ m, l$ v& }  i7 M( U

! m% E, [7 k- H( d) X编译启动代码( D1 C/ r: `5 q) \, C# s7 [
1、目标编译,只编译打开的文件;2、全部编译,编译整个工程文件(事件较长)
. \( f2 d/ z3 E" O+ {/ _: [, Z8 q
) {5 e8 D: F2 V/ Q+ |
1d4f078950b345178e063d28de26f8c7.png
( y; Q$ \" S5 R- m7 p7 {7 x 1 l9 S4 b- }6 z% C/ a$ j6 z
24d34e8de9b047f4ac22973d9c4ec975.png
2 i; t1 ?9 s, G# e

5 \) A3 a8 K$ X( U4 k添加系统代码
' C# U& {; J8 } 在USER文件种MDK5会自动生成2个文件,用来存放MDK编译过程中产生的文件,在正点原子中会建立OBJ 文件夹单独存放,这里我们不对其进行调整,仅给出调整方式。
7 ?4 K% [+ T6 X6 k. y! Q* @
* T" Z& Q7 i0 E2 P/ b
12b09d4a274b46619278a41c78cfd256.png 1 W- g1 z) W; `7 w1 ?0 s0 V7 G
, T1 i0 R& Q8 v% K3 j  [: r2 ?
de19110a784e4b02a1c1f19225c3885b.png
5 z3 z/ w0 g+ @7 M- {5 p" H* N% o) w' g
ec9f5c99cbbd43e7bcc9ac8e1532b298.png / \8 J6 d, V" h0 o9 Z  ^, f

$ h/ _0 l3 q0 n0 ]' P将系统代码(即 SYSTEM 文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到,不过不要拷贝错了!不要把库函数代码的系统文件夹拷贝到寄存器代码里面用,反之亦然!这些代码在任何 STM32F40x/STM32F41x 的芯片上都是通用的,可以用于快速构建自己的工程,后面会有详细介绍)
3 [0 l; \$ \' |- @4 ^, ~' I% W+ Q% J% k( C1 I" i
fc6f43370f5c4bd9aafd54f52321a8b7.png
: i+ s, }3 r6 R
" _# @, Q, l" p" ~3 R

! o, k8 ]. w" G" l3 }) @8 w, l" MMDK中添加相关文件) V7 G0 g5 ^8 \/ e' C! g
/ X5 j" F& t# ^4 w# ~, N
e88643c2ce1e42a4b0cf283fefb6de5c.png 3 E, E; E* f4 a( t9 M# {2 C
5 c6 Q2 Q4 M- `, B0 ?$ C
还需要再USER目录下添加main函数文件,test.c文件。
2 ]* F3 u' D! h" h8 d2 o
# O/ D" P/ \, s, k
301115d0d87f4b81b31c485b3b6fd004.png
& ?; v' s% t% d+ ]/ F- D3 E6 e( N! b1 L' S+ f$ k% |5 \
建立完成后双击1,可以添加建立的test.c文件。
; _$ ~  ^: r4 u2 Y% V2 Q1 H2 |. T
364b9022abba4d74bef1b596c2b7d3c8.png
+ b, i) c  c. s6 {1 y

, I8 W+ j, `9 J5 M; A$ @& t! p# v. |- | 再编写test.c文件后会发现有错误,这是由于还没有添加.c的头文件.h文件  F4 }+ C/ z5 g: U4 e* n
4 B9 ]" r: J6 ]! ~2 ]
816022d930184dcea719174246c172fb.png 4 {, T9 N; j9 Q8 {9 |+ {6 R" F' [

% T1 W  f5 x6 ^' g8 z

& U, I4 r) P1 s( S添加.h文件
5 B6 N6 C0 I3 I5 \+ ?! N# V图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比 如 MDK4/MDK3 等)才添加的, MDK5 在你选择器件的时候,就会内部定义这个宏,因此在 MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加进来。. o% e4 y$ P, q& t% f8 e, ]
图中 2 处是编译器优化选项,有 -O0~-O3 四种选择( default 则是 -O2),值越大,优化效果越强,但是仿真调试效果越差。这里我们选择 -O0 优化,以得到最好的调试效果,方便开发代码,在代码调试结束后,大家可以选择 -O2 之类的优化,得到更好的性能和更少的代码占用量。; [1 U- ?3 ^6 S2 [5 J& u
图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
8 y% L8 Y* i2 d4 a- H然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后面会经常用到)# x# r+ Y6 S) o$ p8 P, {3 ?3 V

$ O& s. J2 C& i3 W
f237b9718509465588a7341c8bc1016f.png
6 y1 R( d1 I3 E9 |: g" u4 d7 l  f# o+ O  h: |8 k

. `8 l: u9 j0 m添加完成后重新进行代码编译,如果代码编译出现错误提示:..\SYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)+ E$ {- O, X2 {# H% ]: Z& F* }
. o; {- u3 `; x$ g0 d$ ~
双击打开定位到38行,这里由于形参为int,且没有返回值,所以添加一个void即可。7 j* L" c- J" S- |+ Y- ^, s

' E) v% P' Z- z" v) J- Y- D+ |- E# [
615c1bcb055f441ebf638674a6c806d5.png
% n4 r" J( A! U
; Q% J$ w0 G* t- k( b; `+ r* ]  E
- e* D- `3 n$ a9 {
二、ISP串口程序下载
6 @9 X  I7 Y+ d- t, ^( `# } 再使用串口下载之前需要再电脑上安装串口驱动:CH340G,链接后任务管理可进行查看。) G3 @! z! R8 ?3 C0 m$ k8 ?9 n

- \4 ?/ W9 \# G4 l
82e5ded19d204755a477783ce033f21b.png 3 e) v5 A, F, s# x; c: L

# S* v" _+ t4 ~3 {' B

  z) s, _" V! ]$ h在安装好USB串口驱动后,打开串口下载软件FlyMcu,该软件是 mcuisp 的升级版本(flymcu 新增对 STM32F4 的支持),由 ALIENTEK提供部分赞助,mcuisp 作者开发,该软件可以在 www.mcuisp.com 免费下载。0 E; ~& b4 Y+ p/ t; U
1 g* x8 z& {( ^3 Z4 N0 a# y$ b4 m
3385fb5ef83444e88693a42e875c1673.png " @2 H5 v$ _4 u( j! k

5 j1 Z) i( _* ]; r- Z/ P6 n7 |串口的一建下载功能( s7 c* R6 @9 y* a  F
由于使用传统串口方式下载需要调整BOOT[1:0]的状态,比较繁琐。所以采用了一键下载电路。) f* P8 s& C/ H, O0 R% l' v
0 l: L' c8 M* @) V- V: z% V3 R  Y2 r
一键下载电路利用了串口的DTR和RTS信号,分别控制STM32的复位和B0,配合串口上位机软件FlyMcu,设置:DTR的低电平复位,RTS高电平进入BootLoader,这样,B0和STM32的复位,完全可以由下载软件自动控制,从而实现一键下载。
7 ^4 d9 _- E% n
+ r5 F& w; L8 j设置在编译前设置输出.hex文件
7 [+ w6 t% V; ~7 i4 p) N* V3 j2 H; v
6 Y0 M, p( N9 I3 e# j4 I  y
44f08d1956a24a4abaddaf6877759c62.png % j, o+ ~+ N1 `0 m* w5 ~( S- @

, A) e3 E3 T, S/ X重新编译后在Objects文件中就会生成机器二进制代码文件.hex) A! z1 }7 H2 t7 t- {5 ?* n. [

0 k( W: V5 `. ?/ ~! T
417a6b2c942a4fb59205c6cdbff9e93c.png ; o0 @/ T: N9 w5 t! ^0 a

: H) B# E2 ?$ E- Q  V) F# X! ~
d62aaddf952547639bd6970338bac2d6.png ( I1 \7 |* [7 ]9 U# t) v
! G8 p' u7 p# `0 _: `% L
在串口助手中添加工程的.hex文件,和设置窗口下载0 u. ]4 w* Z3 S/ Y7 w4 u
7 ^* Y% c7 x8 Q
6d50992ec67f4bc3a84f8e495063f163.png 2 ~. C8 p( V/ L

( _9 x% O- V, m3 J- M( x4 _2 u
3 e+ R; {( L* Z' X! o
设置编程后执行,否则需要按一下复位键才能重新执行代码。
4 M# J5 i2 ]- R8 u编程前重装文件,该选项也比较有用,当选中该选项之后, flymcu 会在每次编程之前,将4 H/ O: ]! r+ C. {% o- u! C& D: A) j
hex 文件重新装载一遍,这对于代码调试的时候是比较有用的。 特别提醒: 不要选择使用 RamIsp ,否则,可能没法正常下载。
5 z) U3 }- U% S0 v  P
. H/ j5 _# M8 i
点击开始编程# ~1 x) @. }. B, f1 L' O
2 k1 c7 P# @; F. H
f11342bd23b044b78486eab04a54145c.png $ O* m2 k- u% M6 Y  I

, k8 S) n$ j2 F. V) H/ V打开串口助手发现移植接受到数据
0 w8 P0 e7 F2 g! ~* g' c* F6 p, E说明程序已经下载到板卡内,且正常运行. S4 w5 _) m& L' z" ?% P" u
: N1 w. }( M% _6 w5 F  W
cf65d417529740479405bb1344ff528e.png * @/ N. C8 m4 _6 g
- n  ^+ n: x* _+ N5 \& Q

2 E; Q6 ~$ l. Z/ G  b7 ]三、LINK程序下载与在线调试4 S* X( _8 o! ?2 g( z1 B: G. \% A  Y4 u
3.1 JTAG/SWD调试原理简析

9 o  |; h9 v9 b, F' z0 E
4 x0 T: q- h6 C7 `1 i
874dcea7cb0b4ea0bf34863f59d981d4.png 3 J: a! ?) t, |" X: r

/ D5 E# _9 g; [0 H
000f5763a6934ea3b2509d208280f20b.png
9 F1 U: x: c/ ^% f4 E5 d8 V8 [# n' Z7 u6 ]% Z
5100db7c88b540b798d1d8eb2890e728.png
5 [2 C( X; x5 x+ S' R! {
6 I7 Z& z& Y! x! G8 m7 |
复位后JTAG对应的IO引脚默认为JTAG模式,有时候配置相应的引脚无法使用GPIO功能,PB3/4! l9 g3 F7 f/ }6 U" R; z) R

6 ~+ @" r6 u' }" E/ }6 |2 _
b4c6d13410164f8e8a4a12f15b008460.png
5 ^; q3 c2 h$ D3 z% L6 y
4 F) k1 j8 N3 B
% f3 R3 r! m* o$ M: X. |9 z3 u
3.2 硬件连接
  h8 s: Z% V+ X/ ^' s7 o( i3 d, S# c! l* u* u4 _" F/ [# {; e$ K  V, l4 O
551ae3f5a94048c5bc21ebdfd85a864d.png   Q1 R& z" c* [
6 r; Z" u' F: z" L" N! c6 X0 z$ Y  w
f5478c375ebf4219bed8eec28c7db7fb.png 3 G0 p& p5 e4 Q+ h

3 a/ a- N3 X% r6 {3.3 JTAG/SWD模式配置5 b$ D% a. k: \& D, K7 a# T8 I2 W
当用到PB3/4的GPIO功能是需要对其模式进行重新设置,在文件stm32f4xx_gpio.c中,void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
7 R- S, v( \" l3 d9 Q+ p3 }7 [6 `( @$ S
默认复位状态,这些引脚都是JTAG/SWD调试功能开启。 如果需要关闭,只需要相应的IO口设置为相应模式。
* {9 Q: W8 d/ B0 O
( D% O3 A* ]* P9 {& [9 p7 u
565c6415a9fc458193aa193da3b5637c.png 5 }5 w& X2 [" L: F! a+ ^
; {) N6 g# o  Y! z# r
3.4 程序下载
6 n6 J, H$ o) \6 `+ a% l由于串口只能实现下载程序功能,而不能实现跟踪调试,而调试工具,JLINK/ULINK/STLNK等实现程序的跟踪。SWD下载调试仅需要占用两条IO口; Z' s& D( l/ `$ n& D2 H1 P" z

: A) E# a# j) s- Y6 D9 ?2 \本人使用的是STLINK进行在线调试。
6 _" F- h4 B* V; U0 i

+ l: a0 t2 [7 v2 q1 Y+ J' U: I3 ?% o1 c调整Options for Target中的Debug选项卡
$ p' \. V# g' L5 i: S% w7 B3 n
1 ~' S8 z9 w! k! i; K' i6 D
b1730eb0c9594bb0b5f29be354d3d1d2.png ( p3 E/ ]. @0 J& k4 v; x$ z- t, ]
: x6 J: a) h5 w" M. M& I& `# T
上图中我们还勾选了 Run to main(),该选项选中后,只要点击仿真就会直接运行到 main 函数,如果没选择这个选项,则会先执行 startup_stm32f40_41xxx.s 文件的 Reset_Handler,再跳到main 函数。
! ]3 B; A: [6 \7 N3 @* K0 c, d7 r2 R8 f6 M
点击Setting设置
5 l7 J5 G0 N: ?- ~& n- f4 r8 z0 e' b0 n; d" a; [* @' Y
92f1b6edfb7e4f529c6a0964121fdde7.png # v$ o- t% D! i- I1 J

3 o1 d3 F5 J1 h; l使用SWD接口方式,右边已经显示检查到SWDIO接口6 x8 D3 C- w$ N- A+ x6 c

! t4 n4 G( f3 f下载设置( \- z8 \4 g. }
% G4 p7 X$ R: S0 M; k
099a285a5f294ca597dd097fb9559988.png $ I% D2 B" \5 g5 y

5 i* m" `0 V& D5 ]" X 代码程序的下载
, w, e) T8 a( i重新编译后直接点击下载按钮就可以了; Z" l% X5 q$ p, Q1 o  _/ M/ c
6 C) }  \# B, P( V/ E4 v0 s
fda8ebe6017948beba48b49665aab9b8.png ! g7 I+ h$ P+ P
  O& L7 B" d8 O5 r- o6 D
下载完成 2 |/ v6 g  ^0 A) u7 ?6 y0 H/ k

6 U+ L% l+ `4 @9 w  x% Z
b68ac43834f44a66a907617d954657f1.png
* c2 d) c, @+ T4 W' _3.2 在线调试. e8 n- t" E4 ?: m: V& Q
MCU内部已经被下入程序,接下来可以点击(开始/暂停仿真按钮)进行在线仿真。,点击
$ e1 S7 X& ^0 }0 l1 Y6 `$ z后出现仿真界面,其中上面由调试的工具条:
; o2 j: V4 ]) t1 l% D( U$ x4 j; G1 {* H  O( K1 n1 D
496c6dfeaa20446c9f39390fb06c67fd.png
2 ~0 X4 g/ x* u. r. E6 }3 s* A6 o4 D' S+ E! x$ s
复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。
# S# e/ E+ ]" y执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。
" q( F5 z3 p6 `! ?* K. _停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。! `' W, z2 j* `& J" a
执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。$ Z1 r, G2 G8 b5 A% J
执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。
) j3 U* f6 N) i  ~1 k执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。
9 W2 F+ S% `. H2 N+ o执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
- T% e" M! k! g9 D) X  H  q) I汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。+ N9 h4 R9 m5 q1 o6 }) H& c9 p
堆栈局部变量窗口:通过该按钮,显示 Call Stack+Locals 窗口,显示当前函数的局部变量及其值,方便查看。
! I  B% |9 K* M; i- |! Z9 ?% T观察窗口:MDK5 提供 2 个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。$ o2 w/ Y% P1 S1 {1 S
内存查看窗口:MDK5 提供 4 个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口. o% L6 a1 j) l3 t
串口打印窗口:MDK5 提供 4 个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。
7 P0 V) ], e- C; v' {逻辑分析窗口:该图标下面有 3 个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(Logic Analyzer),点击即可调出该窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。
; i4 t) c7 Z; i2 R' P系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。: J6 D1 k2 o0 F. l9 h7 X: U9 z

, P9 M5 U+ U" Q6 a6 j
) a: d" c7 u9 _  z0 ~: v
现在先不忙着往下执行,点击菜单栏的 Peripherals  System Viewer  USART  USART1 。
. S3 }& N; z3 w2 \3 G1 H  R可以看到,有很多外设可以查看,这里我们查看的是串口 1 的情况。如图 4.2.9 所示:/ D  A. E/ n# f( I. x, f. ~1 ~
7 j# B4 Z5 n+ O0 A
fc0a0a32afc641d69cb45b239d11598e.png ; I8 J2 U$ y4 L" @9 S

. L* z# q4 Q/ F1 w# Y( F 这里先点击复位按钮,然后打一个断点,且点击将程序执行到该断点处。就会发现相关的区域就会出现相应的变化。: ]  o/ V7 c3 }7 N/ T6 z

1 r8 z6 n: O3 ~: N7 N
f44ac1b23e604f7c82046ebb6b811eec.png 8 u% U3 d2 y# c% ^) }! ~
0 t& m9 C( |) Q: _, N2 l2 _4 j
该文档到这里就结束了主要讲了如何建立工程、下载程序和程序的在线调试) p% J1 Q. ]  X: l4 t" q
————————————————
/ t6 O/ _& X5 s版权声明:追逐者-桥- k9 i0 A9 h& \$ a; c" g
如有侵权请联系删除
2 O/ h" i  x9 l9 w5 B2 J1 I4 j6 T2 L6 s) Z6 B7 [1 Y% j
1 |1 Q7 {  s  w( Q
$ M: ~' \: B, _( i
75348a2fcd1243639c94fc5cfeb92937.png
赞 收藏 评论0 发布时间:2023-3-10 11:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

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