
因为STM32标准外设库已经停更了,导致很多开发者都转向了HAL,但一些读者可能比较疑惑,有HAL和LL两种库,到底能不能混合使用呢? ! f6 V* y t* v 一、标准外设库停更了 ( 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 ![]() 标准外设库地址:* 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 (公号不支持外链接,请复制链接到浏览器打开); R! v! O0 R2 ]2 ^* g; a 这后面出来的L0、 L4、 L5、 F7、 H7、 G0、 G4、MP1等都没有标准外设库了。 所以,使用STM32CubeHAL将成为今后的的主流。这里就出来了一个问题:该使用HAL,还是LL开发呢? 3 \0 g# f' B' D% ^2 R 二者能共同共同开发吗?$ J. w" p2 G! w% w! [4 f0 P# ] 拓展阅读:0 B7 `& r. m( a5 M% l( R) ~ 3 d$ J h6 U# r1 Y/ X3 p 关于STM32的四类嵌入式软件库 : i' J- | W. E n" H! F+ y( ?! s u A1 P STM32Cube LL能高效的原因 / S2 q8 b* v. ~' g 二、HAL和LL库能混合使用吗? $ p" {$ E* e9 Q3 F / b4 q: \' J7 d9 Q7 o q. Y X 这个问题的答案是:不建议共同使用。 * S$ q) |. ^. A7 q 当然,这个问题还要分情况:相同外设和不同外设之间共同使用HAL和LL库。 + r8 j8 `. s$ s* I7 k 1.不同外设混用HAL和LL库 z( n& u7 U. @/ ^ 这里说的不同外设混用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 ![]() . 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 这里才是本文重点,这种情况,官方其实也是不建议混合。 : 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 拿STM32F4的UART传输函数来说,LL库的位于stm32f4xx_ll_usart.h: ![]() ![]() 从这里可以看得出来,LL只需包含头文件即可,HAL要包含bsp包。0 C- R& @. g: I+ j. c7 m 假如使用LL库的工程,想使用HAL库,需添加bsp包到工程。 HAL句柄 ; |) j; T, @! W. _- Z- }) s4 h 对于LL而言,使用HAL库,会多一个句柄,比如UART1:3 T1 l1 G" n' p; f$ p+ T UART_HandleTypeDef huart1; 如果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方式其实是不一样的,混用之后很容易出错。 这里简单举例说这些,深入理解底层的朋友应该知道,还有许多地方也是不建议混用。; ~9 E, Y; J1 h. b$ e$ }! _ 当然,不是绝对的(不能混用),我想说:万不得已,慎用。, g( T, y& W4 _ 3 Q& w- P, k3 a3 E1 H4 Q. v |
不是我想混合使用HAL和LL库,遇到过官方HAL库自己调用了LL库。 |