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

【经验分享】STM32G431介绍

[复制链接]
STMCU小助手 发布时间:2022-7-6 13:35
一、芯片简介5 d. P1 A% I$ B5 t; [# k* e
- ?; i9 Z9 ^# i1 J, p# G, k
5_3CQ(`{BWGNKK@(LX2P9JC.png
1 G& t( `  A% u4 ~! t- Z- H+ w6 t( o1 W, K
1.家族
1 q1 s* \  A$ U4 Z2 u( _: K( zSTM32:32代表32位MCU,有32根地址线,可以寻找4GB的地址
/ j- v# C; n% K8 \
6 Q4 b( _0 w' @) @# bSTC15单片机是8位CPU,地址以16进制表示:0x_ _ ;% ~' g7 i$ e. e9 H
STM32: 0x_ _ _ _ _ _ _ _
; {& q/ Q7 D, M
" F# C4 z5 C- Z: v8 T容量为 2^32 = 4,294,967,296 ≈ 4×10^9 (其中 1GB = 10^9)6 I: p4 K& e. J  h+ v: q& J6 }# l
. R5 o* g8 R/ u" L; m0 g) N8 x
2.产品类别
, M! R. B7 C! h0 f' N* ]& {
G: 支持DSP和FPU指令的可适用信号应用
+ q4 S- ^8 G4 E4 i% C; P- u& {: b  l1 t6 _
像正点原子的F4,F:基础型,通用型8 W) k$ h: q3 E* d

+ U" W/ N/ E5 k' \9 q% _3.特点功能
. `7 \1 K7 o0 u103 : STM32基础型
! p" n' f. S/ `* U407:高性能,带DSP和FPU3 l3 E9 b( J9 _) g
431: 未知& N. A7 f/ r% x, N

+ b% F6 V2 X; `6 p2 p4.引脚数
' p* q0 Q# c  n6 MR : 64位引脚3 e- K( G$ `' I5 y

% D5 s+ C4 z3 O5.闪存容量
- d  F. }+ `8 t; ^+ p( D* p% bB: 128K& ]$ H9 T* F9 |1 ?% Y7 C" L: O% \

! y" ?, j% I/ b  I6.封装
2 g2 D& [. d+ y" s% UT:QFP封装
& ]  G5 `0 n- o2 ?5 d4 _$ v. q! Q1 J* A, W
二、Cortex-M内核) u  p6 a: X" m% i, e
整个芯片的组成
& q/ m" u( {. D5 E* v$ V' M3 h0 S% b3 p
`SM78~YSM@_H{4S17R3(@JF.png 5 f. @1 @  S+ H: {6 E
) y) s& p9 C' v( M& l3 a0 K
芯片由两大部分组成的:Cortex-M内核(ARM公司设计的部分) + 外设资源(芯片制造商设计的部分)( r- y0 d* X  ~- D( I1 C

3 Z: e6 f: N1 k; ^- s3 H 2`{H2[2%MDVEA__$PV)2K.png , [& g# `" p/ O& S! I* c) r+ q6 y' [
W_L_J~TW9I[GO9ID$]P@G5I.png
! m9 x2 `5 z8 B# L9 T( v$ o& v! d% t% M. C
Cortex-M家族有一系列的处理器,STM32F103内部使用的是Cortex-M3内核,STM32G431内部使用的是Cortex-M4内核,M4比M3多了DSP信号处理和FPU浮点运算单元
* B' H! E( v* H: k* b
) j' h, w- d. l, `% @M3内核架构简化视图% v8 ]+ Q/ J% l1 y. c% b3 m
) b) W" `8 h2 ]9 m/ H
LTUL}KCORS4KFJJ~9GHTAC8.png 6 R% Q6 M. L, \/ D7 r8 z

6 M9 z, D% }4 |8 O3 a% P: Q0 A) zNVIC:向量中断控制器,负责中断控制以及中断处理事务
( H8 B6 R1 m7 H. T. A! V+ Q/ u! ^0 ^* k
取指令单元:取指执行,通过总线将程序从程序存储器(128K闪存)取出,交给解码器
; R) l3 R9 D7 j
4 a; l; s0 [5 A解码器:指令解码; g' _+ X( \+ I

" v/ S. d, l3 N1 L5 l& h( B: b$ pALU: 算术逻辑单元, 是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算! C, ]7 t& |: a) k

* p4 n% N4 D! V) T* ]自带追踪接口和调试系统% O* X% G* C: M& V0 D+ V+ r' m8 R

( Q" I) }% }1 ~) d7 f) K存储逻辑运算的结果放在寄存器组中3 F; x. X) d+ }% F9 x
- o2 g8 O$ ~7 Z5 z% m
(5~%R%M{7VRTQ4@35`_T@1Q.png
3 p2 J. R2 I$ `% S( U3 z  \" X! D; a3 l- |! S
想要深入学习寄存器组的作用,参考这一篇:M3/M4内核基础
: {  W+ C- e* q# _  q7 X) l: ~2 [. u" k  {& U3 S) ]5 l
三、芯片内部结构

% v$ E+ O" j3 s1.外设资源

4 j8 s& \6 Z. RSTM32G4系列控制器参考手册:查看开发板外设的资源和资源的数量
3 D4 `+ K$ V- I7 U* K! p% H* Z- w; G7 k* a3 s# K
6e59fe7cb6994bdfaceb608eecbf9506.png
: ], @% ~; Y4 s6 r/ H) f# p7 u) P$ Y# J' s
LNKQI[_B6487CO7D(~ZIFC6.png * {" ]1 P; F1 [6 ~8 [; H9 [" ~, U

5 ^; l: G) f( z* d' o! f/ i; e; Y TUJ~RYD5)89(}CXSUP1B.png
1 n+ _8 `$ r4 i+ a! M0 {0 i* Y. z4 v
0 C5 ~: U! h8 F bd7aebbfeb3e4401bc67b3e2e66114ee.png + |* S8 H: q; w. I
; E% y. Q* |, H

' @$ H! s: W, x% `- M" ^2 M2.内部模块框图
4 L! Q! M  Q$ l3 ]1 b' ]" V! p6 ASTM32G431RB数据手册:查看外设所对应的时钟总线
6 D7 R: C/ W( ?$ G3 Z
/ E# w0 r5 H2 z3 p3 O4 `) l3 O 524deace74c34fcc95d68563a17cd366.png 4 H8 K, C6 U4 W' p* e) D

" t* }, ~  Z+ F4 \7 UGPIO(A-G) : 挂载在AHB2时钟总线上
) f5 q- z# J( g9 a) o5 s定时器1,8,15,16,17 : APB2
& w0 I9 E$ ?0 b7 ^1 ?' \* f* f. _) f; n定时器2,3,4,I2C: APB1
$ l7 t! O7 w3 N% }; V9 ?0 j! IAHB1分为 APB1和APB2时钟总线
) C; J' y! M* D
) ?2 x" }$ F7 Q/ b. d P2_Y}$OP7%4OW6LCA)EV[]N.png
4 H: _) L# \0 ~5 u/ E8 ~
# f; X0 C7 @% x- A4 a) r- h/ z9 X3.时钟树
" e% N+ ]9 q. H7 n$ v/ o$ PSTM32G4系列微控制器参考手册: 查看时钟树
5 w2 T" ^4 N" b. |- b4 c' z3 ]9 {2 I( J' }' P- t( ]4 K9 U
1b93f6bb8696487a84ee9aae5fea2180.png
7 D( B: t8 b1 r, Z  d* Z; J8 Z3 K9 X! B& o7 l
时钟树:
) \( \* c) K$ @$ u7 D. ?% \- A' ]3 P' @
)3BDOQL]N{T$V]Z0IS}D1HY.png
9 U: Z; A9 a) s* @; d4 p
! j/ X2 x* I* t% w+ OSTM32的时钟源主要有: 内部时钟、外部时钟、锁相环倍频输出时钟。内部时钟、外部时钟又分为告诉高速、低速时钟
. j4 M9 K- j) R: W3 Y3 {5 s2 d; F% Y. N. U, i
系统时钟有三种来源:高速外部时钟(4-48Mhz),高速内部时钟(16 Mhz), PLL锁相环倍频输出时钟
6 z! J$ M0 ?; _# H0 C
& ]& }' T, O9 W  G  H6 x' pPLL锁相环时钟来源有两种HSE和HSI,经过倍频输出/ o6 X* Q7 G- h% d

" M. Q2 o6 \- j" k7 B PEV__DZI%(_U1Z)JVQ[SA4N.png ; _: C: D9 E9 f6 s1 E" T1 ^
/ q( {2 O- |" M1 n4 y1 |$ F
OSC_IN 和OSC_OUT对应PF0,PF1时钟输入引脚* b. \9 W9 k& e% d# q; ^2 v

, q+ A7 y: x" b( ~# _, _+ i4 Y0 Z: @配置时钟:
" n- y, P. H* M0 y9 k+ t% s  [! `" `
1.在CubeMX中配置RCC选择外部时钟HSE,对应引脚起作用
! m: F! t3 L' @; ^/ v. O+ Y
8 T# t7 ]2 d) a4 L9 t' y GBIGXF0W207OT{_]$T(S1]B.png
% j2 e$ c# R* ?& z/ ~8 b) I7 W8 k& N7 R0 W' M* P2 u2 d  s7 u, m
2.倍频设置* ]& B# |+ {( I0 P# d$ B
/ v4 R  k8 U- j& M7 l
NXFXA_1AFR[4@KF[X3Q1LIU.png
: x6 I4 X  p. p5 L7 n- k
* E0 D' ^  l/ \+ p8 \. e6 M将外部时钟设置为24Mhz,经过三分频变为8Mhz, 经过锁相环乘20除以2,变为80Mhz, 将系统时钟来源选择PLLCLK , 系统时钟就是80Mhz, 再一分频得到AHB总线时钟,最终得到外设时钟。
6 W3 L) }* w/ z( B4 l$ w/ _0 P% \# w. T( [4 ~/ M
对应代码
& e' a! x* v/ O+ l- H7 }6 q" Y7 C4 J5 x) B5 e' y
  1. void SystemClock_Config(void): s2 n* m& {0 f. m0 p8 C% L* V
  2. {$ e( m3 k# _' b: u$ y! x
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    7 _# P* I7 e4 j. `& Z  }
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    8 X( c; P& G! q

  5. , B6 I6 A+ R- B9 s2 R& R+ ^
  6.   /** Configure the main internal regulator output voltage- @- r6 V9 a* C# t
  7.   */
    ' L$ \0 ]- F& ^( [! g% N
  8.   HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);. ?9 ~# o) ?3 }6 }. R
  9.   /** Initializes the RCC Oscillators according to the specified parameters
    2 z- D: V2 s0 E
  10.   * in the RCC_OscInitTypeDef structure.
    5 }, G9 i" a0 d/ h! P
  11.   */. t4 h$ [1 e3 V
  12.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 选择来源; e/ ]. d* o& c# X
  13.   RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 开启时钟0 A. Y2 F4 F% K8 a
  14.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    : }$ ]2 Y0 i2 {3 r2 Y
  15.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;+ w+ X5 T/ u8 \  {
  16.   // 倍频设置
    & h+ l; y0 C, C
  17.   RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;, ?, n4 h+ o- ~4 a! [" q
  18.   RCC_OscInitStruct.PLL.PLLN = 20;
    3 H3 v, b2 C( W* f3 d6 [( O
  19.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;$ E* n! I- j% ~" n" m
  20.   RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;0 |) \3 B" ?$ `+ J( m. c- F; l
  21.   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
    2 U; i5 S! b  ?1 J7 o
  22.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)5 ~. {$ J: A/ d1 r% O* T
  23.   {4 N/ i/ }/ ?9 p9 c, U. ?( ^3 _3 ?
  24.     Error_Handler();) F/ Q+ }/ n* ]6 y0 O" q% y/ j
  25.   }9 F0 z. }. E: i, {8 s: c# C
  26.   /** Initializes the CPU, AHB and APB buses clocks
    - |3 S0 L8 s  |
  27.   */# A. z) ^" _: t- z
  28.   // 由系统时钟得到对应总线的时钟# O8 U8 N6 |+ z5 D2 _" e4 u
  29.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK5 K: t/ |5 c# |& A; V$ A+ G4 v
  30.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    : }' ~/ I: p& a( c/ W
  31.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;6 _) ?* K8 J+ N8 x- u9 u7 ~
  32.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;4 h9 ?( b2 X7 y. F  ^$ L' v. E
  33.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;3 E' |5 C, [5 Y/ M
  34.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    % ]* V2 z) b% R* Y% o( V

  35. 6 M! @# ~  Q/ b+ W. R% j
  36.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)) O) j: X5 U! _  k- j
  37.   {! S* E! h9 `9 A+ \( n4 R4 B: C
  38.     Error_Handler();
    + Q# s+ h8 J" {9 r4 X' [
  39.   }. R0 ?% U1 |8 {. w3 s
  40. }
复制代码
5 E5 V1 T  P2 }" a  B4 j) b
在STM32G431内部结构中,各个模块都是通过总线相连接。Cortex-M4内核相当于心脏,最高频率可达170MHz,它通过总线AHB进行数据交换,AHB分为AHB1和AHB2,AHB1又分为APB1和APB2
7 X# V( g- V- {5 E+ M; {7 U* F. g* q# Q% {9 o0 n$ \
TI9VB2`N6ZR}N5~H8V43CI2.png 4 |6 ^& _, _5 g
* p  U6 y! q6 G6 I' I
4.存储空间) x/ r: s) h7 E0 F! n
查看内存映射地址:STM32G4系列微控制器参考手册+ Z/ Y8 q+ t5 T( b6 ^+ h7 `( r
/ v: X, M" ]3 O. N1 K% P
SWLXC7~CUMV6FHH5PFFJ2MB.png
: w* {; x5 ~5 i! a
! x5 H! n1 r, K内存映射:
+ I  A, K; t- D* a% J
" L/ E) }0 i" L6 b' Y; t. X2 J4 X 8IX3)1QL01U)]AN@1SDTAUX.png ; s8 R  J8 E0 _* x* K) U- T* a
& a/ ~0 D( a( T7 f! W
内存映射分左、右两侧, 左侧是各个资源地址的大致分化,右侧是对左侧的细化+ A' ^2 O0 |" z3 q1 \
(1)Flash(闪存)* s5 |2 s3 r3 z& C) z
Flash:程序存储器,存储代码的地方 起始地址:0x0800 0000
2 @  {7 |: _" }
. d0 ^8 o! F! V# a8 y% _从地址 0x0800 0000 到 0x0808 0000 ,( 8 0000 )16进制 = ( 524288 )10进制,Flash memory被分配到的空间有 524KB 大小,远大于它本身的 128KB
: u. a) R0 ^" e% v9 ~# t1 Z3 [0 s* W4 O: b' }; B4 M
(2)RAM; T. L  P% ]/ S: G2 s: I4 Y
RAM: 随机存储器,用于存储数据 ,起始地址:0x2000 0000$ C0 }0 P4 X% v) p: N

  n" l. l8 ]  b. gRAM分为:SRAM和DRAM* N8 r( a! `5 x. I1 d0 r( f
) _7 W: K2 R9 Q4 F
1.SRAM:静态RAM(S指的static),静态指的不需要刷新电路,数据不会丢失,SRAM速度非常快,是目前读写最快的存储设备
  G0 o" i% X5 _* O
: ^( {- E* {; x3 n0 m2 d% E2.DRAM:动态RAM(D指的dynamic),动态指的每隔一段时间就要刷新一次数据,才能保存数据,速度也比SRAM慢,不过它比任何的ROM都要快% @7 a. T% ^6 H

& g0 U& y4 R7 j8 T0 D0 m( t(3)外设
6 Y4 A0 Z  W2 X8 H2 L# E# `外设:APB1、APB2、AHB1、AHB2 起始地址:0x4000 0000
. N" U# l- D2 \, K" c  V4 \* ~  b" K  m. T8 A1 O
小结:5 J! f' d" A8 [0 D' V9 ^3 O; k# w( G

4 I1 _3 a4 x% u+ j  @外设起始地址为 0x4000 0000
  O9 `! P6 p9 K# A( TSRAM起始地址为 0x2000 0000* u/ _, |6 `+ ^4 V! @9 w" J
Flash起始地址为 0x0800 0000  ]8 Z5 T) d. t
3 v& c8 |9 n/ Z; e! D0 d  `
详细的外设地址(在上一页的下一页)* z" A* F1 D1 d5 {$ [* v

# c9 ^2 Y% W6 w/ Q) o# L- d %CQU9`QZOM$H02LV5(FZ]E0.png " o: I% J) ?: ^; G

' }% T% H6 Y; o/ S可以依据蓝色字体查看外设对应寄存器分配地址
& A  s" X" w- W3 e4 ^7 v* G8 F! |4 U4 I/ u
}4196RPH9KDJBL8EK%K~ZYN.png
" n9 A# X9 U) A: ?& y
! r) H' v" i# \# d5 ^四、BOOT启动5 g. x1 }2 A3 a8 [6 w
STM32上电启动后,程序代码从最底层地址0x0000 0000 开始运行& T( i) D/ J5 q2 Z: B; s' {9 ^! y

( T3 I4 p; \2 {6 j: ~  [ %9T})K8ETM5]8K0{GOV5BIR.png
2 A' Q- a' B% V" Y! Q4 M7 p- k" a* L, g
前面知道代码存储在 Flash地址0x0800 0000 中,如何让 0x0000 0000 运行的是 0x0800 0000 中的代码? 存储器地址重映射: 将 0x0800 0000 中的代码映射到 0x0000 0000 中. {" w) A+ D: }% W
: }  _5 q- N5 g/ J" O- D
映射还可以将SRAM, System memory 等地址映射到0X0000 0000处
( w: w! T& m( {) ?) \: Y4 L
' p  \* t; X2 t: m. N4 ?$ a% ~ E3I`]L{N~}NODEVV)3UQE1E.png
# r4 e2 k9 A, w, t# r8 x7 \0 v
6 h* L& P, f4 W5 }" M0 |9 z映射方式的选择由BOOT1,BOOT0决定
$ }  K9 m6 x3 T3 B: M  P' h, D+ R. e. W5 |0 u' ~
SPDAW8MQZWS3E[{([EZ)(UQ.png $ T7 t2 R$ S3 W6 d
9 @9 n7 k. T, x7 }* H" h8 d
STM32G431由于BOOT0接地,所以采用的是从flash启动
  a) k* p- `" j3 {7 y1 A! [; q; ^
679274a1794445d19d02cbbc1af08925.png
, C, F& q5 R" W" P, N4 [) ^* z8 D
* T( G8 n, j( g* c" `' T$ D所以,单片机程序执行顺序' m2 Z7 p) E( X) c* e" U) q
7 o5 u; W0 f6 k  I9 w
C{8TQ)ON)G5C~)V3G__RHGW.png 5 ~0 d& H  Q/ H9 c1 D1 W6 ?/ l' \
6 Z' e  C8 `: D: }) y
Q`FJEQIS8H{Z](7I17U58%F.png
) X0 ~2 U1 U7 M+ r$ B0 `
8 x. |3 ^4 m6 I. o. t3 q/ O7 u中断向量表: 嵌套向量中断控制器(Nested Vectored Interrupt Controller),STM32向量中断统一由NVIC管理, NVIC的核心功能:中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等,外部中断信号从核外发出,信号最终要传递到NVIC(嵌套向量中断控制器)。NVIC跟内核紧密耦合,它控制着整个芯片中断的相关功能1 \2 I; E7 F6 m7 r
# ]" H- E! Y/ @3 ]% m
2e7fda82672a423ea8afe0ea6d0d1d53.png
. k9 \" [0 L2 w7 i5 h# {  a+ g  ]" `* [% ?. F- O9 d
DCD表示开辟一个字空间,后边的为函数名称,函数入口地址
9 L/ I, T: z1 V3 p0 u
6 b( j! v( j! ~; C0 ]8 s6 a1.存储堆栈指针位置:先获取堆栈指针位置,告诉CPU,中间变量存储再SRAM中, 从下图可以看到首先获取堆栈指针,然后就跳转到复位中断函数8 i$ k, h. E4 O5 M  z( n1 G

- F) h+ h7 Z5 p. g$ {6 x2 g d3f11ca6237848b9ae5b8ec4dade709c.png + c3 I# ^6 }3 t5 [$ ]7 k

: h9 C/ W/ j! ~) n4 ]- _注:按照目录的排列顺序进行检索,并执行目录中地址所指向的函数8 d5 {/ |/ \# f$ r
; R3 ^( B' m1 G& T' v7 H) U7 s8 ~
2.复位中断函数入口地址:CPU执行到这里,下一步跳转到复位中断函数! t% @. \( o6 r' q3 s1 {
中断复位服务函数: M7 M9 L! E4 `* y, U% b. h

( K* d( J  F1 W  m3 Y( u3.复位中断函数:CPU执行到这,先配置时钟,再跳转到主函数$ g" }" M3 F9 v9 {
4 U7 L+ B3 s5 b" k
Z]}VE(R{0T2}`5A`E_7P6$E.png : I/ }+ X4 [1 O$ D! m' U/ K% `
' `. |1 w; T! _; ?1 l6 @9 @
在调用main函数之前先完成了时钟的初始化,再调用main的
) J* W9 W2 p( Y( b: D+ O; Y' k" ~2 f0 w7 X8 ?' C
4.主函数区域:执行主函数,进入while大循环9 {) m0 [0 c; I( ^7 _! R& ]

# {5 G2 z9 R" _5.其他中断函数入口地址:发生中断后,中断位置自动激发,告诉CPU中断入口地址,CPU去执行中断
# K6 M1 R% ]- d: C: P! X# y( t6 l, k. r( q' m& R2 @
所以,在启动文件执行的时候,内核和每个外设的中断服务函数的地址都是已经确定好的,地址就存放在中断向量表中,而且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义
# G3 E' o& H) Q5 Y! {
/ d% X, R/ f8 W% b ZF}]TVUU9HIL6PUX(_E@]~A.png " L6 [1 U8 M0 ]2 }; C

3 ?' @" m- a$ i那么需要在C文件里面重新实现这个中断服务函数,用户写这个中断服务函数的时候,函数名必须跟启动文件里面写的中断函数名对应,因为函数名对应的就是中断服务函数的地址,如果中断服务函数名和启动文件的名字不一样,就默认启动文件里面预先写好的空的中断服务函数,而且是一个死循环,程序就会一直卡死在中断服务函数里面
% p' p. e! w' [/ d1 W5 L; r9 j- X$ u) D6 u, ~- J' w/ j  W1 _& Q
五、库介绍
/ L1 X; M; l* t6 C8 I: s1.HAL库:ST官方推崇的新编程库;HAL是Hardware Abstraction Layer的缩写,中文名:硬件抽象层。HAL库是ST为STM32最新推出的抽象层嵌入式软件,可以更好的确保跨STM32产品的最大可移植性。HAL使用了比较大的Flash和SRAM。
, Q. u. {. d& u6 z
0 S& p! X+ g. \6 R+ [/ Q/ v2.LL库(Low Layer):ST最近新增的库,与HAL捆绑发布,文档也是和HAL文档在一起的LL库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器。其支持所有外设。使用方法:独立使用,该库完全独立实现,可以完全抛开HAL库,只用LL库编程完成。在使STM32CubeMX生成项目时,直接选LL库即可。如果使用了复杂的外设,例如USB,则会调用HAL库混合使用,和HAL库结合使用。编译后LL库只有HAL库的33%体积。3 o% m! Z+ z% Z% {6 _  E
6 g5 {2 W0 X3 `- S# }7 Y
3.标准固件库:旧版本编程库;HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了
9 e; d/ Q& q2 o; Y" z: r4 t, c; K" S9 J- Y, {0 O
4.寄存器编程:原始底层编程。HAL库和标准库就是ST官方对寄存器编程进行人性化封装后的产物
2 c, n: m3 k2 e
) y4 u+ _5 m: }. v5 G8 E9 V! h六、编译过程1 {& b3 I4 J8 M9 P' q; A: k7 F

# y" _  _3 c& a }~VU@F~0PES@4EWO0EDPN(B.png 2 l: y6 Y0 o# z

6 K% E0 e* A! ^, [ E@9XUGN3S_HEXH1SVC_5%WJ.png
# H/ s* t8 T. Z+ o% y, r+ W' t4 H/ h' |
1.将 .c 文件编译和 .s 文件汇编,生成 .o 目标文件
( a' g  g# e, z4 ]
7 E% G) M; ~0 Q2.将 .o 对象文件和内存映射规范文件 通过连接器 生成可执行映像文件。MDK是生成 .axf 可执行文件: R' v; H8 G6 I9 I- r0 e
3 O! C% s: y. c* Q
3.通过闪存编程器将可执行映像文件下载到芯片的Flash中
1 t' _8 C. k& a5 ~6 k! [$ Y9 l/ b8 J# y% r

3 R5 G- Z0 r, K& |5 O4 }; H4 v
1 Q1 C3 w- N! N0 t8 o& t4 X+ ?
收藏 评论0 发布时间:2022-7-6 13:35

举报

0个回答

所属标签

相似分享

官网相关资源

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