黃工的嵌入式技術 發表於 2020-02-28 16:57:10
這是一位讀者問的問題,我覺得很多人應該都有這種疑惑,所以特地寫篇文章分享給大家。
一、標準外設庫停更了
很多學習STM32的朋友都比較依賴之前的標準外設庫(StdPeriph_Lib),我想告訴大家一個事實,那就是標準外設庫已經停更很久了。
支持標準外設庫的STM32,只有相對較老的系列:F0、 F1、 F2、 F3、 F4、 L1.
我特地看了下,STM32標準外設庫最後一次更新時間是2016年11月的F4系列。
標準外設庫地址:
https://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries.html
這後面出來的L0、 L4、 L5、 F7、 H7、 G0、 G4等都沒有標準外設庫了。
所以,使用STM32CubeHAL將成為今後的的主流。這裡就出來了一個問題:該使用HAL,還是LL開發呢?
二者能共同共同開發嗎?
拓展文章:
關於STM32的四類嵌入式軟體庫
STM32Cube LL能高效的原因
二、HAL和LL庫能共同使用嗎?
這個問題的答案是:不建議共同使用。
當然,這個問題還要分情況:相同外設和不同外設之間共同使用HAL和LL庫。
1.不同外設混用HAL和LL庫
這裡說的不同外設混用HAL和LL庫針對的不同外設。比如:UART使用HAL庫,SPI使用LL庫。
這種情況下,一般來說:沒問題。
因為官方不管是從資料,還是從STM32CubeMX工具配置都沒有反對這種做法。
這雖然沒有明確說不允許這樣操作,但實際項目不建議這種方式。
至於原因,相信不用我說,有項目經驗的朋友都明白。這樣做不利於代碼移植,管理等工作。
2.相同外設混用HAL和LL庫
這裡才是本文重點,這種情況,官方其實也是建議:不允許。
這樣混用,會存在一系列問題:底層衝突、結構混亂、管理不方便等。
LL庫驅動獨立,HAL包含驅動包
拿STM32F4的UART傳輸函數來說,LL庫的位於stm32f4xx_ll_usart.h:
而HAL定義於stm32f4xx_hal_uart.c:
從這裡可以看得出來,LL只需包含頭文件即可,HAL要包含bsp包。
假如使用LL庫的工程,想使用HAL庫,需添加bsp包到工程。
HAL句柄
對於LL而言,使用HAL庫,會多一個句柄,比如UART1:
UART_HandleTypeDef huart1;
如果LL庫的工程,直接調用HAL接口是不行的,缺少句柄。
中斷請求處理
HAL和LL的中斷請求IRQ方式其實是不一樣的,混用之後很容易出錯。
這裡簡單舉例說這些,深入理解底層的朋友應該知道,還有許多地方也是不建議混用。
當然,不是絕對的(不能混用),我想說:萬不得已,慎用。
打開APP閱讀更多精彩內容聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴