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

STM32的介绍及MDK

[复制链接]
STMCU小助手 发布时间:2022-12-7 16:03
STM32介绍
$ g  E3 I8 q2 RSTM32命名
/ l4 W5 b1 D, n- S1 S$ }
/ A. f9 T# C! @% b
12653000fe564c22afe461e474f54967.png
5 v- @# D: c' r2 L
' z: {% V$ M: I1 s4 b6 |: ^
6 s  W( D& x! B& J. S
armV7的三个系列8 F7 U! @/ m/ T5 j9 {& X
A:针对操作系统7 F. G2 m8 b5 Y3 `: ]. `6 \# E# N& |
R:针对实时系统
0 N- F# a0 K; ]1 [, i" zM:针对微控制器
8 u. `/ m1 I) E& O/ B! |! k+ d  m  H/ G7 Y8 X0 Y& O. o7 t9 g. g( Q. K

) N. ]$ ]: i, I  D8 K8 K3 o/ @3 z
STM32F103: S; M5 f$ ?3 \8 c1 [
STM32F103资源
4 x7 S) m; P' T/ c
64KB SRAM
# b3 w2 R- [& k, L512KB FLASH6 \; t0 S, [- F9 j5 |
2 个基本定时器、4 个通用定时器、2 个高级定时器
* s0 I7 h" ]5 A4 {3 E# j2 X; c2 个 DMA 控制器(共 12 个通道)  b8 K4 P  P5 S- m. b  D! C
3 个 SPI% a1 i* X3 ]4 u" ~: R, D4 ~& G- g
2 个 IIC
4 `7 G9 r* ^  b" a* R1 m5 个串口
" E/ [) p+ C" D# T1 个 USB; j) k: d! E# J! m* h9 K! P% L7 d
1 个 CAN. a* f! d# j/ t0 {) c8 S+ X
3 个 12 位 ADC、1 个 12 位 DAC
# \4 X2 |- B3 T7 s& g( J1 个 SDIO 接口、1 个 FSMC 接口9 M, ^) [- v8 E8 a! b0 Z# y# h
112 个通用 IO 口# C5 Z7 f! `  E7 k0 N2 I* u- f
84个中断,16个可编程优先级,任意脚中断  L1 B; h8 t5 @
带有外部总线(FSMC)可以用来外扩 SRAM 和连接 LCD 等
" D$ `  s* r# B6 x, [2 |9 @& g
STM32F103总线架构- L1 N5 i/ |* S0 Z2 m/ Q; h3 ~

% W5 k, B# D  K7 u" x
27ecd0679a774f6eb408a2d88a243bf4.png 9 V! q& I+ r% c+ d7 Z
6 R/ ?( r5 A1 i2 e1 k
四个驱动单元是:
" O% N1 `8 r$ W: |* J0 H内核 DCode 总线;
8 s* d1 X% r% x. u; F( U该总线将 M3 内核的 DCode 总线与闪存存储器的数据接口相连接,常量加载和调试访问在该总线上面完成。
6 u, a0 R- Q/ P3 v. n$ s( N
  |# \3 @  K6 c
系统总线;
5 J& r9 P' u# r1 M% P( [系统总线:该总线连接 M3 内核的系统总线到总线矩阵,总线矩阵协调内核和 DMA 间访% F3 r+ I- ^5 l; I
通用 DMA1;  R: @% s7 z7 J. w- q7 i
通用 DMA2;
9 X6 x# e, d4 g1 k, a# D" b1 oDMA总线将 DMA 的 AHB 主控接口与总线矩阵相连,总线矩阵协调 CPU 的DCode 和 DMA 到 SRAM,闪存和外设的访问。0 ~5 v3 `( j' I" `  U
! P  i% A& f+ ]. q
四被动单元是:
  U, |2 X9 h+ g4 y9 OAHB 到 APB 的桥:连接所有的 APB 设备;2 z1 Q% a; ~% n9 E
AHB/APB 桥:这两个桥在 AHB 和 2 个 APB 总线间提供同步连接,APB1 操作速度限于36MHz,APB2 操作速度全速。
0 I* g5 ~5 }( j* _* b8 B内部 FlASH 闪存;# D% a2 [5 w% l7 O7 ?
内部 SRAM;' U0 c: O3 T. m. A
FSMC;
# n. `5 b: Z) a+ k+ q0 t9 ^
+ N" d* c; }+ |* c) V5 p
总线矩阵# D# R7 U) o6 z3 E1 z
总线矩阵协调内核系统总线和 DMA 主控总线之间的访问仲裁,仲裁利用轮换算法。
  i- t9 J2 ~6 O
3 n1 H3 m! E6 T7 w6 e$ K

. o: e( @  ?: V, C0 }2 OICode总线
% d4 W/ J3 g3 n  W该总线将 M3 内核指令总线和闪存指令接口相连,指令的预取在该总线上面完成。
; f1 ^4 p% _1 \$ g$ _' y
% i$ m- O2 i  R! h
STM32F103引脚
* [5 [5 \4 W% }* ?# L7 @
! }" |0 k) v. R8 A, l
c12482a9adc544049b51393d36a6b7ca.png
/ P2 N+ O' R# ~9 r; c: e# e0 K( Q( z) \9 T$ D/ y
& \/ x: `- ~. Z. P; _: |
STM32F407
: S: Z9 u& f  f芯片

. d9 s, f: B1 n) Y* ?/ Z, z9 N: U% c  N+ X+ M
6b2eca12d5dd4d73bfa616c4e5c48b82.png $ H0 f! l) K! K$ M2 j+ X/ H5 j

: ~6 B  k+ v0 t; d' P* ~  W+ a! q

: N3 |7 B7 z8 o7 V( V( kSTM32F407资源. G+ [, A  U" t4 P
1.内核6 \& E) q9 L' q* ^  D, u5 X
     32位 高性能ARM Cortex-M4处理器6 |3 N7 e2 \: j0 T: H* n
     时钟: 高达168MHz,实际还可以超频一点点
1 P& I- z7 ~" V; h# s6 U4 [( i3 r  L     stm32f407的主频通过PLL倍频后能够达到168MHz,而且芯片内置一个16MHz的晶振和一个32KHz的晶振,可     以满足不同功耗的需求。
) v; b. Z5 V. ?. Q2 x8 {& {3 _   支持FPU(浮点运算)和DSP指令6 X' t+ S1 n' I' J
2. 144引脚 114个IO口
, I2 _/ U% T1 c, f: l% l3. 存储器容量: 1024K FLASH, 192K SRAM' u% ^* o9 \& K* H# E  }+ `9 d0 e% M, u
4. 4~26M的外部高速晶振/ |1 w3 v1 ?3 \: `% {  b
5. 内部16MHz的高速RC振荡器, f* f# ]! \4 N& Z: K
6. 外部低速32.768K的晶振,主要做RTC时钟源2 [# Y4 N' E) H& O
7. 3个12位精度AD[多达24个外部测试通道]5 @3 k6 R* A0 C# g  R3 D# s

- e6 B2 K$ [7 d8 W1 B
f74275118035421db44b5821f8b6f1d7.png
3 Y- ~8 ^( J- M3 `$ s% z5 d
$ H! W: _, M, ?- w- P5 j/ c
8. 2个12位DA
; Y/ l5 `' Z7 s7 v* f, P: O8 x9. 16个DMA通道,带FIFO和突发支持
/ w  \2 K! A* v' w% k' o- L10. 定时器多达17个. {- e" i/ o8 I
     10个通用定时器(TIM2和TIM5是32位)- E* _: J) l6 y
     2个基本定时器# T& K9 ]. `) c( J6 m$ S
     2个高级定时器$ M) b5 u4 z/ w/ g: e
     1个系统定时器/ ]2 b% q( [2 J! b# x
     2个看门狗定时器-( |8 d8 ^$ @! G4 X5 a
11. 个I2C接口
0 u: B0 @4 U( t) A( q* h! k0 d12. 6个串口. |0 P) a& S' o; W) W) K& V3 ?
13. 3个SPI接口9 p: r1 y8 {4 P8 a
14. 2个CAN2.0
5 y' N2 t3 w* L8 G% W6 X15. 2个USB OTG
/ c  [# ~: R: S1 ^16. 1个SDIO
6 e. L( |0 Q) u4 I" E. T8 i
) Z; T" a# r/ P0 `, T
F407总线架构
9 f' }3 a; \$ Z6 b( I/ ]# }- f6 N+ I! |
& W; M' z+ }. `7 R4 W* r
70e4e8adb9594b68a219033936d23da2.png 2 m7 k- m/ q+ S7 S4 \

# E; |3 z+ v1 }9 r+ v  R& V- g主系统由 32 位多层 AHB 总线矩阵构成。
- z) M! v+ f& v8 B& A总线矩阵用于主控总线之间的访问仲裁管理。
' ~% b' W0 v+ z仲裁采取循环调度算法。
9 H: y( |6 c. D( a总线矩阵可实现以下部分互联:" a+ ~# C* i8 b$ S% Y: H5 y
八条主控总线是:
( i5 v1 b# [% q/ q( q* Q$ u& p     Cortex-M4 内核 I 总线, D 总线和 S 总线;: Y" @6 K* K2 R7 k
     DMA1 存储器总线, DMA2 存储器总线;
) P: i) j: o# v6 }- [/ w2 s! W     DMA2 外设总线;
6 c" y( k1 Z5 S     以太网 DMA 总线;. z8 q) @9 J6 M5 h$ @3 @5 g
     USB OTG HS DMA 总线;4 j) T" N% n0 w! F4 I$ b. d9 H
     七条被控总线:
  R" b( Q5 _2 }0 ?( Z2 x     内部 FLASH ICode 总线;3 ]( q  y% m8 ?4 W# z  B$ D( Z# Q3 E
     内部 FLASH DCode 总线;
$ ^. ^( h2 W9 {     主要内部 SRAM1(112KB)
# y; R: e. \. y) F  B. O: \     辅助内部 SRAM2(16KB);8 H- @' c" m# _. ~/ P/ Y$ T& @
     辅助内部 SRAM3(64KB) (仅适用 STM32F42xx 和 STM32F43xx 系列器件);
' y2 ]* m7 f! g+ ]/ s     AHB1 外设 和 AHB2 外设;
. o% h: N& @8 P  o     FSMC: O, R. |/ s7 q! X

. H8 P; }4 @& b2 \
STM32F407系统框图2 ?: s2 V# T8 q: _: B6 O) |! h

5 G9 X8 W) a+ E2 T) r$ g- m  j
4a948e572c854f37b77ada4b5c44c2f6.png
+ V! F- p- x' }$ f2 w. z ffd3d807d44a42bdb280e4709ac05dab.png
7 ^& T% I. P& k* L. ?" ?1 R9 E- A9 ^: _

/ z$ A# n3 M+ `- \) ySTM32F407地址分配
) K9 f* w1 @, N+ U- p1 J; {# K' N& w7 p3 I7 q  G! Q. n
d88c0050784845c3abbdd5840b0cebae.png
7 h4 X! D6 u0 V1 Q# j1 ?
7 G( D0 x4 L1 y; b# ]& L. [# D
0x0800 0000开始的flash,从0x2000 0000开始的sram这两部分,其中flash是我们代码烧录的地方,sram是我们程序执行的内存地址。) I" t# N. T8 P, v* p; Q* s1 I

' e. y/ |) F  }4 B5 q) ]' _# |
4cba640d926b4091b683c3ffcdbdd97a.png . ?. U  `0 N, B9 `8 \+ }% C6 t$ c

8 e  H8 k7 v- j8 f* o3 l6 U# iSTM32开发1 _8 v& h( C4 G/ B% K
固件库概念
6 ?) R/ T9 b5 y% jFWlib叫固件库,FW的单词是Firmware.即固件的意思。STM32的固件库包含C文件和H文件,主要用于存放STM32的一些寄存器的定义及一些底层驱动函数; C  Y( X' `0 I* U) {5 S* y

1 W5 l6 S* l9 B% f容量* F7 H- G) [( a5 Q2 K8 U
对于 103 系列,主要是用其中 3 个启动文件
; g% ?7 [9 V$ e" r' D• startup_stm32f10x_ld.s: 适用于小容量 产品,小容量:FLASH≤32K
* _# }4 _# U" h4 @• startup_stm32f10x_md.s : 适用于中等容量产品,中容量:64K≤FLASH≤128K! ?- [# [, K5 h  l  M0 S
• startup_stm32f10x_hd.s: 适用于大容量产品,大容量:256K≤FLASH" }4 i/ d2 L: F" V/ ?
% r2 X$ D; M5 l; W% h' g6 G
STM32启动模式
) ^2 P. G& R7 s- B7 k0 EB0 B1 启动模式
/ x# |" R: p9 h* z0 X 主闪存存储器
( c( a$ T: X( Y& |1 0 系统存储器( Z) V' m6 `5 z$ h6 P3 [2 b. n
1 1 内置SRAM
$ j3 S* w5 N3 T1 ^2 Z  M. A+ z9 L8 O+ A4 m
STM32软件
2 \; y/ p: \8 G( l- ~4 AMDK介绍
7 @3 h/ y3 B1 U/ n. P* L• MDK是keil公司开发的,为基于Cortex、arm7、arm9等处理器设备提供的一个完整开发环境。; I6 k8 D  I, z+ g1 h8 \
• MDK(Microcontroller Development Kit,字面的意思就是“微控制器开发套装”)。
" R$ _* w* D8 W2 B( T; d8 O9 L& z  R! P$ A
MDK安装
7 V0 L1 S- y& ?; N, r, E& @o 在软件资料,1,软件,MDK55 U5 b9 S) w" ?0 C  L
o 无脑安装" G3 |8 ]) H) o. x  `# w4 X' ~2 S
• MDK5破解9 ~: q( p1 y; T' A, E
o File license Mangement 复制CID) C! f/ {, Z! S! J4 h$ j0 R
o 在keygen破解软件中运行CID 得到秘钥,记得选择32
2 H3 O3 G/ N  `/ l: ?o 用管理员身份打开MDK5,再次进入license Management 的New ID Code粘贴
" |7 b- ]$ U( M# d1 G4 l
5 F; `- W. _, O" B5 I生成HEX文件
. W: i# s) r2 N+ l: w, b点击魔术棒,进入配置菜单,选择 Output。然后勾上下三个选项。 其中 Create HEX file 是编译生成 hex 文件,Browser Information 是可以查看变量和函数定义。
8 ?0 F; y8 G- T9 R/ x) u& q! X0 i% ]% N
a50be04942464ca39ab9d3014f6ca9d7.png
- A) V" s' N( m3 v5 m0 G- Y- j( j9 ^6 X) i. K
+ Z9 H* P9 v7 u; ^8 s
支持包安装6 S% e$ U8 {; ?- ?
9 i. R6 p6 W0 L/ c
42f597d8d6fc487494572065fa5dbcb1.png
& N& C( Q+ l! a' r# R8 C9 i" s# _  r* z! T+ W; R0 Z7 @
可以下载软件,Keil.STM32F1xx_DFP.1.0.5.pack7 c0 d- O& Z* @+ e/ V  I
双击安装
3 a% v1 N" d  t, `
& d; H2 k1 a, P! Q% J$ O/ j2 ]3 i' @添加宏
9 Z6 Q' d1 N* T8 _* u$ o因为 3.5 版本的库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配置一个全局的宏定义变量。2 S$ N2 q* b; }- k( N  ?3 V, q
c/c++界面,然后填写“STM32F10X_HD,USE_STDPERIPH_DRIVER”到 Define 输入框里面
# C$ L9 T$ o# T' o7 B) |/ R/ t如果你用的是中容量那么STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD. 然后点击 OK。
! L+ U" T. p+ T3 b. E$ W. a
& `$ {; X+ [& p8 n- l
30dc47b1a09c4153b815865b512d798f.png 5 K6 U$ M/ k) b
3 M5 n. m- I, G

4 t6 G3 A" u5 p: }* Z1 w添加头文件路径
% l% p  K' ?7 Q# s对于任何一个工程,我们都需要把工程中引用到的所有头文件的路径都包含到进来 。- Y/ J; c3 E; g4 o# U: T/ d' Y
点击魔术棒 ,出来一个菜单,然后点击 c/c++选项.然后点击Include Paths 右边的按钮。
. }2 X" J0 C8 C8 a/ [5 B# ]弹出一个添加 path 的对话框,然后我们将图上面的 3 个目录添加进去。2 L+ \2 e+ P5 W6 K6 |% v
记住,keil 只会在一级目录查找,所以如果你的目录下面还有子目录,记得 path一定要定位到最后一级子目录。然后点击 OK.
. s9 J) e8 l7 ~7 z- J
7 j1 K" Q+ c/ ]! {. V; ]) V
aaea2d7fc0834aac9f839be314376013.png 7 \9 M: V: X- r* v
9 v9 O3 g' k7 ^. s7 b0 q

0 V  Y6 P$ j4 P$ E库函数选择外设
4 L$ X* E  i: ]2 l4 {" j5 o2 a: M3.5 版本的库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配置一个全局的宏定义变量。) A: p8 z' g& U5 M2 q8 `7 O
c/c++界面,然后填写“STM32F10X_HD,USE_STDPERIPH_DRIVER”到 Define 输入框里面8 \  A3 w" x+ Z4 a
7 ?; D! p4 J. {5 E8 d8 ^* j1 g& L, N$ V
144affc28ecc468ca38a8d1b585d5a93.png . c1 |1 L2 U2 q; m

& X: a" u" W& v+ A' m如果你用的是中容量那么STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD. 然后点击 OK。! c2 E7 w( J8 }1 z) G

) _/ B, L1 G- W4 f7 i1 N8 f: g* R  ~+ I1 x- d: }6 I4 j
编译输出4 ^( u7 Q# v& _0 [2 V

5 T; i+ A* i6 E2 O, x3 `) F8 H 0fa64c7b3805431da4f76475ca418abc.png
0 y. [" h( Z/ x, H* i# G编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。- V5 R( @/ Y6 ^" v) i
方法是点击魔术棒,然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面新建的 OBJ 目录。
$ k& [: E  p6 j$ }; P9 Q* {这里大家注意,如果我们不设置 Output 路径,那么默认的编译中间文件存放目录就是 MDK 自动生成的 Objects 目录和 Listings 目录1 \2 V4 I$ ^' a6 L9 o) s

6 S" s% ?+ b9 }2 m/ F) z第二个图标是全部重新编译按钮(工程大的时候,编译耗时较久,建议少用)
# o. Q# |# i4 E/ Z+ F9 N2 ^% J. D4 K' P. q5 a! L% {) J

4 J0 |% d( X/ m+ @  i6 [  S编译成功
: c, g4 M; T3 @9 J! E2 [1 ^
" \* Y; y  X/ J, o1 i4 D
b9e7aa4cbd63444886bcb1536206648c.png
3 M7 d( l/ ~- i' q# ]
4 Q* J  I4 P- r* M从编译信息可以看出,我们的代码占用 FLASH 大小为:5 K% I8 L5 l: v( o2 K
1892 字节(1556+336),所用的 SRAM 大小为:1864 个字节(32+1832)。
  U3 G1 R( h/ w  {Code:表示程序所占用 FLASH 的大小(FLASH)。/ K) x# r- A  I6 _5 N0 N8 `1 J
RO-data:即 Read Only-data,表示程序定义的常量,如 const 类型(FLASH)。4 s( y, {$ R$ {) ?2 k
RW-data:即 Read Write-data,表示已被初始化的全局变量(SRAM)
7 ~9 u: W& L/ A0 F% i2 O/ BZI-data:即 Zero Init-data,表示未被初始化的全局变量(SRAM)
' t: g; Z' {& a: E$ O- H% P8 B
7 v. ~- c/ @% q* a
1 d$ ~% V  m( T* m( ^
flymcu使用
; {( `' `6 B  S. M8 T3 K  Z串口下载软件
: a& d& Q& |1 I6 r- aflymcu,该软件是mcuisp的升级版本(flymcu新增对STM32F4的支持),由ALIENTEK提供部分赞助,mcuisp 作者开发
, L' X+ X3 u: b$ M0 e3 q' P/ X
1 u9 }# p2 \2 U' z3 a! N
a1087e443fce4edc80b18c9d2938034b.png 6 r$ p- z+ J2 p6 \! ]

* T: v( W+ Q* P6 x$ D6 y8 p特别提醒:不要选择使用 RamIsp,否则,可能没法正常下载。
' W" e4 r( `6 fDTR 的低电平复位,RTS 高电平进 BootLoader; M8 f* B$ j9 b" x2 a) m# q
    选中这个选择项选,flymcu就会通过 DTR 和 RTS 信号来控制板载的一键下载功能电路,以实现一键下载功能。这个是必要的选项(在 BOOT0 接 GND 的条件下)。4 [7 o  R2 k3 B3 A8 Z) f' W
9 E! e& H( a4 @3 l
) @/ [$ y( v9 T: v0 n
ae9572dc24bc4518b9818d422c7b1a7f.png
8 J: j" V7 A  @+ j* |. Y; X' h1 Y; |
9 j$ X1 r. Z. d/ m
第 1 个圈,圈出了 flymcu 对一键下载电路的控制过程,其实就是控制 DTR和 RTS 电平的变化,控制 BOOT0 和 RESET,从而实现自动下载。) C4 s/ S. a* v# J, G( {

6 N6 Y0 A4 r' P2 B( b( p

% ]+ E+ G8 |) w9 w0 S; z8 g7 F* mXCOM
' |2 h& J9 \% h. R: f串口调试助手,直接打开,设置串口即可(程序中要通过对应的usart发送内容)
% w. n$ `- l2 b* A
+ J. ]: k/ [1 p/ p7 ]2 d
01cf35fba0a240d79b7c70e268e10471.png
' D. u8 A6 q/ l8 n! e* ?9 k2 a6 m' c7 Q2 w! J7 F8 W/ w2 z
) Y+ p+ d* ~) x; u: G/ @
程序下载电路; G5 j0 y- b+ X( O; |" _, m
5 q1 ]" Y( ]# f; g8 ?
ad1c6a36bb524c1787bf0ef95cbe5ecb.png 8 s; O" _+ i+ p+ Z
1 c  D  Y* U/ p9 a
USB 转串口,CH340G,是国内芯片公司南京沁恒的产品,稳定性经测试还不错,所以还是多支持下国产。
+ A% E/ A6 O4 \, W9 Z0 s7 @首先,mcuisp 控制 DTR 输出低电平,则 DTR_N 输出高,
( c) ]: n) \( L3 |, u- R: w( Y" w然后 RTS 置高,则 RTS_N 输出低,这样 Q4 导通了,BOOT0 被拉高,即实现设置 BOOT0 为 1
) V6 b6 C8 B" H同时 Q3 也会导通,STM32F4 的复位脚被拉低,实现复位。6 O( v& K! ]6 f
然后,延时 100ms 后,mcuisp 控制DTR为高电平,则DTR_N输出低电平,RTS维持高电平,则RTS_N继续为低电平
: H, ^- }1 v% }  C此时STM32F4的复位引脚,由于 Q3 不再导通,变为高电平,STM32F4 结束复位) L+ X/ ~- l5 y3 ~1 N- ]. ]; o) m
但是 BOOT0 还是维持为1,从而进入 ISP 模式,接着 mcuisp 就可以开始连接 STM32F4,下载代码了,从而实现一键下载。3 k& K! o: w, @/ b

# E, P% _. ]# P, P5 s& Z
STM32调试7 \7 m: {* T9 V5 s9 {/ `  x/ p
JLink
. Y% C& G! \$ U0 V* a
JTAG与SWD是个接口,JLink指的是仿真器
# l9 a( p: b0 }0 t! X7 v; ^串口只能下载代码,并不能实时跟踪调试,而利用调试工具,比如 ST-LINK,JLINK 和ULINK 等就可以实时跟踪程序,从而找到你程序中的 bug,使你的开发事半功倍。
6 h2 {; S+ p( W6 |# X+ u8 k; p; E4 x$ U2 S
e9c7d44024314364ba876622ac325d0b.png . p, }% W- D( m) d6 T
# i% x7 r. ]  }. \& B* c
6 n/ O9 b7 o6 G0 J0 l
JTAG/SWD
) \. ]' |8 ~8 I调试原理
4 C" j) m# b# W; c
, t* _' d$ ~- R) i
cb03688967b64f72b16c25ab780e17b5.png
/ H4 N5 m- S1 l" H( G

2 S: l, C! E+ h0 [' T7 k: k0 ?串行接口,就是SWD,通信数据线两根# k+ |2 t5 W( M6 o5 F7 a' G" a8 f( V8 e
JTAG,通信数据线五根,所以用SWD多* {& z+ @* s  H; t' g3 Q

+ L- d! p8 z4 \! O
7a1fc4e5199241a498a22c0f2b700eb4.png
* T  ]. T4 D8 b5 m

; |' U3 ?: Y6 A9 d$ ?使用SWD的话,只需要SWDIO与SWCLK两个引脚。
& Z/ k0 g3 b: z. X! H$ k2 z4 K  f使用JTAG的话,五个引脚都要用到。6 b8 p9 ]  S2 x9 I

) l6 [0 v  [) Q. |3 B
) ?* h9 Y; }* f6 W9 n3 \# n8 d: Z
SWD与JTAG的端口映射) E1 P# U' S7 a8 R
' H2 t' y$ `4 G; Q, {( \% s
de51a5d1541442128d3ba9f08712e050.png ' A! D& |; V0 g1 W$ ^% R
, S( Z( d" K# r  E
默认的五个口不能作为IO口输出
9 j- E2 ?5 s  g6 Q5 q
) F; h- }8 p! z' i
b5370415599e48839552593cc3341a5b.png # s* l, Q5 Z, z; A: r: T
2 ^5 B& t5 k- Y6 q$ g
认这五个引脚复位了之后都是用来仿真的,是不能正常使用的,只有禁止了相应的端口,才能释放IO引脚1 e; U; m3 X4 K" z) T/ ~: H/ d1 a
' Q  p( {/ a. z! r

1 `  {( O+ h9 ^  {' {6 b; uJTAG/SWD硬件
* l6 W5 J5 ]2 h& C& u: u; I6 j

3 m" |+ O# `5 ?8 L6 [
f6e4d0c95c584a569db70eafbf703150.png # V+ o# o$ m, }' J
7 c! o# J/ ~( h8 b- s. {/ m( i
STM32 的 SWD 接口与 JTAG 是共用的,只要接上 JTAG,你就可以使用 SWD模式了(其实并不需要 JTAG 这么多线),当然,你的调试器必须支持 SWD 模式,JLINK V7/V8、ULINK2 和 ST LINK 等都支持 SWD 调试。3 y* L9 a9 b$ S! Y$ C3 y$ [

& B' [- d3 k) g- p/ ~8 a2 x3 Z
0 N  L# Q3 f' P. L, u7 R& I
设置禁止JTAG
4 h3 |3 W$ K, Y+ p(在文件stm32f10x_gpio.c中):调用该函数,有三个选项。407没有复用概念。" S6 d+ z; M% S# W7 j4 L

- Z, H5 o/ z5 c3 d/ L7 N
  1. void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
复制代码

  U$ X* d1 m3 D" m- v  oJLink配置
& J. R7 G3 Z  N; b) l  V! p/ n魔法棒-Debug-JLInk* \: t2 y  v2 l

/ S! ]9 W5 p7 m3 C; e& L" H3 l4 W
c4663826d5a443c08f62a38253b9ee74.png : N- z. X1 s: \( d
4 i- b7 u# g5 F" T' Y8 O/ Y8 {4 r: [
上图中我们还勾选了 Run to main(),该选项选中后,只要点击仿真就会直接运行到 main 函数,如果没选择这个选项,则会先执行 startup_stm32f10x_hd.s 文件的 Reset_Handler,再跳到main 函数
+ \3 ~! l0 p+ N1 Q$ K$ C/ |; U6 }  V! U0 ~* S' x6 ~# U$ W. R3 X
setting JLink* {4 P: N( _0 z& O

; Z& |- p3 R. k/ k" f' k$ f
f7e9b5e7c43a49a6beae213effd0b86a.png 2 p) J% z5 T2 e; L/ M, }

; y" X& \% }& |4 T/ S选择Jlink的时候一般选择10M,JTAG5M就可以了' d, f  Z% x$ W: d2 J! F! t7 Y
在 Utilities 选项卡里面设置下载时的目标编程器
+ Q2 ~+ q% D0 Y; y1 J, d, Q2 ]0 z6 f8 T  N5 [( V
bc6454ca1ad54d388d5e53df82cd2e54.png 4 J- \; b$ o7 y6 O! d; Q+ i
. V1 A. p) a; Z9 B4 l+ D& w
进入 FLASH 算法设置Flash DownLoad,在setting的右边两个按钮  i+ [1 e! d, H5 H
. g$ C) e: [+ k& u8 d
8e58f1d3d59f437babee5646575773ff.png & |9 Q- r7 ]" Q! q( a

0 \) R  h) [& L* G设置完之后,点击 OK,然后再点击 OK,回到 IDE 界面,编译一下工程。接下来我们就可以通过 J-LINK 下载代码和调试代码。
# g" o* ]- A8 J0 z9 Y% J只需要点击 LOAD 按钮就可以进行程序下载。4 o( N% t) V, k; I

: E8 P4 l' b: L/ K; ~; g3 W. G
0792c9d0beb747ce9c94bebbb965a23e.png
) K* N) X4 N  Q7 @& c. L- E! O3 d2 ?) x% \& H% d
731d1242ca5444e8a2bbf162f2ffac33.png
* ?1 l' N0 x% R, k+ R8 U- |9 r

' K+ l, O2 K. Y 99e551f06504475280fee0ada2534c17.png
4 ]+ p8 n# x( I- Q, D
3 f& q; j1 v0 c 29f43a570fc6412a81c5c06f3055bb4f.png
. X% u+ y3 x' h) a
5 s3 ~$ n% n7 f: h
; M5 T+ l1 c3 w, _, ]Debug介绍. J1 Z5 B. R% J3 J6 ~9 ~$ ^0 S

# Z9 I8 v. H; L6 a3 i. [- `
3e04cac123054bfa80c7c06f6d01b2dd.png
, M3 A# b6 h  ~/ ^( A* ]
: }! U3 Q( R& \/ R
' B# @, v0 s# m! t' u
复位
/ s6 W, ^$ o5 F# P  Y其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。4 u/ S8 X6 j+ K' V

  [- M4 f- P# H- g% }5 T执行到断点处8 ]4 s$ z' u' F- [. ]
该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。8 E6 v6 l" @3 h( o; A  B7 r0 b& d

, U' b" j% q! T, Z挂起

  U8 p' W/ J% b( e  [此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。
+ P6 r5 Y" X; q6 j6 c6 M$ r
3 c* A% V6 ?' O8 H  p7 }, o执行进去/ J, @( x0 w( n' S( m$ z7 Z. g
该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。" X6 p& o, E9 w3 y: j, E" T, b- W

9 F. f2 G5 t, C6 O: ~9 h, m+ B执行过去! x* Z% O2 i: X8 v: p2 T
在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。
' h( B1 @# |) M9 p! _1 I  w
0 Q$ Y' C8 T9 @2 J; [' r# d执行出去) S! O: _6 b+ q8 Y
该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。
  W5 e2 \# Y5 o6 D3 X
7 ?  ^& f9 u% C6 {
执行到光标处
& v8 U. c9 i6 W( ~+ q- r该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
  K) h8 f  t, x7 \8 b  O1 X6 W
  A2 g! I! x  k
汇编窗口
2 \8 F: Y* W* e1 B/ x- b通过该按钮,就可以查看汇编代码,这对分析程序很有用。
: \1 R) t/ t& Q1 Y8 Z$ V8 @7 p0 A4 Y
观看变量/堆栈窗口
2 ?9 c8 J# N5 `$ o8 @该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想要看的变量值,也是很常用的一个调试窗口。4 h  E4 c( s5 A" a1 X' B  I
" C; J# `' m/ X4 R. \" s0 i
串口打印窗口' N& w, e; o5 \9 \+ \$ @3 o
该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。
8 K/ w* D3 {4 o$ }
, U6 g- Y% y  N$ q  g6 [6 t2 }
内存查看窗口4 Y3 |) w# k3 Y
该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口
4 E$ {; [9 W! G8 N
% `# u2 s+ m, i6 D* ]
性能分析窗口1 r3 C6 n3 M9 {# X8 k# a) I
按下该按钮,会弹出一个观看各个函数执行时间和所占百分比的窗口,用来分析函数的性能是比较有用的。
1 ?# i6 [5 |) l9 U, i6 c) R; n; {: [1 [
6 r  E& V' R! Q+ G
逻辑分析窗口
' R& P1 K! z6 j' |1 a3 f按下该按钮会弹出一个逻辑分析窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。
2 e* G. \; J- ]* j7 P8 ^点击 Setup,新建两个信号 PORTB.5 和 PORTE.5
, g2 l7 x+ l5 c6 b1 j/ A# {
% s. r: G3 X% |2 ~9 k* r1 r
0111334d656c4c6b813fbe803bc9534a.png + i& Q# }3 I' }3 [7 b

- k0 L; B  n0 S4 ^Display Type 选择 bit/ _; E0 H4 d: T# E( t
8 I% @+ W$ I+ M" ^' `) Y; C
4b330fc96d63408d864701f044caabea.png
% `5 Z7 |! @+ k  I. b4 {# e. @  B3 G* d. U5 x8 }% y
461f7da0296a429dac3ea7c0ec479c9d.png
5 ^0 h  Z5 D% |  R- I( W5 `8 [" S
56ba88779b7842aabfc652ae961904f9.png # Z# w8 S8 z* f3 A9 t- _3 g

9 g3 `% [, e* {8 E# s$ k注意 Gird 要调节到 0.2s 左右比较合适,可以通过 Zoom 里面的 In 按钮来放大波形,通过 Out 按钮来缩小波形,或者按 All 显示全部波形。+ r. s" Y# i" S4 g, F7 _, r! j% Z
————————————————, D" {4 E0 A" B. t! t: m3 d" W. t
版权声明:32码奴
+ u: e% B4 O3 t- S: V2 s  l9 z1 F2 n4 `! l0 r7 I4 y/ w

4 k/ _+ N' S8 k: [! K
赞 收藏 评论0 发布时间:2022-12-7 16:03

举报

0个回答

所属标签

相似技术帖

官网相关资源

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