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

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

[复制链接]
STMCU-管管 发布时间:2020-10-26 15:52
因为STM32标准外设库已经停更了,导致很多开发者都转向了HAL,但一些读者可能比较疑惑,有HAL和LL两种库,到底能不能混合使用呢?
, _2 `- F/ w2 H  d- s6 _! f6 V* y  t* v
一、标准外设库停更了
0 W, l$ g! [# n* C" i
/ u7 u8 z. }' T1 V/ m- m
( O1 p* [6 c3 G6 ~9 r
很多学习STM32的朋友都比较依赖之前的标准外设库(StdPeriph_Lib),我想告诉大家一个事实,那就是标准外设库已经停更很久了。- k' |: \! R: r% M6 n' p
4 ~9 s6 a& Y, F; C9 u* J
支持标准外设库的STM32,只有相对较老的系列:F0、 F1、 F2、 F3、 F4、 L1.2 G/ w4 Y' P  p2 a1 P8 _- P
1.png
我特地看了下,STM32标准外设库最后一次更新时间是2016年11月的F4系列。
+ M; j: b* N- i2 z4 |! \6 _5 ?
' F! V5 F) [) ?, H) y9 A9 e; n9 h- {9 G标准外设库地址:* l8 E7 V& N: j! H2 j+ v
6 Y# B! L8 ^& g
- q1 R! p0 f% }2 T( E$ X& V' H
https://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries.html
0 h" e% M) _0 H- v$ j7 [: {
7 U2 |  ?  I2 X) ?. c

2 A/ Y# `( i- j# ^4 N" g- v+ w(公号不支持外链接,请复制链接到浏览器打开); R! v! O0 R2 ]2 ^* g; a

( D* q, E: F7 r. z; I这后面出来的L0、 L4、 L5、 F7、 H7、 G0、 G4、MP1等都没有标准外设库了。
6 _/ d( Y! P" m6 b( |
& e# F3 c% {1 z7 \所以,使用STM32CubeHAL将成为今后的的主流。这里就出来了一个问题:该使用HAL,还是LL开发呢?
3 C% y0 @$ o5 |$ z1 V
5 a' u# o0 s9 T; U- b: z8 x
3 \0 g# f' B' D% ^2 R
二者能共同共同开发吗?$ J. w" p2 G! w% w! [4 f0 P# ]

, x6 _. f( I* D% b  M+ M( m6 V/ E8 R拓展阅读:0 B7 `& r. m( a5 M% l( R) ~
3 d$ J  h6 U# r1 Y/ X3 p

7 _# C; `! ~: Q2 B6 `关于STM32的四类嵌入式软件库
; ^  C, B4 c% K  Y! _: i' J- |  W. E
  n" H! F+ y( ?! s  u  A1 P
STM32Cube LL能高效的原因
& h# h( n7 a( \( f7 k6 ~/ S2 q8 b* v. ~' g
二、HAL和LL库能混合使用吗?
. F5 [. |& A) R5 v$ p" {$ E* e9 Q3 F
/ b4 q: \' J7 d9 Q7 o  q. Y  X
这个问题的答案是:不建议共同使用。
' G5 X* U/ B, P5 I* S$ q) |. ^. A7 q
当然,这个问题还要分情况:相同外设和不同外设之间共同使用HAL和LL库。
; r8 [$ Z1 i: I) y* |+ r8 j8 `. s$ s* I7 k
1.不同外设混用HAL和LL库  z( n& u7 U. @/ ^

) Q$ `4 [1 T! H  ^3 i

. S) v2 b7 d; k# D( J这里说的不同外设混用HAL和LL库,针对的是不同外设。比如:UART使用HAL库,SPI使用LL库。' G) H% s+ A. t' u5 }7 N' p
% y8 E% i: K8 j! k/ h
这种情况下,一般来说:问题不大。, b; ?9 W# u0 w
4 ]& c9 t* x: {! t0 O
因为官方不管是从资料,还是从STM32CubeMX工具配置都没有反对这种做法。: R# D+ m/ F4 f9 a) n* p9 `1 c
5.png
虽没有明确说不允许这样操作,但实际项目不建议这种方式。9 O3 n2 _* y* T5 K% Y
. g5 O5 u* h" I, C
至于原因,相信不用我说,有项目经验的朋友都明白。这样做不利于代码移植,管理等工作。1 @1 K6 m6 e3 {+ O5 \. S
2 x1 V0 z" U3 O  Q5 f
2.相同外设混用HAL和LL库9 Y4 y! [1 p# q: x, ]4 ^
/ p+ f( U# L  `, b
# ]8 Q9 y* G% C  V" P3 m
这里才是本文重点,这种情况,官方其实也是不建议混合。
5 |6 e# b1 t0 }! D. o3 m: w, h, S; J  L" G5 I
0 B& [+ g+ T; M
如果混用,会存在一系列问题:底层冲突、结构混乱、管理不方便等。9 `5 b) i* z+ A& R8 ?  |/ Q
: v' x# U7 `9 A6 ?
LL库驱动独立,HAL包含驱动包4 ]5 ]( ?/ Y  J
  n* {' a8 j- V3 T0 x! P+ F" m

" }7 ?1 s, D8 V4 k拿STM32F4的UART传输函数来说,LL库的位于stm32f4xx_ll_usart.h:
0 b; g/ T$ N0 e
2.png
而HAL定义于stm32f4xx_hal_uart.c:
" R3 P, a4 c; C0 U% }
3.png

& }& r: }/ \7 e+ z' ?从这里可以看得出来,LL只需包含头文件即可,HAL要包含bsp包。0 C- R& @. g: I+ j. c7 m

, n4 `9 ~8 o5 f; @3 c

: q; j7 S: {( [4 \% @" _- w2 ^& k假如使用LL库的工程,想使用HAL库,需添加bsp包到工程。
7 a, Q0 i2 K  y$ T" c  X3 o1 m. a; t
* S/ c* H8 v* V) f/ c1 u, MHAL句柄
; j' h" L. Y$ Y% U3 Y& N% Q; |) j; T, @! W. _- Z- }) s4 h

# {( K0 Z6 j$ ^对于LL而言,使用HAL库,会多一个句柄,比如UART1:3 T1 l1 G" n' p; f$ p+ T

8 e7 ]" k0 d1 ?# e3 d

6 i! M0 e; U$ O2 {1 X. VUART_HandleTypeDef huart1;
* O& }+ A; d% G3 U' i3 E如果LL库的工程,直接调用HAL接口是不行的,缺少句柄。. ?. ?! r/ Y* O  j7 i/ E) h
' k6 i& F0 [& T5 I4 v! o2 b
中断请求处理$ D" V7 H4 J7 N; B4 E
1 K' e7 q$ N( Y5 G. Q+ K
, j5 u" B% d, E3 ?& X0 _) H3 c
HAL和LL的中断请求IRQ方式其实是不一样的,混用之后很容易出错。
( M3 w, y; T' {- u4 y0 b
, t2 e) [- e7 l/ M这里简单举例说这些,深入理解底层的朋友应该知道,还有许多地方也是不建议混用。; ~9 E, Y; J1 h. b$ e$ }! _

$ f- S6 Z- q$ Q6 p! k' |8 `1 `当然,不是绝对的(不能混用),我想说:万不得已,慎用。, g( T, y& W4 _
3 Q& w- P, k3 a3 E1 H4 Q. v
收藏 评论1 发布时间:2020-10-26 15:52

举报

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

所属标签

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