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

STM32的HAL和LL库可以混用使用吗?

[复制链接]
STMCU-管管 发布时间:2020-10-26 15:52
因为STM32标准外设库已经停更了,导致很多开发者都转向了HAL,但一些读者可能比较疑惑,有HAL和LL两种库,到底能不能混合使用呢?* y$ \! ^4 T' O2 ^8 Y; O4 F) _( h* Q
( f7 C/ l( l8 Y: o2 g4 D  w
一、标准外设库停更了: O7 t+ k' g1 I2 h' R2 h; k8 q
8 k% W2 X1 ?2 i; `

7 A7 M, @( q& v3 Z很多学习STM32的朋友都比较依赖之前的标准外设库(StdPeriph_Lib),我想告诉大家一个事实,那就是标准外设库已经停更很久了。
4 u9 @/ I% l7 a% T* w4 R
! b, q* E3 d" {) N# q5 E支持标准外设库的STM32,只有相对较老的系列:F0、 F1、 F2、 F3、 F4、 L1.
, b4 r5 ?1 \. ^* n
1.png
我特地看了下,STM32标准外设库最后一次更新时间是2016年11月的F4系列。2 y  n- t& s% j

- A$ E1 a0 P5 c; I( X" Z( J! p标准外设库地址:
& m! ~$ p5 c- }2 `: O. q1 A8 X
: d$ X% q5 F0 n0 o/ ?
9 s% c# V3 {# o* B9 d+ `. B
https://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries.html0 ^9 z; n  T" M9 P
# U2 I1 U2 k% E! M' K3 C8 J3 V! o' X7 p
; l2 h5 `( E! w; s2 \/ }6 H
(公号不支持外链接,请复制链接到浏览器打开)0 |. ?; {6 L& c/ ?
7 X7 }: e; {9 I6 d+ s) a% Q+ o4 h
这后面出来的L0、 L4、 L5、 F7、 H7、 G0、 G4、MP1等都没有标准外设库了。" S) U) F2 r" y, C: l  q/ L8 j2 p% I

* Y9 }8 a7 y6 }" u1 S所以,使用STM32CubeHAL将成为今后的的主流。这里就出来了一个问题:该使用HAL,还是LL开发呢?
! o$ I( ~- I1 R7 G; w5 G" u8 F/ g' A- }9 s( ]/ W

: j: |/ q: V% S- I# D0 a& y/ D3 D二者能共同共同开发吗?
- k) f' J  J2 b* O1 Q6 A- r
% W" q+ j( F+ n- C. y% |% t拓展阅读:' s. `* M7 o0 l+ u0 ]: {, X! A, `
8 D5 v1 {' Z' N6 m: ^
7 Y! K( r' M" c
关于STM32的四类嵌入式软件库
! Q% _  |" a. l+ [1 _
2 i3 P0 b3 U& v# i! v

7 c1 d) z. G+ PSTM32Cube LL能高效的原因' |' c% o0 j- y3 C
2 o+ g7 c" C0 ~$ G
二、HAL和LL库能混合使用吗?
# h) T- V+ j2 n/ z5 B1 Q
. q/ [; B/ f: N( T
6 Z% A% {+ B+ X. N! s% l" ^
这个问题的答案是:不建议共同使用。4 a" I, U2 A+ @

: {1 ?2 g" O: g# r% D7 N& ?4 D+ D  x当然,这个问题还要分情况:相同外设和不同外设之间共同使用HAL和LL库。5 K8 N, u$ F$ h5 ~
" }4 {( A' N3 H, m, b+ l& G
1.不同外设混用HAL和LL库5 T# O; w- N9 t# v
, X5 M8 Z7 `+ V- g9 R( @' o' A

0 a9 F% k9 r: P, m: ^) |这里说的不同外设混用HAL和LL库,针对的是不同外设。比如:UART使用HAL库,SPI使用LL库。6 t( y* K0 V/ J8 E: o

. q3 H* V6 Q+ a) {; f这种情况下,一般来说:问题不大。
# ~6 n! Y7 i* @& \: [( D
8 _' j4 T" ?( n: j0 k& f+ Z; G* [+ X因为官方不管是从资料,还是从STM32CubeMX工具配置都没有反对这种做法。2 O9 K, s9 e5 w
5.png
虽没有明确说不允许这样操作,但实际项目不建议这种方式。6 E0 r2 v7 B" ~8 \
7 F! W, V0 B4 \+ Q( a0 A- P
至于原因,相信不用我说,有项目经验的朋友都明白。这样做不利于代码移植,管理等工作。1 B1 x5 G! C% V5 m8 k
+ t6 v7 Q3 w( ]3 i4 H1 V
2.相同外设混用HAL和LL库
7 G  M# ]6 R1 m5 s3 m" F" y
/ v& C) m7 x! W: c+ ~4 P) B

* Q0 l3 z: }+ c3 N这里才是本文重点,这种情况,官方其实也是不建议混合。7 O; @, s; x9 ?3 u

/ H7 Z1 w, a& e, G& q7 r

9 s) K4 L, _  E- |如果混用,会存在一系列问题:底层冲突、结构混乱、管理不方便等。
+ \4 Q! I; a6 o( W/ B* w. P& ?0 B- w7 m
LL库驱动独立,HAL包含驱动包8 k. p8 S) E( U4 A" F# ^. u
" D' ?, J+ C- L/ G* ?2 z

3 _; A) R# \& e& b' _/ K( e/ b拿STM32F4的UART传输函数来说,LL库的位于stm32f4xx_ll_usart.h:
' U3 }& ]+ E3 L4 M2 |8 c$ O
2.png
而HAL定义于stm32f4xx_hal_uart.c:
# ^* b+ n8 R' l* ^3 f; k
3.png
. I1 u& L6 ^% y" R$ `8 ?, q
从这里可以看得出来,LL只需包含头文件即可,HAL要包含bsp包。, I& v: T6 h8 X( N- Q. M: O

. n6 K4 ~3 u$ n8 z% O0 Q# u4 P

. ~! R$ |* s- ]( |% A1 I, [假如使用LL库的工程,想使用HAL库,需添加bsp包到工程。* m/ R. w; y4 A3 L, ~3 P3 y
9 s  p- P% [1 q$ K2 c
HAL句柄" `6 F' c. O' {$ {2 s' Y/ \3 |

7 k, L, {( g: L4 ?5 a" r
2 N3 O5 V8 p0 ]* q0 }
对于LL而言,使用HAL库,会多一个句柄,比如UART1:
5 }$ b2 @# [% c1 `7 `/ N7 u! r
+ D" x, n3 {/ Y$ }
2 ~4 q4 M9 G6 ~% c' g
UART_HandleTypeDef huart1;
1 f, O+ H" u$ I1 @& O$ q如果LL库的工程,直接调用HAL接口是不行的,缺少句柄。
8 V  C. i) k! ]% l4 d; s& `, Z
3 S& }+ m# |: A$ A7 p) Z中断请求处理  K! u  g" j1 a2 H5 q! U
: n* g" ?: O0 \0 L5 E

! v! y3 @/ S9 A# V) E3 H1 @# QHAL和LL的中断请求IRQ方式其实是不一样的,混用之后很容易出错。+ {: g* m' C6 q) k+ E, `; B0 z
/ P+ L3 i% T! i# o* I* Q
这里简单举例说这些,深入理解底层的朋友应该知道,还有许多地方也是不建议混用。' @- l1 o: _" O' ~# E: s0 u
, M# }9 f8 Y8 @! s3 q
当然,不是绝对的(不能混用),我想说:万不得已,慎用。
' ?0 X! _/ f# A: W) |. G; m" @
5 U/ i* O& c% _7 @+ {: a" K
赞 收藏 评论1 发布时间:2020-10-26 15:52

举报

1个回答
radio2radio 回答时间:2020-10-26 16:52:22
不是我想混合使用HAL和LL库,遇到过官方HAL库自己调用了LL库。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版