因为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 很多学习STM32的朋友都比较依赖之前的标准外设库(StdPeriph_Lib),我想告诉大家一个事实,那就是标准外设库已经停更很久了。- U; F4 c3 `0 K 支持标准外设库的STM32,只有相对较老的系列:F0、 F1、 F2、 F3、 F4、 L1. 标准外设库地址:, 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 (公号不支持外链接,请复制链接到浏览器打开) 这后面出来的L0、 L4、 L5、 F7、 H7、 G0、 G4、MP1等都没有标准外设库了。 所以,使用STM32CubeHAL将成为今后的的主流。这里就出来了一个问题:该使用HAL,还是LL开发呢? / x3 D- x- J9 K/ B$ | 5 h0 C: `! t* k 二者能共同共同开发吗? ' u8 f5 i9 o/ \9 h' a 拓展阅读: " K4 h! v) R( w: X P: F$ s 关于STM32的四类嵌入式软件库 V7 q- Q8 ^7 \, Y. | STM32Cube LL能高效的原因 二、HAL和LL库能混合使用吗?. n% S8 O b- ^7 G3 _ 这个问题的答案是:不建议共同使用。+ ]! C1 i& g( t 当然,这个问题还要分情况:相同外设和不同外设之间共同使用HAL和LL库。6 J- `( C* a Z' i$ e ' |& B- H& E1 b$ F% k. A" {" S 1.不同外设混用HAL和LL库 这里说的不同外设混用HAL和LL库,针对的是不同外设。比如:UART使用HAL库,SPI使用LL库。 + 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$ o. n6 |# z% S2 W- F& C2 y 2.相同外设混用HAL和LL库 这里才是本文重点,这种情况,官方其实也是不建议混合。- ]* 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 拿STM32F4的UART传输函数来说,LL库的位于stm32f4xx_ll_usart.h:. a0 |) f, T4 J/ r4 u 从这里可以看得出来,LL只需包含头文件即可,HAL要包含bsp包。- G* x% T1 |, ]' R3 `; a 假如使用LL库的工程,想使用HAL库,需添加bsp包到工程。6 ~+ [$ h6 W& O* C( o3 l- m HAL句柄 - E0 R6 j) u0 Y( M% }) m. k 对于LL而言,使用HAL库,会多一个句柄,比如UART1:; j- M6 i# Z& Y& h 4 S6 C/ ^& g7 S0 t# G4 | UART_HandleTypeDef huart1; 如果LL库的工程,直接调用HAL接口是不行的,缺少句柄。( h" d; Z E( `- c, y j$ J * c) O4 w' ?' W! M, \ 中断请求处理 HAL和LL的中断请求IRQ方式其实是不一样的,混用之后很容易出错。' X" j9 f3 {% m+ i# `7 j : J- c$ V5 B, ` V 这里简单举例说这些,深入理解底层的朋友应该知道,还有许多地方也是不建议混用。 8 x8 h! `6 e6 z) A, v+ h 当然,不是绝对的(不能混用),我想说:万不得已,慎用。 Q! m( N2 r# Z) |) b |
不是我想混合使用HAL和LL库,遇到过官方HAL库自己调用了LL库。 |