请选择 进入手机版 | 继续访问电脑版

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

STM32的介绍及MDK

[复制链接]
STMCU小助手 发布时间:2022-12-7 16:03
STM32介绍, X& H4 y/ g, S/ U8 M8 B
STM32命名

* d, g( R3 X6 V* ?. M: g+ P2 f0 `  d
8 W$ l7 D4 j5 r4 [! q+ l
12653000fe564c22afe461e474f54967.png
7 j: m. I& c5 A* p: X) O6 e% i& L3 ?# E' |4 ?6 z9 t/ k

, x( q' B+ f. J1 o' b, iarmV7的三个系列. @/ U) x/ \6 u( |$ K
A:针对操作系统9 U5 i, C2 z4 ?) P
R:针对实时系统
( W7 F* g1 Z4 m/ g7 WM:针对微控制器) R) q5 L3 j2 m1 Z7 ^- D5 F5 i

+ g6 ^4 |, A: i- y  S4 c

7 r& n& n. s) O2 |: A
STM32F103
$ R) K- Q$ b2 j# E! e* \STM32F103资源
" j4 o9 V$ J0 o+ ]' V4 r% S  a% c
64KB SRAM
& A2 E0 p% {' e2 n, X! p! X3 M# s! k  T512KB FLASH! v5 z; p# k: O* A
2 个基本定时器、4 个通用定时器、2 个高级定时器( H% Y, a3 B7 `% @+ r# J% P
2 个 DMA 控制器(共 12 个通道); q2 h: _( }! P& ]7 r
3 个 SPI
$ @+ G/ f0 ~1 b3 P2 个 IIC/ o0 K. v5 A4 _' {
5 个串口- h3 Y; Z0 b$ T# w% O9 M. p+ ?
1 个 USB: i& w) a' f- n0 m- U- x
1 个 CAN
7 ]; h" r1 p) P# u3 个 12 位 ADC、1 个 12 位 DAC
4 `" ^0 d7 O% B1 个 SDIO 接口、1 个 FSMC 接口" J/ c, L. K0 g( X
112 个通用 IO 口
" y. L3 I3 _' m, O* H84个中断,16个可编程优先级,任意脚中断
  A" E7 {7 b. T2 h! P带有外部总线(FSMC)可以用来外扩 SRAM 和连接 LCD 等8 f3 E' o8 n$ x. m+ W) B! [( `, Z
STM32F103总线架构
* Y6 ~+ `, D( Z# A) |8 {
. A/ k5 X6 M8 ^3 j* ]
27ecd0679a774f6eb408a2d88a243bf4.png
& J+ H: L9 p. h; j: c: H1 F4 v1 N0 `5 L" b/ p% P5 F  B
四个驱动单元是:
3 F$ N& [$ H, g. F- ~内核 DCode 总线;' y% A( r5 y' o1 g! U& C3 \
该总线将 M3 内核的 DCode 总线与闪存存储器的数据接口相连接,常量加载和调试访问在该总线上面完成。
: q0 }+ [8 A  f" u* C9 G# a, Q

- l& O( W0 T* z系统总线;
: C5 l, |* z7 b; l3 M% \6 p7 @5 Y系统总线:该总线连接 M3 内核的系统总线到总线矩阵,总线矩阵协调内核和 DMA 间访
& j3 ~* W; P& ~2 M: L  d通用 DMA1;
3 C4 |+ D0 i5 L7 h% x6 m  S! z通用 DMA2;
9 W; _) \3 w5 _" @$ l' B+ wDMA总线将 DMA 的 AHB 主控接口与总线矩阵相连,总线矩阵协调 CPU 的DCode 和 DMA 到 SRAM,闪存和外设的访问。
8 A! S. N6 s6 L" ?8 D6 k8 a/ j3 ]  O
四被动单元是:
& v; J& L  o1 l# f4 A3 P- k* IAHB 到 APB 的桥:连接所有的 APB 设备;) a6 D8 p! ~0 t( n' ~
AHB/APB 桥:这两个桥在 AHB 和 2 个 APB 总线间提供同步连接,APB1 操作速度限于36MHz,APB2 操作速度全速。  H: O5 w0 u0 b; H$ v1 u7 X
内部 FlASH 闪存;( w* R$ G2 M. _9 k/ Y$ ]7 N
内部 SRAM;
6 \) {" f# s( gFSMC;/ r) U0 h7 H, G. S$ E- X' B( B
4 i4 a7 n/ _1 _! u6 E# B$ ?" F6 `6 n, Q
总线矩阵
& o8 v. f; ?# o. U! C5 [总线矩阵协调内核系统总线和 DMA 主控总线之间的访问仲裁,仲裁利用轮换算法。
& J: x$ v$ Y1 c7 q& y$ N, ]' Q) |; r. t8 e

  @& k  c( e' m" x! Q! v' DICode总线3 |( O" u, S& w* K& |
该总线将 M3 内核指令总线和闪存指令接口相连,指令的预取在该总线上面完成。
  p- e, Y( ^1 I2 j' ?9 S6 r. b5 `6 ~# k. }8 p' s
STM32F103引脚8 G( c) c  h! ~8 E+ |

  R8 B. x+ ]6 k# A, M8 G% Y2 `
c12482a9adc544049b51393d36a6b7ca.png 9 H! b4 X/ I( E9 j5 d: `2 f
4 Y& T3 H: `' o# {0 ?1 `  E4 |

5 F9 i/ j  a% u8 V' X
STM32F407! S; C! _# H9 d+ q3 d- w# H
芯片
1 z! T  N# F5 A6 X' c
3 f' K/ W: J1 \  I! Z: Z
6b2eca12d5dd4d73bfa616c4e5c48b82.png
& s9 @0 U  ~" e0 D' n9 W9 }
  R. Q; _% B5 o2 u6 ^# @2 i, ~
' v4 W' `, Q/ g1 q  }3 ^0 D
STM32F407资源! H5 j' A) P5 W, l9 P
1.内核
- S9 U% j) f$ s+ Z     32位 高性能ARM Cortex-M4处理器- h% `2 `3 f4 y3 Z  V, O
     时钟: 高达168MHz,实际还可以超频一点点
# I. B5 V; b2 g& c     stm32f407的主频通过PLL倍频后能够达到168MHz,而且芯片内置一个16MHz的晶振和一个32KHz的晶振,可     以满足不同功耗的需求。
! F# K5 `4 p% Q, ]" T* S' m   支持FPU(浮点运算)和DSP指令4 ]  n; u( M& T- h( @" g
2. 144引脚 114个IO口) a8 [. q8 a6 D; t6 E4 f
3. 存储器容量: 1024K FLASH, 192K SRAM* w% C  v3 L( O
4. 4~26M的外部高速晶振
$ C8 {" d  Y8 M( D3 ]7 A5. 内部16MHz的高速RC振荡器
$ T: m" {. _8 p5 m6. 外部低速32.768K的晶振,主要做RTC时钟源
' W3 Y% K5 d4 F7. 3个12位精度AD[多达24个外部测试通道]/ z8 n: D: W5 U8 A) O4 S

. U% U3 Q8 Z( d- x
f74275118035421db44b5821f8b6f1d7.png
, I( s( u5 p5 {

! k/ X) m8 w$ U, L  M: @& o8. 2个12位DA
4 i) ^9 i0 c  H% b  S5 L. E1 {0 o9. 16个DMA通道,带FIFO和突发支持2 k' C( n' w: ~1 g, g
10. 定时器多达17个( r: I' z) Y. a4 h, ]
     10个通用定时器(TIM2和TIM5是32位): E, k3 y/ |% D, W0 C' K, c
     2个基本定时器4 i. P. V- G& `
     2个高级定时器2 O" P; _9 r% L
     1个系统定时器# f% j3 P- c& a; u5 }! h: \( l8 p
     2个看门狗定时器-
6 E4 g5 g! t  g6 _/ a4 l11. 个I2C接口
; S' F2 w6 b5 K+ \" a; W) ?0 y9 E12. 6个串口
, N# c, V" J6 E13. 3个SPI接口
2 K6 u+ M3 |2 J- n14. 2个CAN2.0
4 G: F' u, X" _9 f9 q2 a, P* z' P! y, F15. 2个USB OTG' h) l9 x' O% O/ ?$ f8 h  ^
16. 1个SDIO+ {/ {5 a3 L5 Q  q4 o

; ?' z6 F, v4 w( G* K
F407总线架构
6 N9 t9 J$ W, z! [7 q
$ O  o  z1 y# r2 X& c1 ?
70e4e8adb9594b68a219033936d23da2.png
/ M! Y8 i6 G  h! }
, L  A  x! g# P& j$ U& @" I$ I主系统由 32 位多层 AHB 总线矩阵构成。
" F- D" L5 J4 @) ~; q5 C3 y6 ]总线矩阵用于主控总线之间的访问仲裁管理。2 d2 \8 X- |- V% H% ^- h' D3 I4 c
仲裁采取循环调度算法。* d+ u  f' N  B8 Z' [: A
总线矩阵可实现以下部分互联:" L( V9 \% E1 Y5 j) s9 m  i
八条主控总线是:
0 e. z3 h- p: p$ {  o1 m$ t0 W     Cortex-M4 内核 I 总线, D 总线和 S 总线;" [  a9 D1 b6 S: ^4 H
     DMA1 存储器总线, DMA2 存储器总线;
8 I& m0 ^( F1 x3 r- a3 X1 V. ]     DMA2 外设总线;
. \* U& }  G! K: `, p! y! O- f     以太网 DMA 总线;% v. j  l: B! J
     USB OTG HS DMA 总线;
& }9 ~& u! Y9 s' c     七条被控总线:
, ?/ ]1 r2 G- n/ m) [1 M     内部 FLASH ICode 总线;" F3 G/ B0 m6 |% f
     内部 FLASH DCode 总线;1 X* ]8 N, u$ r" o8 E4 ^, s) U
     主要内部 SRAM1(112KB)* U* c5 w5 L9 ]4 Q4 S( s+ D
     辅助内部 SRAM2(16KB);
+ E' E5 X% b: e9 E     辅助内部 SRAM3(64KB) (仅适用 STM32F42xx 和 STM32F43xx 系列器件);
% C) K/ b- \8 P0 K; A+ |3 J$ L     AHB1 外设 和 AHB2 外设;# L" g& X( `$ H8 Z$ @
     FSMC) |% z9 U  v* V5 H. p( Q5 {) A# h
2 S  p3 a+ k4 k- `* b5 T( N
STM32F407系统框图
* g7 `% G+ ], X9 l7 T( w. n1 p& ]. k, e1 Y( x
4a948e572c854f37b77ada4b5c44c2f6.png , W0 r5 T- a* t
ffd3d807d44a42bdb280e4709ac05dab.png
! H: V% z' G4 @  T# z" p* y# o$ s9 Z  _: i3 Z: d8 \
* y8 r  n3 d0 i: g+ G
STM32F407地址分配
9 A( f& k5 ]; h6 V$ Q* C: r) D1 O% s& Q
d88c0050784845c3abbdd5840b0cebae.png
: T* p8 W, L' E
$ d7 l$ h2 o+ v, E  V* W: ^
0x0800 0000开始的flash,从0x2000 0000开始的sram这两部分,其中flash是我们代码烧录的地方,sram是我们程序执行的内存地址。
/ U2 n* h" V6 k+ \) Z* ~; |* c- [2 e, V+ h1 K4 D2 C) @. {: O
4cba640d926b4091b683c3ffcdbdd97a.png
/ r, ?6 L' |3 F( [0 X' @" x& L, B. L, j9 p) q$ h% s) C7 c
STM32开发
' ^6 G( M2 _# q固件库概念
4 }4 D( ?$ |0 M4 }7 N2 w. dFWlib叫固件库,FW的单词是Firmware.即固件的意思。STM32的固件库包含C文件和H文件,主要用于存放STM32的一些寄存器的定义及一些底层驱动函数
( h6 b$ y. z( \% v

+ x7 z% p/ K( F容量) U6 A6 n3 X7 X& d
对于 103 系列,主要是用其中 3 个启动文件
& ^5 ?0 s! {/ T: I% O• startup_stm32f10x_ld.s: 适用于小容量 产品,小容量:FLASH≤32K' A8 I2 k" J# K0 i( r
• startup_stm32f10x_md.s : 适用于中等容量产品,中容量:64K≤FLASH≤128K5 N% N- R7 c5 ^) k( E
• startup_stm32f10x_hd.s: 适用于大容量产品,大容量:256K≤FLASH! N  r. X7 U8 y/ m( _
7 K0 R  A! S- F( K9 ?% I
STM32启动模式
2 k5 l3 j) c3 M4 d0 bB0 B1 启动模式5 j7 t8 P( U9 n8 b' V
0 X 主闪存存储器( Z" n8 b; J0 t. l# A
1 0 系统存储器3 j7 U5 B! H; G- n5 h. L$ v
1 1 内置SRAM
! i  }* O. I8 ~! L, G0 U# }1 p* Z- v  O/ B
STM32软件
3 l; z% s. d0 N+ D6 b" XMDK介绍
; E0 h: N7 Q- O• MDK是keil公司开发的,为基于Cortex、arm7、arm9等处理器设备提供的一个完整开发环境。
5 L* Q' b0 v0 D+ b* s• MDK(Microcontroller Development Kit,字面的意思就是“微控制器开发套装”)。) U$ F0 r8 N! N
0 x5 B- l6 b& O' b
MDK安装
! ?/ P7 U6 {% U$ f) Do 在软件资料,1,软件,MDK5
" p, \2 B) _8 E! B7 Po 无脑安装
; j  a, d) Q8 t• MDK5破解
) F# _5 v$ {. ro File license Mangement 复制CID8 i1 ]/ u, c/ J. k
o 在keygen破解软件中运行CID 得到秘钥,记得选择32
4 s% k& d4 O) oo 用管理员身份打开MDK5,再次进入license Management 的New ID Code粘贴+ r3 v0 ]" a& T9 b) }
+ ~$ o- r6 U+ r5 Q' x! p. E: K/ K
生成HEX文件' C1 G5 c, A/ Q) u, J
点击魔术棒,进入配置菜单,选择 Output。然后勾上下三个选项。 其中 Create HEX file 是编译生成 hex 文件,Browser Information 是可以查看变量和函数定义。% q. G# B5 v2 B" h) G2 Q. B

7 Q% C3 {# H& W4 B- `
a50be04942464ca39ab9d3014f6ca9d7.png
! u2 o- p  ~0 k' N
9 t- b  V' G- b6 x
+ H" n; [+ B, ]2 a
支持包安装# P3 ?2 A9 P: u9 J. G

# r  H; r6 l! q7 [6 J 42f597d8d6fc487494572065fa5dbcb1.png
" o1 `# i7 L' B! G2 x' C7 X$ i& ?! R8 i: R8 ]0 Y8 \$ x: u
可以下载软件,Keil.STM32F1xx_DFP.1.0.5.pack# m2 B5 U6 D, b
双击安装; X. t& ^7 k* M/ q" ?; {5 B

! m) e- o$ y9 X7 g添加宏. w0 g, t$ w7 Y( ^4 ~, B3 W
因为 3.5 版本的库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配置一个全局的宏定义变量。/ t! C  t" D3 _0 f7 b
c/c++界面,然后填写“STM32F10X_HD,USE_STDPERIPH_DRIVER”到 Define 输入框里面) b2 J! h3 D  c9 m* R6 C+ h( ~+ V: \
如果你用的是中容量那么STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD. 然后点击 OK。
8 u+ J+ ^  V7 l% o+ \' g) R' Y2 o% w
3 t2 b  S4 F& ?6 W/ e0 ?
30dc47b1a09c4153b815865b512d798f.png . C8 t# C" u( C
3 u/ N. N2 g0 U1 p# y
9 _. ^  s$ x& m' d( F( R( O
添加头文件路径
( w- D9 ~) v0 n  S) U对于任何一个工程,我们都需要把工程中引用到的所有头文件的路径都包含到进来 。
9 I* _4 @4 @$ f9 Y1 M点击魔术棒 ,出来一个菜单,然后点击 c/c++选项.然后点击Include Paths 右边的按钮。
0 @- W/ |: Q# u' j& D3 t弹出一个添加 path 的对话框,然后我们将图上面的 3 个目录添加进去。; P. R9 _1 T. C- h* [; h. V' U* L
记住,keil 只会在一级目录查找,所以如果你的目录下面还有子目录,记得 path一定要定位到最后一级子目录。然后点击 OK.' p5 d& l1 _) s# L

5 \( R: [  X3 \
aaea2d7fc0834aac9f839be314376013.png
) o8 m$ L! z; A; L6 f/ U( g
$ F: }7 N, c! u9 c/ W" {$ E
3 I0 a2 N3 W- K2 R9 a9 T6 D
库函数选择外设0 T4 t- X4 ^$ K$ b. f
3.5 版本的库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配置一个全局的宏定义变量。
9 O, J% z, s1 r2 @9 P8 n& w) tc/c++界面,然后填写“STM32F10X_HD,USE_STDPERIPH_DRIVER”到 Define 输入框里面
1 r2 a6 V! v' r" ?! E9 h4 u- i! _4 n2 O1 Y# l
144affc28ecc468ca38a8d1b585d5a93.png * |- S2 e; ^9 _& b( Q6 P: s8 E
4 S: Q1 o+ L. J$ S1 n) q
如果你用的是中容量那么STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD. 然后点击 OK。3 K7 ~" ~* m& U! {- U
1 l' o& t4 o" G" ?5 P
/ \% [2 X1 B, t% p4 }1 h
编译输出" k9 ^- k% X2 H$ ^5 g; l/ g2 y

3 y3 ^6 I% X3 w* V 0fa64c7b3805431da4f76475ca418abc.png + }) P5 T: M. A8 @5 T
编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。3 p: ~! j7 y0 W' d( H; n
方法是点击魔术棒,然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面新建的 OBJ 目录。% d  K8 g( [9 k+ b6 J$ G$ A$ y
这里大家注意,如果我们不设置 Output 路径,那么默认的编译中间文件存放目录就是 MDK 自动生成的 Objects 目录和 Listings 目录
( x& I. J% ]) R2 f1 K2 z$ |
$ \0 ~- g* e$ Q+ u) z
第二个图标是全部重新编译按钮(工程大的时候,编译耗时较久,建议少用)
1 T7 R/ D0 O" i5 l/ W+ D
/ R( b: a) [& q1 f9 b6 J
- {% I, Q, ^- a3 O- `4 n+ t3 u
编译成功0 K% S- L2 H# N
. D' f$ ?* ?  y5 X% l1 \( o
b9e7aa4cbd63444886bcb1536206648c.png
% `  u, j* P( P* z1 }2 Z+ e4 u. a
从编译信息可以看出,我们的代码占用 FLASH 大小为:1 Z6 X) o2 t( p+ o4 h, n  G# j
1892 字节(1556+336),所用的 SRAM 大小为:1864 个字节(32+1832)。1 A) T* j/ Q  z6 z& [
Code:表示程序所占用 FLASH 的大小(FLASH)。' J  ?- N; \$ Q3 F
RO-data:即 Read Only-data,表示程序定义的常量,如 const 类型(FLASH)。5 d, b) i# Q  q6 C7 M- j5 w6 g4 R
RW-data:即 Read Write-data,表示已被初始化的全局变量(SRAM)' \" g6 n7 u8 Y5 p4 Z
ZI-data:即 Zero Init-data,表示未被初始化的全局变量(SRAM)- G4 |9 H2 ^4 g# L1 f  @, X

; P, k8 p% V% b0 C3 H; [& E
" q. ^5 v% |! m' D) _7 H
flymcu使用5 n: P3 C4 Q' Z: e9 J! J% T( o
串口下载软件% l- P) W0 H, \
flymcu,该软件是mcuisp的升级版本(flymcu新增对STM32F4的支持),由ALIENTEK提供部分赞助,mcuisp 作者开发8 |9 d2 U% H$ }1 @
7 a6 J- f8 i0 J4 `) u
a1087e443fce4edc80b18c9d2938034b.png
7 R% f0 V/ _6 L! A. t  g3 `1 P

1 V4 Q7 Y7 y. v3 r& |2 @* P( {特别提醒:不要选择使用 RamIsp,否则,可能没法正常下载。
" Y2 g3 R9 q+ T/ O) @. H) gDTR 的低电平复位,RTS 高电平进 BootLoader
, L6 W# Z0 u* L1 \    选中这个选择项选,flymcu就会通过 DTR 和 RTS 信号来控制板载的一键下载功能电路,以实现一键下载功能。这个是必要的选项(在 BOOT0 接 GND 的条件下)。
1 b: w0 h1 V/ F& [# n( G
. ]/ E" a. O4 B! d7 W$ u2 [+ W; G/ r
6 f9 j1 r+ Y+ V% E% l$ d9 J0 _' N
ae9572dc24bc4518b9818d422c7b1a7f.png 5 }, M! e6 q7 O+ M3 ]
( L* G  N4 r# ~3 g9 _9 z* L8 `
第 1 个圈,圈出了 flymcu 对一键下载电路的控制过程,其实就是控制 DTR和 RTS 电平的变化,控制 BOOT0 和 RESET,从而实现自动下载。
! D7 v- k; t; H* i3 I( _5 x$ e: L0 p8 e: K+ h: ~* k% |( @% k

0 \5 j9 g! r& _: h6 c2 |9 ]XCOM
! X' v& o8 B) N串口调试助手,直接打开,设置串口即可(程序中要通过对应的usart发送内容); W7 ?( e  F% L/ H, f% b
/ p6 j  m0 T( e
01cf35fba0a240d79b7c70e268e10471.png
, X  }% D$ F- Q- C+ o; S9 ]
& j5 I: y2 _% n+ b5 y3 h% v- g8 g$ W
# x8 _/ w9 B* N
程序下载电路5 b" m4 W9 n* R5 l" @
+ V1 V: y, z4 G- u/ q6 |! x" g; y
ad1c6a36bb524c1787bf0ef95cbe5ecb.png ( X& d- O- R3 F
: V# M6 d+ o* a' X: x; _
USB 转串口,CH340G,是国内芯片公司南京沁恒的产品,稳定性经测试还不错,所以还是多支持下国产。
. Q4 o0 Q) g5 f首先,mcuisp 控制 DTR 输出低电平,则 DTR_N 输出高,
' T1 d( \" U! i; D+ l1 u然后 RTS 置高,则 RTS_N 输出低,这样 Q4 导通了,BOOT0 被拉高,即实现设置 BOOT0 为 1
) c5 Z1 J# m2 F2 t5 y9 ?5 ]同时 Q3 也会导通,STM32F4 的复位脚被拉低,实现复位。
$ w  D" e/ A& K然后,延时 100ms 后,mcuisp 控制DTR为高电平,则DTR_N输出低电平,RTS维持高电平,则RTS_N继续为低电平& U8 }) Z/ @7 u; ]/ h
此时STM32F4的复位引脚,由于 Q3 不再导通,变为高电平,STM32F4 结束复位6 W( N; X0 r6 d
但是 BOOT0 还是维持为1,从而进入 ISP 模式,接着 mcuisp 就可以开始连接 STM32F4,下载代码了,从而实现一键下载。8 k7 M5 C' I: A0 _3 z+ c' _0 J
7 R, L$ X4 w( z2 S
STM32调试
; C9 g9 r* l4 k! d% hJLink
% l6 W, v2 P* G9 ?
JTAG与SWD是个接口,JLink指的是仿真器' b1 _3 k3 F+ I2 e& f/ e% N
串口只能下载代码,并不能实时跟踪调试,而利用调试工具,比如 ST-LINK,JLINK 和ULINK 等就可以实时跟踪程序,从而找到你程序中的 bug,使你的开发事半功倍。2 R* ]& ]3 Y1 P9 s; K, F5 `' @
# B3 t' m; q/ \6 R( \6 K
e9c7d44024314364ba876622ac325d0b.png ) e0 _9 t- t1 [' {! }$ i
( }4 D$ Q# e- _. d

' \; ~5 k5 }( b5 w  JJTAG/SWD& S# O# C8 c' z: y$ ?
调试原理
9 ?: p! b: [) H+ F6 p/ `" L- {
9 W; {  V0 Y& N, m+ [* R
cb03688967b64f72b16c25ab780e17b5.png
1 s3 ^- C1 I$ Q, P

( q. B+ N, \3 k, {! ^! K1 m串行接口,就是SWD,通信数据线两根
! G* a" |2 w5 ]4 |" Q* m# pJTAG,通信数据线五根,所以用SWD多
0 e& K! T. L9 ~1 g! d$ O. G6 q. t! O0 Y
7a1fc4e5199241a498a22c0f2b700eb4.png 7 f& o  e2 W6 P: ?0 ]) B

" b/ }. L& h0 f3 q+ {& |) h使用SWD的话,只需要SWDIO与SWCLK两个引脚。
2 k* e3 U; P8 ]/ X3 z' l使用JTAG的话,五个引脚都要用到。
. l6 N! x0 g7 B$ w8 |: r
! l  s9 l  i5 s0 m& h% H% T
+ Y9 C1 k# M( Q2 k
SWD与JTAG的端口映射7 V& {$ j/ l+ |# P, Z3 s& n

( F9 w1 P8 w8 \( i" ?* l
de51a5d1541442128d3ba9f08712e050.png
4 s1 Z  ^* g  ?+ r$ B5 Y8 c" f: U9 _& I8 d0 ~& u4 n3 T& U
默认的五个口不能作为IO口输出4 w/ C( a' A! {1 F2 n# F# n
0 l* O2 I  {# \) N
b5370415599e48839552593cc3341a5b.png
/ ~8 u1 P( P% V) F
( c1 h) D$ v0 W8 ]+ V认这五个引脚复位了之后都是用来仿真的,是不能正常使用的,只有禁止了相应的端口,才能释放IO引脚7 I' H1 l) o3 I5 X3 y
& `. ]' a5 t" z7 o5 s% P
) @; {  f8 \3 D( ?2 _$ b
JTAG/SWD硬件

, |. B! z5 W6 i7 [# S
9 t, i' }! b- r# {  W7 B
f6e4d0c95c584a569db70eafbf703150.png 9 U1 L; ?' j5 p- Y1 j& o
1 Z$ Z+ ]0 w+ E0 b$ ], `% U( E
STM32 的 SWD 接口与 JTAG 是共用的,只要接上 JTAG,你就可以使用 SWD模式了(其实并不需要 JTAG 这么多线),当然,你的调试器必须支持 SWD 模式,JLINK V7/V8、ULINK2 和 ST LINK 等都支持 SWD 调试。- x: r* e, O! |- u* p- T

. u( m  `$ [% Z  x2 T, j) t) |

. _$ w9 S6 V7 w, y6 X7 j设置禁止JTAG
8 V& J6 U! L. @& D5 f4 r/ `(在文件stm32f10x_gpio.c中):调用该函数,有三个选项。407没有复用概念。
& t) T; U1 y2 A8 f0 r1 T$ F7 ?& d1 a. V; w" R
  1. void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
复制代码

8 [# l" A( R$ R6 S; vJLink配置8 @4 j& {+ F. ^7 Q( j
魔法棒-Debug-JLInk
2 K: }) `+ s$ k# a
% x1 E- @3 b: O/ G; W
c4663826d5a443c08f62a38253b9ee74.png
# _; c& J) ?9 }+ B8 H, K9 V3 p
8 j9 t+ Q. }$ b. G+ H  ]) p. y3 b) r
上图中我们还勾选了 Run to main(),该选项选中后,只要点击仿真就会直接运行到 main 函数,如果没选择这个选项,则会先执行 startup_stm32f10x_hd.s 文件的 Reset_Handler,再跳到main 函数' r6 F/ B4 ?1 p8 g

8 s/ A8 n1 s7 e2 V) t. g9 ^) W4 fsetting JLink
- @3 r' D4 a6 g6 F$ l* [7 X  J% m
) {* T, r0 v$ E% F
f7e9b5e7c43a49a6beae213effd0b86a.png / d" j" H+ O: u4 g( q

, M! {) @6 `$ J  i* a& l! X选择Jlink的时候一般选择10M,JTAG5M就可以了$ v1 S4 @- ]4 j2 T5 E2 L
在 Utilities 选项卡里面设置下载时的目标编程器
# K% h/ X) ?/ X: S( f, |# M
* t/ ~. V: H7 i
bc6454ca1ad54d388d5e53df82cd2e54.png ) h; Z- t$ L$ S* ~6 P

& v# _  B$ J2 k进入 FLASH 算法设置Flash DownLoad,在setting的右边两个按钮8 z. o: t, f: ]# f

  u3 ?8 ?3 _% C# X& E/ Q
8e58f1d3d59f437babee5646575773ff.png + m+ T5 K* B* z4 F# a' ~

8 }( D- H; G9 i0 Y设置完之后,点击 OK,然后再点击 OK,回到 IDE 界面,编译一下工程。接下来我们就可以通过 J-LINK 下载代码和调试代码。
! E  f7 B- e+ j6 H4 O只需要点击 LOAD 按钮就可以进行程序下载。
" w8 Z2 r: z' W1 E/ D5 Q5 V2 g9 Z/ z( @! `
0792c9d0beb747ce9c94bebbb965a23e.png
/ w0 l* z' e5 u2 D* e8 g2 i- {
* B( U/ h  S8 `9 g0 }; M! ?" g
731d1242ca5444e8a2bbf162f2ffac33.png * G( U+ K' N: n- j7 [! [/ U

! H& {2 T, H' q3 y 99e551f06504475280fee0ada2534c17.png 6 h- o. y- r- Z% O) z; Q# u* h/ N* ]

9 s; F9 M8 z/ g( o, {4 T 29f43a570fc6412a81c5c06f3055bb4f.png 0 W& f+ A# n: _% b) w

% Z& E4 s$ {" ~7 o0 o3 D7 R
0 h: T9 C7 t: M4 mDebug介绍3 N+ k2 Q8 ^  ~4 C/ }

4 N- o9 ]( a2 \, U, u) \
3e04cac123054bfa80c7c06f6d01b2dd.png
' x! y- ]* I4 T& H+ w
) Y8 C7 r! O7 Z& q* S
0 L  k7 {. ^: l  y( \
复位$ ]' ?4 V8 d: ?+ H4 r5 y: z
其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。
% @& Z' ^4 `3 x# l

2 L! _$ x6 [! e4 b+ _5 h  ^, Y执行到断点处
( s8 h- Y# i# D* j, F0 m; {3 P该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。" g% s* p8 r; H& T9 f

. o# \. X+ }6 R6 M6 J挂起

* c/ m1 S9 q+ t8 c6 r* v此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。2 c! N; @' F" i. o' U# N! I

: I! Z. M: ^9 U" o/ ?# [执行进去3 I4 X/ V/ g$ X. b
该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。
% E% w0 h# H. V& U3 V6 I4 s/ q  s( A5 Y% l. V/ f) h; W
执行过去
5 P- K: K. R, ]% [/ Z$ G0 p  ?在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。
; V: h8 Z4 [: j0 d5 A6 [
* j& Z7 ]) z4 r1 U; Z) w7 h执行出去
. z+ R" R  M, h- s8 \& f该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。; E0 Y4 P, E6 @1 {( V% v

1 H# O& v( A' t/ _执行到光标处9 |! W& U0 V+ ^
该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。5 q% j4 D+ g4 q$ I7 ^, G/ K( Z
$ O/ I. u5 a0 G% x& U8 ]: c
汇编窗口
% I" y0 O! z0 e( @! m' V通过该按钮,就可以查看汇编代码,这对分析程序很有用。
; l; K4 l5 r/ }
1 m, Y4 [: X7 X! q& X! F观看变量/堆栈窗口+ d; L' u1 ]2 m  `
该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想要看的变量值,也是很常用的一个调试窗口。
4 T* \3 V0 s6 P; p: r6 r% I) `! j" {* d3 d- B0 p; j  ]
串口打印窗口
& D  i* M) J! {6 l+ t: \该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。9 j3 o9 ]3 U- W# e; J

) w7 e+ Q+ \7 r! Y( r" `  \! f4 \内存查看窗口+ K; Y5 s8 r& V$ L' F
该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口
4 o+ V+ k5 A2 v

% Z2 V- X+ L5 ]+ U2 Y( B1 P% U5 o性能分析窗口
- |( o8 Q  h7 Q' \按下该按钮,会弹出一个观看各个函数执行时间和所占百分比的窗口,用来分析函数的性能是比较有用的。: v; x! Y+ {9 p

+ `8 w0 L; z4 f) Q% [- S! F逻辑分析窗口0 T9 ]/ ~: f# o
按下该按钮会弹出一个逻辑分析窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。
! D# l$ C$ \: @点击 Setup,新建两个信号 PORTB.5 和 PORTE.5. F8 T" C& l& }5 |! P3 K

, }# M, X$ u* @1 `5 r5 t- o
0111334d656c4c6b813fbe803bc9534a.png ' B+ g) u7 P7 D& B8 w
! @& G3 t7 _# h. p( T2 f
Display Type 选择 bit  q/ ?& Z1 N5 D- N
7 B  r  q' q2 d$ F: }' L
4b330fc96d63408d864701f044caabea.png
( W) ]" N: @4 E% C4 y7 V+ Q# L. O% Z+ g
461f7da0296a429dac3ea7c0ec479c9d.png . p' w9 ]. D0 q6 u9 T# W4 h+ _
56ba88779b7842aabfc652ae961904f9.png
4 t$ N4 X0 M2 d7 c, w1 j5 m! v. Z/ M! H& P$ z# J
注意 Gird 要调节到 0.2s 左右比较合适,可以通过 Zoom 里面的 In 按钮来放大波形,通过 Out 按钮来缩小波形,或者按 All 显示全部波形。5 M- a2 R8 s7 P2 u9 O" l0 |$ s
————————————————, a+ A( t  w: p+ w: P6 [$ l
版权声明:32码奴
% M+ D. a+ z/ a
" j, c7 S4 R3 S3 K  q+ J
: I. n- j/ T7 r" `& F
收藏 评论0 发布时间:2022-12-7 16:03

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版