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

【经验分享】STM32G431介绍

[复制链接]
STMCU小助手 发布时间:2022-7-6 13:35
一、芯片简介
9 V$ T" Q; j, O: N( `% D& j
( r, ?1 q2 }) _ 5_3CQ(`{BWGNKK@(LX2P9JC.png
% y; t$ i/ |* ?$ m. c+ F- v, z
1.家族
6 Q6 @: _* F" j: i! ]* `. ASTM32:32代表32位MCU,有32根地址线,可以寻找4GB的地址
7 n: o/ f' g- N
2 |4 i* M5 @6 I1 f0 p- ^9 R9 CSTC15单片机是8位CPU,地址以16进制表示:0x_ _ ;- H/ d8 e% s% u
STM32: 0x_ _ _ _ _ _ _ _
. a; m5 ]( J* z( v
0 Q4 ]! D0 H1 M容量为 2^32 = 4,294,967,296 ≈ 4×10^9 (其中 1GB = 10^9)
% k' J2 h: P0 A$ g6 R/ o5 O7 q$ D3 a! ~6 g1 l  B  ^
2.产品类别
3 ?2 G8 P, H7 C0 s
G: 支持DSP和FPU指令的可适用信号应用& Z& ?3 {' V9 p  l) O) B$ ?* q8 b

8 x, W- Y+ W2 Y) J: P像正点原子的F4,F:基础型,通用型
# ?* m/ A# a. i* d& z. ]1 p0 f/ {) K) ]+ |/ Q
3.特点功能
' k/ D0 _0 U$ K& u$ ]) N103 : STM32基础型4 G: r- y) o" J( F( ~9 [$ P
407:高性能,带DSP和FPU
# a" i0 @, o9 ]% X431: 未知4 U1 i( M2 e+ }8 s# X( s' G

0 z. b0 J7 V$ a5 c& F7 x8 F  Z4.引脚数' H1 e$ x, }/ w4 W3 X- x
R : 64位引脚
$ W/ k  M2 N' V3 w
2 b, f0 }; q% i6 z9 ~) i! Q1 F# l% {5.闪存容量! U4 p' g/ @7 s, i" z
B: 128K! V; V8 A0 W% F! e  Z/ [
* U; ~9 g7 ]2 o' v3 q8 l3 w
6.封装4 X* G0 Q% S- Z8 _9 \
T:QFP封装
8 ~' j% V( c0 F: t) b
0 @0 O  o$ t5 J1 f8 E/ C二、Cortex-M内核' \- k8 b8 X8 {) N( ^
整个芯片的组成
+ O: D! d/ b$ r1 ~" T: v" ^* ]# Q1 }+ v8 J% c5 V$ r7 \
`SM78~YSM@_H{4S17R3(@JF.png
) t0 Q6 t  r, h% ]# v/ B: b# u5 t' b5 O) D! v: N& H% `" w
芯片由两大部分组成的:Cortex-M内核(ARM公司设计的部分) + 外设资源(芯片制造商设计的部分)3 M4 F8 {. |* i, f9 _4 L

" m! M2 L8 R2 W 2`{H2[2%MDVEA__$PV)2K.png ! o1 m% d7 y& g; _" d
W_L_J~TW9I[GO9ID$]P@G5I.png
2 z+ D: s  d9 V. E3 [5 G
2 D$ g5 ^, x1 MCortex-M家族有一系列的处理器,STM32F103内部使用的是Cortex-M3内核,STM32G431内部使用的是Cortex-M4内核,M4比M3多了DSP信号处理和FPU浮点运算单元
. [% ^* ~- I. l1 b$ Z! U! O1 q2 k; k) g' a4 p* I6 i& j
M3内核架构简化视图
: [; x9 H+ l: u; }
6 T8 _5 ?' W4 [, X! [5 U7 V0 A LTUL}KCORS4KFJJ~9GHTAC8.png 2 y: I$ B& J1 o* E6 m9 u) C+ S

' y' G; D/ M* n5 @' {NVIC:向量中断控制器,负责中断控制以及中断处理事务
/ |" i! s3 x9 P5 J- S& \
) i1 h9 ]% V$ X% @" G) Q8 D8 R取指令单元:取指执行,通过总线将程序从程序存储器(128K闪存)取出,交给解码器8 D: ?5 u- w" ^" t0 j* F

& j* `) ]; V* ?* L% B9 q: m& `解码器:指令解码) X$ Y- t: A6 L! O' c
) H; K4 Q' G/ u1 \
ALU: 算术逻辑单元, 是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算
2 J' p2 b% Z' D5 B) ~; B, ~  F* u6 ]5 J0 l0 v
自带追踪接口和调试系统! y0 U' O9 e, }2 u: f

+ N# y% I9 r9 }5 U% W  K存储逻辑运算的结果放在寄存器组中) ?3 c& u) `0 i- Q/ Z( ]
+ Q. g8 l+ i4 R; O2 r, O
(5~%R%M{7VRTQ4@35`_T@1Q.png . w+ E: B! {" O6 U5 V1 U

0 T6 f( |. A1 o% M想要深入学习寄存器组的作用,参考这一篇:M3/M4内核基础2 v/ m9 S" k/ u1 Z
4 ?) v; K' R! B4 X" u3 x5 r7 Y
三、芯片内部结构
2 O; z  B" Z' W
1.外设资源

6 D) f7 t% u6 b% _STM32G4系列控制器参考手册:查看开发板外设的资源和资源的数量5 {5 y# p/ d' N9 m& ~1 I! [" T9 s4 h

5 K) \1 @0 |' [ 6e59fe7cb6994bdfaceb608eecbf9506.png
; o5 e! P3 G1 Q8 H5 P& N. L' O1 u4 c! Q1 c+ ]# f7 M  C3 i
LNKQI[_B6487CO7D(~ZIFC6.png * B$ m' {# J3 Q  l
$ C6 {0 l4 N2 P' H5 Y5 T, \
TUJ~RYD5)89(}CXSUP1B.png ' \6 R) n  |8 C# p
) G! L5 T* C$ C+ R$ d, u- N
bd7aebbfeb3e4401bc67b3e2e66114ee.png & p( Q! w" o2 l4 x8 g) ]1 ]1 b

. r$ _: h6 F3 D3 \' \, J" W; K2 u! M2 q& Q. m4 o5 @4 U; W* b
2.内部模块框图
9 M) i: u$ S! U2 d- RSTM32G431RB数据手册:查看外设所对应的时钟总线
9 [9 f# e( U* v+ H) `& j- O% E$ B/ r3 e9 y
524deace74c34fcc95d68563a17cd366.png
( b9 s8 e% H* t& Y- E& `
) m; e6 l8 \5 j" U: [0 l7 T/ L7 y6 zGPIO(A-G) : 挂载在AHB2时钟总线上
5 ~; a, G2 L% _2 J) w1 u定时器1,8,15,16,17 : APB2( t- n2 N& d! X
定时器2,3,4,I2C: APB1
3 z% \0 m8 r/ R1 JAHB1分为 APB1和APB2时钟总线( g4 {, {8 z; Q3 b& A) G( H

' `% j3 e; ^+ z: ]& s! H P2_Y}$OP7%4OW6LCA)EV[]N.png
" A% R6 v" I4 _  u; t8 C
' {. q( s8 e' u& n- N4 q3.时钟树
% v' t/ H" L5 n3 ^- VSTM32G4系列微控制器参考手册: 查看时钟树, |' Q. |4 X+ a% M8 z

( N0 @4 t! w1 s' Q5 q) R1 d4 F 1b93f6bb8696487a84ee9aae5fea2180.png 7 }0 v" L6 K' o
, n$ D) r% H4 o7 Y. n( q+ r6 n+ W: ^
时钟树:6 v% P& N% P' H, c+ q

4 |0 Z8 C! y" Z3 k7 E' F )3BDOQL]N{T$V]Z0IS}D1HY.png
& P; ^2 |) I5 X; z0 {$ U4 i. ]
% R/ l2 ~, M. Y, T2 p9 p3 NSTM32的时钟源主要有: 内部时钟、外部时钟、锁相环倍频输出时钟。内部时钟、外部时钟又分为告诉高速、低速时钟! [/ _5 t: O; F0 x

( s; q6 v8 }$ u4 w; k, M系统时钟有三种来源:高速外部时钟(4-48Mhz),高速内部时钟(16 Mhz), PLL锁相环倍频输出时钟
1 \* l% F5 J3 F5 ~  V4 F7 U# r. p4 n
PLL锁相环时钟来源有两种HSE和HSI,经过倍频输出" o+ @6 m- P7 v) @9 P
& f/ T- ^# L3 L- c4 c# J" F6 w
PEV__DZI%(_U1Z)JVQ[SA4N.png
" _1 B: c! p; E  c) E2 g& i
* W. L7 k" v6 v6 kOSC_IN 和OSC_OUT对应PF0,PF1时钟输入引脚
! v" H$ u, j/ _& B, L2 @- C2 c# ]; L1 e1 y  h
配置时钟:
; R0 ?2 U8 {/ v5 M9 X& x2 p% q$ `# t" E
1.在CubeMX中配置RCC选择外部时钟HSE,对应引脚起作用
( n' U( u& O3 F5 h5 M
1 ]- U( z7 S4 Q) w+ _: C GBIGXF0W207OT{_]$T(S1]B.png ! X7 t( o3 h8 n% q$ q! J; r4 y
; n! N, X; P2 Q8 s
2.倍频设置
, f& O8 z% n; S& Z& e8 o7 U* i- x/ n$ r
NXFXA_1AFR[4@KF[X3Q1LIU.png / M. O2 n) w" v2 q. r! J
) D" N6 D+ n0 c( o; R) r+ o
将外部时钟设置为24Mhz,经过三分频变为8Mhz, 经过锁相环乘20除以2,变为80Mhz, 将系统时钟来源选择PLLCLK , 系统时钟就是80Mhz, 再一分频得到AHB总线时钟,最终得到外设时钟。
/ W  k; ~  x; @- ^" o5 s; H& ^1 V  k2 y
对应代码
6 j5 I7 W0 `- |% M3 _1 b* o& s9 X: M- F4 H9 Z( @* m' v
  1. void SystemClock_Config(void)
    ) a& Y0 X" Z- i, K/ c  m
  2. {
    3 J3 L( d: o6 p  H! O. s- P( V
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    4 [# z. [+ j: ^
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    + \4 I& {2 ?0 j4 ?
  5. 7 U8 D* e8 g8 L
  6.   /** Configure the main internal regulator output voltage
    . b2 M( p2 B7 c& p7 P
  7.   */* ]. Y5 T% W/ _
  8.   HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
    5 v6 K' b% Y) T9 c$ `& U
  9.   /** Initializes the RCC Oscillators according to the specified parameters
      v5 P2 n9 Y+ Y1 i
  10.   * in the RCC_OscInitTypeDef structure.3 P3 C8 E& c" O, s
  11.   */" `6 S9 `$ W- o! G# x8 c3 M
  12.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 选择来源
    * W5 J5 x/ S+ \- R. C* J1 @
  13.   RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 开启时钟
    9 ?$ Y4 S3 l+ c/ h9 s* A. S
  14.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;8 P7 ?0 |5 O  W1 O
  15.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
      g1 L" U3 ?7 v! d
  16.   // 倍频设置
    ) n# {- x* A3 A# D" d8 H, g
  17.   RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
    " @7 Q/ ?. V  F) E+ N4 l
  18.   RCC_OscInitStruct.PLL.PLLN = 20;
    ' o2 k- \7 U( a4 a$ d
  19.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    ! E) N5 N$ r. ^/ H
  20.   RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;0 ?$ }: b% O( ]0 \
  21.   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;$ L, Z( o6 J, N
  22.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    " @1 {0 b6 x8 G' h, P8 f/ O. ^
  23.   {3 J7 W0 U$ U: P& i7 D
  24.     Error_Handler();$ h0 B5 q3 v3 Q2 Q+ t  c3 L
  25.   }
    * i' D4 t, e( {2 E* n
  26.   /** Initializes the CPU, AHB and APB buses clocks
    - f7 ]% c6 h7 W" l
  27.   */
    " k2 K- s2 |, Q
  28.   // 由系统时钟得到对应总线的时钟0 N& F2 ^# J0 f- x' r& h" X7 l. z: h
  29.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    / n* |" D3 m1 O
  30.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;3 U; A0 N( b3 `1 U; m( a
  31.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;2 y1 X, P" b# }/ Q  O6 e
  32.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;! h* j! [8 i% W
  33.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;' [' M4 ~* M4 v# N; `) D5 V
  34.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    6 d. b( d. v* Y: M. f
  35. , E3 P' J" ]/ y' N! q
  36.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)% v# P8 M! `- g/ O  N
  37.   {
    + y, j# V5 w$ W9 N% H
  38.     Error_Handler();
    * r' x7 P6 k8 o- S0 R
  39.   }
    ! L' J" D7 e% N9 [5 L2 J, _
  40. }
复制代码
6 S/ V4 g- K" g% Y0 x0 R
在STM32G431内部结构中,各个模块都是通过总线相连接。Cortex-M4内核相当于心脏,最高频率可达170MHz,它通过总线AHB进行数据交换,AHB分为AHB1和AHB2,AHB1又分为APB1和APB2
5 n9 S) t) E, x) x7 e) G9 P5 q8 u7 }1 t7 i& x7 Y
TI9VB2`N6ZR}N5~H8V43CI2.png
- Z! ?+ f5 x- S6 {. k  ^0 n7 h. V3 H+ z4 S1 n
4.存储空间2 n6 h. p+ w+ B7 E0 @
查看内存映射地址:STM32G4系列微控制器参考手册5 \- H& t% h8 y* A& v8 M

0 U% r5 S0 e! G. y3 l% Y0 s SWLXC7~CUMV6FHH5PFFJ2MB.png   i2 _2 L4 u1 o! A

8 }- {1 o8 N; Z2 X) t6 N$ {; X( W内存映射:
" @$ J+ Z7 u8 t$ |9 z  C
+ H3 L& `: e0 e 8IX3)1QL01U)]AN@1SDTAUX.png
( z" L, C: k6 E  G6 g& L# d1 Y# q* K, y9 {  `; ^. H/ J
内存映射分左、右两侧, 左侧是各个资源地址的大致分化,右侧是对左侧的细化1 u; y2 D# Y- n- h$ u9 Q$ ~
(1)Flash(闪存)( c. r, E  P1 g- D; B2 G+ C. [$ D) w
Flash:程序存储器,存储代码的地方 起始地址:0x0800 0000
9 v4 F+ r, {0 k" a; [! [1 u2 w- E" [- R5 s$ \; a9 @' S0 J
从地址 0x0800 0000 到 0x0808 0000 ,( 8 0000 )16进制 = ( 524288 )10进制,Flash memory被分配到的空间有 524KB 大小,远大于它本身的 128KB
* {- C  }* }, `5 W$ u, T4 O) L0 O! J
(2)RAM3 I# o1 h  e% A: G( y4 @: O
RAM: 随机存储器,用于存储数据 ,起始地址:0x2000 0000
1 W& e( G8 X# H! W2 }- |+ n
. K' i  y; @) e' |RAM分为:SRAM和DRAM
0 ^( p! C3 j& W, Y
* P$ n( W6 @# `+ F, V; q6 \& ]1.SRAM:静态RAM(S指的static),静态指的不需要刷新电路,数据不会丢失,SRAM速度非常快,是目前读写最快的存储设备
, A2 `! u0 ^) C6 v, p
. x& e  D5 g) M) d- k0 j2.DRAM:动态RAM(D指的dynamic),动态指的每隔一段时间就要刷新一次数据,才能保存数据,速度也比SRAM慢,不过它比任何的ROM都要快6 |' n/ y! g4 ^1 V  o
' D% x: c7 ~+ y: H. B
(3)外设. z* m3 Y( o5 S! p3 ^
外设:APB1、APB2、AHB1、AHB2 起始地址:0x4000 00008 G3 m! s( [/ @2 ^) J& C
: x  M" O  T2 Y9 X& ^* a4 o! p
小结:
7 H7 e' J8 I2 c% h( R' a8 |3 r3 b+ m3 C$ e' D9 m7 ~8 Z7 D
外设起始地址为 0x4000 0000
! E- v; z5 ~* wSRAM起始地址为 0x2000 0000
9 m5 o, I3 {% n( dFlash起始地址为 0x0800 0000; k! I9 P; j+ x; N3 o9 {& l
* T+ k! `/ q  x/ Y
详细的外设地址(在上一页的下一页)
( _2 @: @$ I( w& v& B! J  `' r) t1 D4 U
%CQU9`QZOM$H02LV5(FZ]E0.png
8 D* N( V! f( d) J# C% }
5 p4 I  p5 s3 j9 ?: p( b, H可以依据蓝色字体查看外设对应寄存器分配地址
5 g& J0 V5 R% X: I- n; n( h5 w% |0 P0 i) j
}4196RPH9KDJBL8EK%K~ZYN.png
; x# J' ]0 l7 K) N& Z
5 S) P, K$ K6 @3 y四、BOOT启动# x- a# A5 A  ~2 v- t
STM32上电启动后,程序代码从最底层地址0x0000 0000 开始运行, v, `, Z3 d  Q0 D5 N9 T

; l& @$ b, |8 A2 [ %9T})K8ETM5]8K0{GOV5BIR.png . Q  w7 g( u9 u5 H% ?# \# s

, |' B# N! f# {; i3 n! q( F* ^+ K前面知道代码存储在 Flash地址0x0800 0000 中,如何让 0x0000 0000 运行的是 0x0800 0000 中的代码? 存储器地址重映射: 将 0x0800 0000 中的代码映射到 0x0000 0000 中
9 I+ L* U/ r7 F  e) L1 Q! j. f8 v+ R5 e( r% ]* Z5 W' r2 A) P9 Y
映射还可以将SRAM, System memory 等地址映射到0X0000 0000处1 ^3 L/ |3 c6 a; S

6 V/ E7 Y+ }% h1 g5 P" T E3I`]L{N~}NODEVV)3UQE1E.png # _+ F' a. h3 ~+ ~- F5 k

- D/ z9 b% A: g. k映射方式的选择由BOOT1,BOOT0决定# m' f9 k& I' [" m* _" c; D

3 f& f; `" g4 o. s SPDAW8MQZWS3E[{([EZ)(UQ.png
: J- d$ }% r5 r
, K1 m: h! |, H" Y" USTM32G431由于BOOT0接地,所以采用的是从flash启动- I3 t% [+ `; ^$ A  Y( d
5 c- _) y0 L5 ?( B; {  R8 J" G/ F8 t
679274a1794445d19d02cbbc1af08925.png 4 \( _( w) w9 c! e; M1 ]
' {. |9 n2 q# i; w* G# e
所以,单片机程序执行顺序
: L9 k8 Q. k" v: B, m9 Q! K! n( N, M/ U; p3 {# @8 k; _
C{8TQ)ON)G5C~)V3G__RHGW.png
# t# i9 b3 e; i, r4 T
  Z3 j' ]9 z( T9 d/ B0 g  B Q`FJEQIS8H{Z](7I17U58%F.png
  _2 P& q  @. _, ^# ~: x. _* ?# R; F) C4 Y9 R% K
中断向量表: 嵌套向量中断控制器(Nested Vectored Interrupt Controller),STM32向量中断统一由NVIC管理, NVIC的核心功能:中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等,外部中断信号从核外发出,信号最终要传递到NVIC(嵌套向量中断控制器)。NVIC跟内核紧密耦合,它控制着整个芯片中断的相关功能( q% n+ @2 |8 l' _
8 x& k5 D" U, O( Z& C% l
2e7fda82672a423ea8afe0ea6d0d1d53.png " l! B1 ~7 c8 ?9 v4 B, o
/ S/ U. ]4 A+ p1 H- l
DCD表示开辟一个字空间,后边的为函数名称,函数入口地址
2 F. c  S/ B9 V7 I0 X: [0 h
1 ?1 j, c  ?  z. L* K1.存储堆栈指针位置:先获取堆栈指针位置,告诉CPU,中间变量存储再SRAM中, 从下图可以看到首先获取堆栈指针,然后就跳转到复位中断函数* C" \- _$ k7 C4 K0 t
$ z) {; e! f/ {6 t5 X1 l; }( Z# w
d3f11ca6237848b9ae5b8ec4dade709c.png
5 X+ h3 I% f5 P2 k6 [0 j# O
7 f" a: E) i1 b注:按照目录的排列顺序进行检索,并执行目录中地址所指向的函数) r$ |7 ~7 Y& G: w! q) O3 J% a
9 @' A; G# J: d! C
2.复位中断函数入口地址:CPU执行到这里,下一步跳转到复位中断函数$ y  ~% W$ [5 u( g
中断复位服务函数6 P' m7 x* K3 x8 K4 }' z" y+ ]
& V7 M. A) a5 V  W
3.复位中断函数:CPU执行到这,先配置时钟,再跳转到主函数
* N) }' f, j5 j3 g9 B$ o+ p
; C8 U; y1 v0 I Z]}VE(R{0T2}`5A`E_7P6$E.png 1 z2 M# X5 ]3 |) |  s

1 M* X. G9 b/ h" g' F* @在调用main函数之前先完成了时钟的初始化,再调用main的8 m( G) Q6 I; r( Q

/ e/ {, c7 a8 N: V( y& F% F4.主函数区域:执行主函数,进入while大循环
" F/ R3 N- h+ M$ G( @! c
' r  D. b; d0 D* r6 B5.其他中断函数入口地址:发生中断后,中断位置自动激发,告诉CPU中断入口地址,CPU去执行中断
" E, d% A2 g; `* {# e( s
2 N' W- x  D2 ~所以,在启动文件执行的时候,内核和每个外设的中断服务函数的地址都是已经确定好的,地址就存放在中断向量表中,而且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义$ X: m) P! r, H. }, x
$ G5 U  U- R! O& }3 M' k
ZF}]TVUU9HIL6PUX(_E@]~A.png 5 U5 i) i- W) J$ m! X3 Q6 `
- I5 u! e1 L# ~9 f) f7 v
那么需要在C文件里面重新实现这个中断服务函数,用户写这个中断服务函数的时候,函数名必须跟启动文件里面写的中断函数名对应,因为函数名对应的就是中断服务函数的地址,如果中断服务函数名和启动文件的名字不一样,就默认启动文件里面预先写好的空的中断服务函数,而且是一个死循环,程序就会一直卡死在中断服务函数里面2 Y* c. b0 o' ]$ @, }
7 {6 x, s3 k" ]
五、库介绍2 ?- p2 a0 ~: P- ^
1.HAL库:ST官方推崇的新编程库;HAL是Hardware Abstraction Layer的缩写,中文名:硬件抽象层。HAL库是ST为STM32最新推出的抽象层嵌入式软件,可以更好的确保跨STM32产品的最大可移植性。HAL使用了比较大的Flash和SRAM。9 C7 R; n% E% U4 `

+ w: d8 E/ K' i' W2.LL库(Low Layer):ST最近新增的库,与HAL捆绑发布,文档也是和HAL文档在一起的LL库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器。其支持所有外设。使用方法:独立使用,该库完全独立实现,可以完全抛开HAL库,只用LL库编程完成。在使STM32CubeMX生成项目时,直接选LL库即可。如果使用了复杂的外设,例如USB,则会调用HAL库混合使用,和HAL库结合使用。编译后LL库只有HAL库的33%体积。1 o5 m6 X. v2 I2 _; z; n0 x

- h" O" O  ^) T" k# g. t/ e3.标准固件库:旧版本编程库;HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了
+ [5 U$ b+ ?. V0 b9 X/ e/ ^1 N8 }9 h, R( Y6 U
4.寄存器编程:原始底层编程。HAL库和标准库就是ST官方对寄存器编程进行人性化封装后的产物
$ k  v; f3 E9 J& g+ _+ p. c5 U: o2 ?( Z" r
六、编译过程) @0 _# o$ q: E2 x$ J4 M' E" L
& o+ i: C' M4 c* D1 F; q4 |) t8 a
}~VU@F~0PES@4EWO0EDPN(B.png 5 w! o, t8 s7 j6 d& N, ?
* w8 A( S& Z+ e- g0 p$ V
E@9XUGN3S_HEXH1SVC_5%WJ.png 4 [0 s1 b( y' F$ Z
* e( {: t  A$ ?& m; c, G
1.将 .c 文件编译和 .s 文件汇编,生成 .o 目标文件
: D, J- K. l/ J& l/ E
6 c& b: B# s1 q  ~. n! l2.将 .o 对象文件和内存映射规范文件 通过连接器 生成可执行映像文件。MDK是生成 .axf 可执行文件
/ G/ A% w* `1 M( ~5 h- i: ~' r8 I7 [# y. _/ S
3.通过闪存编程器将可执行映像文件下载到芯片的Flash中0 N2 Z! q" `# Y3 y. [$ o1 \
4 G4 J. F6 Q4 X: W# n1 c4 d. N5 E$ ]

2 M0 ]2 a& i9 V. e. u& P7 P
+ n7 q! _9 C* X7 u3 o: Y8 x
收藏 评论0 发布时间:2022-7-6 13:35

举报

0个回答

所属标签

相似分享

官网相关资源

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