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

【经验分享】STM32G431介绍

[复制链接]
STMCU小助手 发布时间:2022-7-6 13:35
一、芯片简介
% C  v8 t: w. H
4 Q$ e3 n! g- z5 M! B; L% ] 5_3CQ(`{BWGNKK@(LX2P9JC.png
* S% r. S3 Q1 U" }( G) M) n. C
. Y0 i% w6 t( F( O9 e9 I* C% n1.家族8 j) ]$ u  O% V: s# e& G$ Y. `
STM32:32代表32位MCU,有32根地址线,可以寻找4GB的地址
  J, T; o4 s4 I0 q2 s: `7 z
. j# j3 u% L& U7 l0 BSTC15单片机是8位CPU,地址以16进制表示:0x_ _ ;
, \. x, `- Q( T% L+ MSTM32: 0x_ _ _ _ _ _ _ _
6 G) M) |+ M( \) g3 ^
4 |+ ?! j* v: c2 k3 Q$ o容量为 2^32 = 4,294,967,296 ≈ 4×10^9 (其中 1GB = 10^9)+ J# B1 |% c) n( ^8 Z# a& Q2 q; Y
! C; ]# s/ O, J
2.产品类别

( w) L2 p) b4 G" K- s* P4 @G: 支持DSP和FPU指令的可适用信号应用5 }$ x# W3 A+ u! F

+ ^0 ~4 h1 m+ Y0 }1 ?像正点原子的F4,F:基础型,通用型6 w  G) L. p/ f+ L9 S
& K3 s# J. l: h
3.特点功能
9 j- `7 {' I/ y# W* U7 Q103 : STM32基础型
/ d9 ?6 S/ Z1 F6 A5 W2 G8 o6 G407:高性能,带DSP和FPU
  C3 ~; e- u0 [: ?9 S1 I: W+ ]! a& b431: 未知7 q4 [- f7 V" B* B, @

* s' D, N; `! c2 u4.引脚数
4 S( {8 ?$ O$ ]0 e8 w$ A' g, H, V" |, _R : 64位引脚' s; V: a4 x) e! @  t# }" @. j
/ s$ ]: n0 M, }) {  ]
5.闪存容量, [5 W9 _: n: V( @, u- J
B: 128K4 C$ m% G  R* y

1 s$ C8 Z/ d0 n; _8 \6 }( J6.封装& t- C9 U  F) t3 V  X; ^
T:QFP封装
7 F& V' }- g3 a
1 D. x  O2 e6 J" \, \1 B二、Cortex-M内核. \% M" m$ b  a
整个芯片的组成) `' v0 M# o3 q) K2 {, I6 i* k. v
% c: w* q, r& z; r( C
`SM78~YSM@_H{4S17R3(@JF.png % ^% q; b. l6 {# V
3 d( @( g6 V+ Z; |, P8 k# x5 |; d- \
芯片由两大部分组成的:Cortex-M内核(ARM公司设计的部分) + 外设资源(芯片制造商设计的部分)
) T3 k0 h- F3 X4 K- B$ \6 u
  u) R7 `) i9 U% _% e 2`{H2[2%MDVEA__$PV)2K.png 8 M7 w5 l( I1 N
W_L_J~TW9I[GO9ID$]P@G5I.png
* N% R  E4 [/ b$ D# b( F. |6 I. Z% X7 H
Cortex-M家族有一系列的处理器,STM32F103内部使用的是Cortex-M3内核,STM32G431内部使用的是Cortex-M4内核,M4比M3多了DSP信号处理和FPU浮点运算单元8 Z$ c9 }' |! f
+ Q( z$ l$ f  f. [* z: N+ ^
M3内核架构简化视图
. @. ]; ^0 }! \9 E9 Y: N( M7 E! [' C7 [9 S8 g; A) G
LTUL}KCORS4KFJJ~9GHTAC8.png
' X* P, g6 m" V- |0 _  O# l1 u# ?) ?4 r# r
NVIC:向量中断控制器,负责中断控制以及中断处理事务8 I7 j$ @/ z# h2 w

5 Y" |. }- }  A' ]/ t; H# l取指令单元:取指执行,通过总线将程序从程序存储器(128K闪存)取出,交给解码器( \+ m$ a) Q* c

8 Z& L# l2 `" f, c2 y解码器:指令解码  w7 Z0 j2 o$ H, y; ?8 ]  Y+ z
0 Z  a; z5 W3 q/ F/ T6 {
ALU: 算术逻辑单元, 是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算
7 ^1 k: n2 }& y2 p
8 y- s' i. ?. J, W! V8 B7 Z4 u自带追踪接口和调试系统
( T5 M6 ?- Z# ^
3 P4 u2 F$ A% C8 [6 q存储逻辑运算的结果放在寄存器组中
+ E- l; d2 f  Z# @2 d! s% E
9 y) }+ d1 |1 @) X9 _% u (5~%R%M{7VRTQ4@35`_T@1Q.png ! C5 L, A8 X0 k+ r' M$ T
; ?) p1 p. d9 F. Q3 o7 z9 J
想要深入学习寄存器组的作用,参考这一篇:M3/M4内核基础
1 d7 R. z. a* U" @. G9 u4 [$ b% _& ^! r# i) q. g- j% }+ I
三、芯片内部结构
* R% l7 E9 ^! e4 F" O6 I) S$ F
1.外设资源

+ L- t. h( w8 G/ Y/ }: y* _5 m% iSTM32G4系列控制器参考手册:查看开发板外设的资源和资源的数量
' ^7 B% V9 w1 h2 g1 M# O+ ?( |) ?* e' d
6e59fe7cb6994bdfaceb608eecbf9506.png
, X4 F' M1 z* X, j, S/ s# ?: M0 p! P: x2 x+ g. P
LNKQI[_B6487CO7D(~ZIFC6.png
5 R( T( M4 y6 B
5 Y9 h  W3 N- ?) _5 F  } TUJ~RYD5)89(}CXSUP1B.png 0 m% w0 m/ O8 ~

& Q/ X' X8 L: r  Z) @1 u bd7aebbfeb3e4401bc67b3e2e66114ee.png * R6 n6 |* `6 {: b4 C& V

% n' S4 V  \9 r% O; |& G7 X6 F
( z6 e$ h+ r: P+ d/ g2.内部模块框图
1 p7 o% F/ m+ {$ |, LSTM32G431RB数据手册:查看外设所对应的时钟总线
1 j  ~3 O2 D- ~6 ~" O' i/ H9 K
524deace74c34fcc95d68563a17cd366.png 8 U. e! ^8 t9 T2 x: s

: v8 `3 {/ M3 X5 w" V  o8 sGPIO(A-G) : 挂载在AHB2时钟总线上: ]% F) U1 f) J! K* G
定时器1,8,15,16,17 : APB2
- _( q: r" d/ @2 ?( n+ I& ^1 e7 v定时器2,3,4,I2C: APB1
/ ]+ V  O6 l8 ~* t& A& W- M5 Z( b# ^AHB1分为 APB1和APB2时钟总线7 ]9 e. x  S) Q' x

* I* M2 z% U2 i! M P2_Y}$OP7%4OW6LCA)EV[]N.png ; ~3 O$ T: K- s# b: ]; `2 p
9 \1 U- E! I6 e$ J+ y$ l) m7 B0 |
3.时钟树9 d& T3 }# u4 y
STM32G4系列微控制器参考手册: 查看时钟树
  i0 ^9 J) V; `" Q
6 i3 i) C6 p: F 1b93f6bb8696487a84ee9aae5fea2180.png
5 K* o) i* k0 j/ g. }. u; U0 E* ~" q3 {" D! m, |# z
时钟树:
3 C1 U" Z- `- n% U+ E3 S5 U
. ?9 ?- S  R! n+ {6 n# ]3 ]" u6 _ )3BDOQL]N{T$V]Z0IS}D1HY.png " z9 A& X  l% f$ b& ^

; _( n% }* d* v  E- \! M1 LSTM32的时钟源主要有: 内部时钟、外部时钟、锁相环倍频输出时钟。内部时钟、外部时钟又分为告诉高速、低速时钟
3 X! F5 A! k0 y) z7 |& Y
5 `! r  `6 l8 j系统时钟有三种来源:高速外部时钟(4-48Mhz),高速内部时钟(16 Mhz), PLL锁相环倍频输出时钟
" O% Y1 ~: l5 B) i- I0 W; o; q
+ S# G& Z- `" @  [PLL锁相环时钟来源有两种HSE和HSI,经过倍频输出
. n8 Z1 ~, r8 V( e* r, u, c; S1 S4 \- r* }2 i3 w, ^$ T! h
PEV__DZI%(_U1Z)JVQ[SA4N.png
% I  q% ^; e$ t8 `8 R% O7 x0 k
4 L0 K1 }2 a) _& g4 q  ~6 g6 I0 t1 COSC_IN 和OSC_OUT对应PF0,PF1时钟输入引脚) s0 n0 i2 H+ I; o/ ]0 W  \
4 u! r$ ]7 F3 J
配置时钟:* T( ]) w  V$ x& I
9 [- ]4 _$ P. D" |9 q# Z* Y, |5 E
1.在CubeMX中配置RCC选择外部时钟HSE,对应引脚起作用' h9 K& R7 i6 N( ]. d7 {+ u

) n" L9 ]% q; k4 @1 p4 ]8 R GBIGXF0W207OT{_]$T(S1]B.png * F# c  o" q9 h; a1 V  m, n" _1 B

' T5 `; Q% U2 P; @1 R+ n. O2.倍频设置
  g" \8 Z# ?+ ]* P4 h- c
9 @* ?! a* `* y6 E! {! E* w" E NXFXA_1AFR[4@KF[X3Q1LIU.png - R" C' w: ?7 y% r) d" S
* ~3 y( l# {5 D5 Q' @) C1 b
将外部时钟设置为24Mhz,经过三分频变为8Mhz, 经过锁相环乘20除以2,变为80Mhz, 将系统时钟来源选择PLLCLK , 系统时钟就是80Mhz, 再一分频得到AHB总线时钟,最终得到外设时钟。
  X  o0 O! E& @. r3 D: G- S
5 y) k4 H+ @; J8 {0 D/ B对应代码
: D% [2 F! ~, N3 i8 B6 n' T6 o' U( U1 a  ~
  1. void SystemClock_Config(void)- [: H6 v7 \7 @
  2. {
    & b1 T4 C* ^, S: V, j
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};! B+ C7 Z& B) ]0 O2 U' x8 S
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    + x6 E. H1 N3 v  f' U4 E

  5. ! v( M: ^9 D. X1 a& W& P1 w
  6.   /** Configure the main internal regulator output voltage0 b/ V& `; ^  k- u( |( K7 F
  7.   */
    ( Z0 _4 j2 N% j; e6 U0 n$ x
  8.   HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
      V  r% y9 o/ `) z/ N8 h8 a7 k" k% B
  9.   /** Initializes the RCC Oscillators according to the specified parameters
    # i% ]0 _; T2 Q7 y' K6 m
  10.   * in the RCC_OscInitTypeDef structure.
    / h; l/ B% r+ S  L* B
  11.   */  j- Y$ G( p1 G3 [3 D
  12.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 选择来源% c& i! C2 r  w( P! g0 q3 o
  13.   RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 开启时钟0 Y# U$ H; n% n0 Q
  14.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    . m" J7 U) B+ s, `( d( X2 y4 N
  15.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    ( w. s/ I% u* Y$ J; S) m. l2 L
  16.   // 倍频设置- z0 B; w4 h: t
  17.   RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
    . F7 `" W- I9 U5 ~& w
  18.   RCC_OscInitStruct.PLL.PLLN = 20;
    & ^0 C' H$ o" c
  19.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    3 C# h/ u- o) S0 V$ f
  20.   RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
    ! b  U8 v. w2 X$ L
  21.   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;/ s" s0 ^4 g2 h) S- C6 `+ Q- Y
  22.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK). i! b( ^( z" F" ^, L& e
  23.   {3 t  f% b) l  E, }- E) ~3 O
  24.     Error_Handler();7 b4 ]" c" S/ t. }+ \& d
  25.   }
    / S( z# |* |; o  ~+ H! E
  26.   /** Initializes the CPU, AHB and APB buses clocks6 s* t! C7 k) R* f! M, N7 D( ?
  27.   */5 }( T* J7 s5 Z4 X
  28.   // 由系统时钟得到对应总线的时钟
    / P2 U% T0 N" [$ w, S: i# I
  29.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    . s) H, P& x% o6 H2 R* y
  30.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    " Q8 B0 p5 F( Y- Y
  31.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    ( O2 q+ w' e5 q5 o7 a
  32.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;* m/ O0 C" f  g
  33.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    4 {+ u5 J4 s5 `6 P
  34.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    " |8 G+ h/ T, T; u$ x. }

  35. / I; [  A% {' y
  36.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)% _( W3 b7 M4 s7 O
  37.   {$ F) w8 R& B; Q
  38.     Error_Handler();
    " z( J% I9 I1 [( u
  39.   }
    * M9 u( c8 T6 G
  40. }
复制代码

* d# a0 B/ H  `在STM32G431内部结构中,各个模块都是通过总线相连接。Cortex-M4内核相当于心脏,最高频率可达170MHz,它通过总线AHB进行数据交换,AHB分为AHB1和AHB2,AHB1又分为APB1和APB2
# l" A1 v! G3 t) C( R! }% ]7 K% x- y/ u
3 X5 G+ F9 s7 w) ^7 n TI9VB2`N6ZR}N5~H8V43CI2.png
+ x$ c7 f$ M/ K; H0 [7 l) H6 u+ |1 q" [' X0 A" m
4.存储空间
- [8 j* ^0 \$ Q8 Q. d查看内存映射地址:STM32G4系列微控制器参考手册( B+ S- |) k: ^5 A7 b* {7 ~2 a
* D" M( r% s3 d5 ?
SWLXC7~CUMV6FHH5PFFJ2MB.png $ r8 s  V. C6 f

5 }( v  m- ], w+ _: ^5 [内存映射:
, p2 E  Q# z7 \- s- \  \/ n+ }0 l0 R: e: a" h! o1 D, r
8IX3)1QL01U)]AN@1SDTAUX.png
0 L% g! R7 D8 e9 ~0 K$ V1 h* i0 L9 q: ?; M) }8 [
内存映射分左、右两侧, 左侧是各个资源地址的大致分化,右侧是对左侧的细化
3 F7 u+ h4 U; ^; |9 z; V0 J(1)Flash(闪存)3 D; L' T3 P* b# P; W1 P
Flash:程序存储器,存储代码的地方 起始地址:0x0800 0000+ x; X- l: C0 {4 c6 Z
. g5 m8 L7 E5 X' p- a4 l% L% Y. y
从地址 0x0800 0000 到 0x0808 0000 ,( 8 0000 )16进制 = ( 524288 )10进制,Flash memory被分配到的空间有 524KB 大小,远大于它本身的 128KB
* x0 y7 J2 Q6 p4 |
4 v9 D& c( |9 D(2)RAM! u( `6 T% R7 {
RAM: 随机存储器,用于存储数据 ,起始地址:0x2000 0000
. s  p* `6 @! D
2 N9 ]3 X  O! k9 Q6 N9 c+ @7 ]( ]RAM分为:SRAM和DRAM7 F, M- {. |7 y1 f* E9 o' y& L# G
# U2 ^7 v/ N7 X, |
1.SRAM:静态RAM(S指的static),静态指的不需要刷新电路,数据不会丢失,SRAM速度非常快,是目前读写最快的存储设备
) g+ b7 T2 r0 q( w, Q+ t& O4 s; [/ l5 K6 M7 q
2.DRAM:动态RAM(D指的dynamic),动态指的每隔一段时间就要刷新一次数据,才能保存数据,速度也比SRAM慢,不过它比任何的ROM都要快
2 ]; t6 [0 E/ ]$ _6 m
' h2 D; S1 x( w(3)外设* J  z9 n- M) p, M1 h# t1 o
外设:APB1、APB2、AHB1、AHB2 起始地址:0x4000 00006 h$ {+ Q# g! b7 X

9 S9 ]* u7 ?  |# H' i2 F) I小结:
9 A7 W+ `3 H* K9 ^! F- l8 h
& L1 n# {0 ~/ p/ e: P外设起始地址为 0x4000 0000- Z( U& C  j7 F: g1 h
SRAM起始地址为 0x2000 0000
: X, _/ o! T4 k6 }! nFlash起始地址为 0x0800 0000
& H! H3 E  e" p  @
# Y& W: {" y0 @( l2 [/ W2 P) _详细的外设地址(在上一页的下一页)4 Y" F: W+ R0 H

: K% u3 T5 k3 z %CQU9`QZOM$H02LV5(FZ]E0.png
' x9 M' s( Q+ H
  |9 @: j$ T8 E6 T9 z! u& k% t( n可以依据蓝色字体查看外设对应寄存器分配地址* m3 O, a+ n' D' R4 k

! y% m+ I1 f& o1 m, U }4196RPH9KDJBL8EK%K~ZYN.png
) i* e  g1 n/ M! c9 O+ r/ E5 S: l/ H! ]
四、BOOT启动
2 g% O/ `+ l3 ~4 M6 Z7 d1 L% GSTM32上电启动后,程序代码从最底层地址0x0000 0000 开始运行: j& }6 p" ], ?/ K. ?2 S

$ _7 G$ t% T" Q9 ~3 W %9T})K8ETM5]8K0{GOV5BIR.png
' N' Q0 k* w2 `7 M0 {# S- w
! c( \6 L8 {& @3 @- B# c# ~, l7 Q前面知道代码存储在 Flash地址0x0800 0000 中,如何让 0x0000 0000 运行的是 0x0800 0000 中的代码? 存储器地址重映射: 将 0x0800 0000 中的代码映射到 0x0000 0000 中
9 O! a2 h% `# T& N) O( A' I
' |0 \$ e0 j, b; q- X9 z映射还可以将SRAM, System memory 等地址映射到0X0000 0000处9 G! Q& K6 d* R
" v8 Q3 D. k  [7 v$ p: j. X
E3I`]L{N~}NODEVV)3UQE1E.png / _( I' }* F0 P0 O2 ?, u. H

0 S( f0 }/ S+ S; ]1 ?9 o2 z* @映射方式的选择由BOOT1,BOOT0决定
2 j! ~9 ]0 V; o. [) U2 c! ^7 s" m: Y, u# V! Z/ U6 _
SPDAW8MQZWS3E[{([EZ)(UQ.png
4 `* a! e: e5 l
1 v9 v! m8 N; Q& z* @STM32G431由于BOOT0接地,所以采用的是从flash启动
& r+ c: [$ q+ q( \! w
2 Y+ {6 f' u0 |3 Z  E4 H 679274a1794445d19d02cbbc1af08925.png % o9 i+ k% H' ?

; u/ {( w4 \; U: F. l* q( c- h8 P所以,单片机程序执行顺序8 r- E6 b: U, c
) n( ]/ j" U$ R+ H; p
C{8TQ)ON)G5C~)V3G__RHGW.png # C  w: B9 R. ?# a) n' ^) Y

# W/ d% R: n( ^" K/ U6 k3 P Q`FJEQIS8H{Z](7I17U58%F.png
$ y3 S4 Z. ]4 r5 e" S' A  \) l- B
- ]/ I% T- `  b" @- T; W/ ]中断向量表: 嵌套向量中断控制器(Nested Vectored Interrupt Controller),STM32向量中断统一由NVIC管理, NVIC的核心功能:中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等,外部中断信号从核外发出,信号最终要传递到NVIC(嵌套向量中断控制器)。NVIC跟内核紧密耦合,它控制着整个芯片中断的相关功能
; T/ A& x# n4 z/ e! W( I
; ^# G3 \8 I2 Z. ^5 R: |  ^ 2e7fda82672a423ea8afe0ea6d0d1d53.png
' o! U2 k4 t5 S" O0 G5 y7 Q$ ~( R$ `
DCD表示开辟一个字空间,后边的为函数名称,函数入口地址
+ {! E. n$ s/ T7 r$ \) `+ o' ~* W* t
& h2 b5 O2 f$ G- \) G1.存储堆栈指针位置:先获取堆栈指针位置,告诉CPU,中间变量存储再SRAM中, 从下图可以看到首先获取堆栈指针,然后就跳转到复位中断函数: R  W4 F0 {' O2 n4 r9 w0 k7 p
& Y0 z: P9 s' k4 k
d3f11ca6237848b9ae5b8ec4dade709c.png ; o) I: g$ P" _, ]3 B

. i1 x+ z! F, h( t- E6 N1 S* Z  D注:按照目录的排列顺序进行检索,并执行目录中地址所指向的函数
' ?- v  n4 v* ~: C7 [7 d! M. H
6 L! d9 Q) }' w; D7 B& f2.复位中断函数入口地址:CPU执行到这里,下一步跳转到复位中断函数
; r. S" N* R' A9 u中断复位服务函数; H4 I3 @/ y( K3 s- z6 I1 G
: f$ l5 S  p/ T6 M* v8 A' U" I% s0 Y% v
3.复位中断函数:CPU执行到这,先配置时钟,再跳转到主函数/ R! h) n6 w. w, t. K* }
: R& ?. T5 [9 {( ]: \0 ^" `
Z]}VE(R{0T2}`5A`E_7P6$E.png 5 j9 c0 W8 i$ v1 s- r. c, v

% {4 U: d+ Y+ f3 g在调用main函数之前先完成了时钟的初始化,再调用main的
2 ]$ v$ w! j- P' v( v
/ {7 n- s: U( I# a9 P  I4 L; q4.主函数区域:执行主函数,进入while大循环0 h2 \& z1 e# [8 U& c# R% i9 O

& h7 C2 \$ p# @9 i: @' W6 h5.其他中断函数入口地址:发生中断后,中断位置自动激发,告诉CPU中断入口地址,CPU去执行中断7 l) D: z4 g) @8 n1 C# a

- ^% i: J( ^$ |- T3 o- w所以,在启动文件执行的时候,内核和每个外设的中断服务函数的地址都是已经确定好的,地址就存放在中断向量表中,而且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义
" R2 j/ Y- F' E
9 H* `5 r4 P+ Z: g: P  O. e& O ZF}]TVUU9HIL6PUX(_E@]~A.png
( s" B* m8 G+ i! ~$ r- a8 P) Z
# W0 l5 {5 A2 z/ V2 W. c那么需要在C文件里面重新实现这个中断服务函数,用户写这个中断服务函数的时候,函数名必须跟启动文件里面写的中断函数名对应,因为函数名对应的就是中断服务函数的地址,如果中断服务函数名和启动文件的名字不一样,就默认启动文件里面预先写好的空的中断服务函数,而且是一个死循环,程序就会一直卡死在中断服务函数里面
- T; M. K9 v3 H) Q. h' w8 u
9 W5 ]( C, a: T( V五、库介绍( p0 d9 z. C4 ^" t# a
1.HAL库:ST官方推崇的新编程库;HAL是Hardware Abstraction Layer的缩写,中文名:硬件抽象层。HAL库是ST为STM32最新推出的抽象层嵌入式软件,可以更好的确保跨STM32产品的最大可移植性。HAL使用了比较大的Flash和SRAM。0 P1 P7 W$ _, g
! L2 r" I* }1 L, M
2.LL库(Low Layer):ST最近新增的库,与HAL捆绑发布,文档也是和HAL文档在一起的LL库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器。其支持所有外设。使用方法:独立使用,该库完全独立实现,可以完全抛开HAL库,只用LL库编程完成。在使STM32CubeMX生成项目时,直接选LL库即可。如果使用了复杂的外设,例如USB,则会调用HAL库混合使用,和HAL库结合使用。编译后LL库只有HAL库的33%体积。
% O; A/ O9 Q6 @0 s1 C
5 n$ o" P& R# N% @, M3.标准固件库:旧版本编程库;HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了
$ X( M( g& z/ t" [
1 O3 k6 E3 n7 m( q5 ^4.寄存器编程:原始底层编程。HAL库和标准库就是ST官方对寄存器编程进行人性化封装后的产物
& @2 N3 K& q2 o. D3 \  O: j, Y% A1 w+ Y; U. ^
六、编译过程3 o% v7 I8 V( X. H5 \! t7 f
9 t1 d$ y$ \7 j# }$ [1 @
}~VU@F~0PES@4EWO0EDPN(B.png & h7 y, T  g+ ^: M

' z/ W. h% z" G8 K4 [9 ] E@9XUGN3S_HEXH1SVC_5%WJ.png
, ?* c5 X7 C# s4 v
3 z  m, R* D: V) _1.将 .c 文件编译和 .s 文件汇编,生成 .o 目标文件& \6 Y5 x# M" v8 @3 G3 L6 |. l
0 b( s& |& ]5 P( j- i
2.将 .o 对象文件和内存映射规范文件 通过连接器 生成可执行映像文件。MDK是生成 .axf 可执行文件( \5 N/ N, J- I; Y
6 ^( W" I* ~* H' Z" z. r9 \2 k
3.通过闪存编程器将可执行映像文件下载到芯片的Flash中4 d/ F$ K% a" N" s4 b  C# \
8 Q9 H: S. r: s
6 E( E0 d+ d; b/ [& _  y

$ g: D+ o" }( d5 u, S1 `
赞 收藏 评论0 发布时间:2022-7-6 13:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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