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

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

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

[复制链接]
STMCU-管管 发布时间:2020-10-26 15:52
因为STM32标准外设库已经停更了,导致很多开发者都转向了HAL,但一些读者可能比较疑惑,有HAL和LL两种库,到底能不能混合使用呢?+ e0 L( `- D/ t; E+ D! E: z% q
- Z8 t  m1 C: a  [- r( o( l
一、标准外设库停更了6 F; X: r% z1 x* @. K" g

" ?& Z  S4 _7 f+ b& _* O2 |- ^

8 K/ b- \0 y9 V) F- \- i& _4 f3 L& g# }# V很多学习STM32的朋友都比较依赖之前的标准外设库(StdPeriph_Lib),我想告诉大家一个事实,那就是标准外设库已经停更很久了。- U; F4 c3 `0 K

+ }% C" ?- I) _: Y1 p+ T支持标准外设库的STM32,只有相对较老的系列:F0、 F1、 F2、 F3、 F4、 L1.
2 u8 U9 e  n$ M) t4 t5 c7 {! l. E
1.png
我特地看了下,STM32标准外设库最后一次更新时间是2016年11月的F4系列。  l! @# \# a! s: |, @1 H5 D" x& i

3 l0 Q5 J  }/ U+ @0 ?& s标准外设库地址:, U7 @  X' n' A) K$ J$ l# ^
9 \8 l( M: K4 Y
- J8 U& X5 b) ^) i5 M/ m5 H* ]
https://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries.html; j/ I2 A" ^( l1 K& X3 n  S1 Q
$ l4 C! Y" T' z3 T% _0 D/ I" N

: D/ e! P, e: r8 ](公号不支持外链接,请复制链接到浏览器打开)
. Y2 T* V. G' C
# L% |8 _  t# E* [$ n. ]这后面出来的L0、 L4、 L5、 F7、 H7、 G0、 G4、MP1等都没有标准外设库了。
  V0 d) z$ e, h2 O! S
6 L4 j% a* w; I: I所以,使用STM32CubeHAL将成为今后的的主流。这里就出来了一个问题:该使用HAL,还是LL开发呢?
0 p0 _4 ]3 N) N$ ?* M( W" s/ x3 D- x- J9 K/ B$ |
5 h0 C: `! t* k
二者能共同共同开发吗?
, J( W; E+ \9 b6 w* }  L: P' u8 f5 i9 o/ \9 h' a
拓展阅读:
* ]6 H+ z) o, r. T9 J; x
5 Z8 S* `' Q  L8 Y* m
" K4 h! v) R( w: X  P: F$ s
关于STM32的四类嵌入式软件库  V7 q- Q8 ^7 \, Y. |

1 D/ a6 o% f$ j

" s* {* b" ^7 G1 v! QSTM32Cube LL能高效的原因
* D" o) c* e! }  l! C. h
5 f9 Z8 C+ Q3 p" J, c二、HAL和LL库能混合使用吗?. n% S8 O  b- ^7 G3 _

* x# K3 q, z5 l

7 q. X$ t' N1 G, F4 o, S+ a* o# K6 L这个问题的答案是:不建议共同使用。+ ]! C1 i& g( t

$ B. e& S$ \( U7 i当然,这个问题还要分情况:相同外设和不同外设之间共同使用HAL和LL库。6 J- `( C* a  Z' i$ e
' |& B- H& E1 b$ F% k. A" {" S
1.不同外设混用HAL和LL库
% _' p5 B* F. o  p! S. G
) C, U% v1 \( x8 w) j0 U

4 H7 D$ k2 P$ s* z# ?. B( v这里说的不同外设混用HAL和LL库,针对的是不同外设。比如:UART使用HAL库,SPI使用LL库。
. J6 X& O" ~: o8 i6 j' y" R% C9 r+ g: c+ H! K) o- X! o. g" q5 J
这种情况下,一般来说:问题不大。& t* j0 Z, M) u2 f  q( j
" g/ }  w  z! r$ b$ }( L% F
因为官方不管是从资料,还是从STM32CubeMX工具配置都没有反对这种做法。
/ p! H$ J. _: A* Q& d
5.png
虽没有明确说不允许这样操作,但实际项目不建议这种方式。. j) ~# p* P& {* g8 A+ j' H: g2 Q

- {% G/ I4 _3 u& W( h至于原因,相信不用我说,有项目经验的朋友都明白。这样做不利于代码移植,管理等工作。, p$ o. n6 |# z% S2 W- F& C2 y

% k. ~+ j4 J3 g' L1 J) F$ V+ P2.相同外设混用HAL和LL库
: L. g6 H; v) C1 x, v) }+ t
% V: n/ {$ e% x' I9 b* B- z1 \

5 N6 h2 [! Z" ^$ T1 ]8 ?这里才是本文重点,这种情况,官方其实也是不建议混合。- ]* z. u0 p3 X  l
+ P# b0 Z* L' I+ A: z
! S% }2 C, R5 P( P0 \% N$ I( _
如果混用,会存在一系列问题:底层冲突、结构混乱、管理不方便等。3 H8 G3 c# V* P# o6 e$ U
; K* d- A" Q3 R% t0 Y" B/ Y+ R% Y
LL库驱动独立,HAL包含驱动包7 o1 x& v/ j. M/ A7 C

4 W' y* L8 p% r: i0 f9 D, e: g

# u3 ?% P8 a$ X6 _3 {) b拿STM32F4的UART传输函数来说,LL库的位于stm32f4xx_ll_usart.h:. a0 |) f, T4 J/ r4 u
2.png
而HAL定义于stm32f4xx_hal_uart.c:6 q+ B" ]! ?) j" @( }9 q( l
3.png

) y0 P, L6 k5 I/ [  q9 ]! d从这里可以看得出来,LL只需包含头文件即可,HAL要包含bsp包。- G* x% T1 |, ]' R3 `; a

- `" X! m# q; ]+ L8 m* J2 R

  o$ \' Y9 M: ~; X假如使用LL库的工程,想使用HAL库,需添加bsp包到工程。6 ~+ [$ h6 W& O* C( o3 l- m

) ?; Q) l  l2 ]! J: h+ l% zHAL句柄
! G6 p8 w3 c' o$ S
, v# z- u; n2 \4 H+ O
- E0 R6 j) u0 Y( M% }) m. k
对于LL而言,使用HAL库,会多一个句柄,比如UART1:; j- M6 i# Z& Y& h

, V  f1 _: T. E$ {1 i5 x
4 S6 C/ ^& g7 S0 t# G4 |
UART_HandleTypeDef huart1;
4 h  d. f% V5 k; J" \如果LL库的工程,直接调用HAL接口是不行的,缺少句柄。( h" d; Z  E( `- c, y  j$ J
* c) O4 w' ?' W! M, \
中断请求处理
1 t9 L. Z' t9 B% O* ~! S& _
( t* J* O& a8 E3 \+ G! P

( t/ F# L# c/ m. J( q( W% WHAL和LL的中断请求IRQ方式其实是不一样的,混用之后很容易出错。' X" j9 f3 {% m+ i# `7 j
: J- c$ V5 B, `  V
这里简单举例说这些,深入理解底层的朋友应该知道,还有许多地方也是不建议混用。
, e9 y% \& q# H; a+ S8 x8 h! `6 e6 z) A, v+ h
当然,不是绝对的(不能混用),我想说:万不得已,慎用。  Q! m( N2 r# Z) |) b

# X$ c1 r: s9 y$ _  o0 @; _
收藏 评论1 发布时间:2020-10-26 15:52

举报

1个回答
radio2radio 回答时间:2020-10-26 16:52:22
不是我想混合使用HAL和LL库,遇到过官方HAL库自己调用了LL库

所属标签

相似分享

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