03.08 stm32是用hal庫,還是標準庫?懂行的介紹一下?

電氣電子大佬辛


標準庫函數則是ST以前推出的,包括寄存器版本和庫函數版本。寄存器版本使用較麻煩,每個設置都要去查看芯片datasheet,好處是可以讓你熟悉芯片的寄存器配置。庫函數是基於寄存器版本進行二次封裝後

推出的,它的優勢就是寄存器版本的劣勢,方便了使用,不再需要手動去配置寄存器,使用更方便了。但是它的劣勢就是HAL的優勢,就是每次修改MCU功能,都需要手動去修改功能,而且自己修改也不能

保證正確性,程序代碼在不同MCU之間的移植性不強。

HAL庫,HAL是Hardware Abstraction Layer的縮寫,中文名稱是:硬件抽象層,HAL庫工程一般使用Cube軟件來生成工程。HAL庫是ST公司為STM32的MCU最新推出的抽象層嵌入式軟件,

更方便的實現跨STM32產品的最大可移植性。優勢就是不需要開發工程師再關注所用MCU型號,只需要專注所以要的功能軟件開發工作。而且是未來主推的方向,正在不斷的推出更新。

建議平時用的時候將自動更新關閉,否則會出現之前調試好的代碼因為更新導致不能正常工作。設置方法點Cube軟件的help,然後選擇手動更新,詳細見配圖。

以我和公司工程師研發經歷來看,最開始的時候都使用標準庫函數,後來發現ST推出HAL庫以後,慢慢都轉到HAL庫的開發。它的優勢在於不同芯片間軟件代碼的移植性非常強,而且用Cube軟件生成

的工程規定了自己的代碼放置位置,如果不按規定寫,重新用Cube生成工程時自己的代碼會被覆蓋,進一步加強了代碼的移植性。

另外,如果需要修改MCU的功能,比如新添加GPIO或者串口,採用標準庫函數的時候,需要複製其他串口的初始化代碼,然後手動修改。而採用HAL庫則不需要,只需要在Cube添加設置,然後生成即可,

Cube自動幫你把初始化代碼生成。

綜上所述,建議新手直接使用HAL庫,這樣更容易上手,更快的開發出所需要的軟件功能。將繁瑣的寄存器配置工作,交給Cube軟件即可,這也符合未來開發的主流思想。



招財機器人


1.首先介紹下什麼是HAL固件庫?

STM32 HAL固件庫是Hardware Abstraction Layer的縮寫,中文名稱是:硬件抽象層。HAL庫是ST公司為STM32的MCU最新推出的抽象層嵌入式軟件,為更方便的實現跨STM32產品的最大可移植性。HAL庫的推出,可以說ST也慢慢的拋棄了原來的標準固件庫,這也使得很多老用戶不滿。但是HAL庫推出的同時,也加入了很多第三方的中間件,有RTOS,USB,TCP / IP和圖形等等。和標準庫對比起來,STM32的HAL庫更加的抽象,ST最終的目的是要實現在STM32系列MCU之間無縫移植,甚至在其他MCU也能實現快速移植。

2.HAL固件庫介紹

從本質上講,HAL庫和標準庫一樣都是提供了每個外設的API,我們只需要填寫好我們需要配置的參數就可以了。

而且,HAL庫在結構上和標準庫基本也是類似,接口調用方式等都是一致的,只是改了一些叫法而已,例如之前標準庫叫stm32f4xx_xx.c,現在HAL庫叫stm32f4xx_hal_xx.c.

3.使用建議:

我們在實際使用過程中,建議使用HAL庫,只需要在STM32 Cube Mx軟件生成工程代碼以後,按照我們之前使用標準庫的方式一樣來繼續寫我們的邏輯代碼就好。


電子攻城獅


最開始在大學我學習stm32 的時候最早是使用寄存器來開發的。

當我把所有寄存器的例程跑了一遍以後,就又使用標準庫再把之前的例程再學習了一遍,之後再也沒有用過純寄存器開發的。

為什麼?因為沒有機會了,這時候我已經畢業了。在公司開始做項目,項目的緊迫性已經不再是以你學習實踐為目的,而是更快更高質量的完成項目開發工作,把產品推向市場。

再後來STM32出的型號越來越多,st為了把所有型號的庫使用統一的接口並且方便後續維護退出了STM32HAL庫和STM32LL庫。這兩種庫都可以基於STM32CUBEMX圖形化配置以後直接生成工程。而標準庫ST也不會再維護更新

所以很明顯最好就是使用ST最新的HAL庫或者LL庫。有的人可能會說HAL庫效率不高,我還是用標準庫吧,沒錯HAL是沒有標準庫效率高。但是有LL庫作為替補更接近底層。

目前我做的項目都是優先基於HAL庫來做,如果有些FLASH比較小的比如8k,我為了優化代碼空間大小會使用LL庫。


電子創客營


這個問題,我想我比較有發言權。

stm32的標準外設庫,是對stm32所有寄存器的封裝,包括對所有外設驅動的封裝。stm32的標準庫幾乎全部用c語言實現,雖然在stm32各芯片之間有通用性,但通用性不是很強,比如stm32f1和stm32f7之間的移植,就需要改動比較多了,因為它們之間的文件結構本來就有點不一樣,所以移植起來還是要廢點功夫的。

hal庫是st公司為了更方便地進行stm32之間的移植而開發的庫,通用性很強,在不同的兩款stm32芯片之間的移植基本上不需要修改。

標準庫其實就是對stm32寄存器的封裝,看上去比較簡單明瞭。st標準庫的封裝當時都是把寄存器封裝成結構體的形式,通過對結構體賦值從而控制寄存器。一般高數有初始化函數,使能函數,讀取狀態標誌位函數等。hal庫比較複雜,比如最簡單的串口中斷函數單獨調用了好幾層,所以文件比較大,編譯也需要更久的時間。

如果對性能有要求,感覺用標準庫甚至是直接操作寄存器比較合適,但是如果要可移植性強,我建議用hal庫。

當然,使用hal庫還可以用cubemx,直接配置完,一個工程文件就產生了,非常方便。

希望我的回答能幫到你。


Geek潮玩


顯然標準庫更有執行效率,針對外設來整合的,但是要操作一個片上外設,你需要了解其原理,知道需要配置哪些東西才能用起來。而hal庫很大程度上把功能整合了,只需要知道要幹什麼就行了。舉個簡單例子,標準庫使用外部中斷的方法:開gpio時鐘,配gpio,配置中斷管理,配置中斷線映射,寫中斷服務函數,其中包含查詢事件,清楚標誌位。而hal庫的gpio配置模式可以直接選擇中斷方式,中斷服務函數hal庫已經寫好了的,你只需要把中斷執行程序寫在相應callback函數里,不用關心什麼標誌位。hal本身還提供一個延時函數,由systick得到的精確延時,最關鍵的是可以搭配stm32cubeMX,圖形化操作進行外設配置,一鍵生成工程,然後就可以專注功能了。個人認為趨勢肯定是用hal庫,因為很多新的32一開始就不提供標準庫支持了,hal庫的效率降低將會由更高的處理能力彌補,其快速開發和高度可移植性將會更受歡迎。但是初學者還是應該腳踏實地,從標準庫學起,穿插一些寄存器操作的學習,然後才是hal庫。如果幹什麼都是調一個函數解決,那隨便叫個寫軟件的來頂替你不就好了。


just_仰望星空


我正好標準庫,Hal庫以及LL庫都用。

給你介紹下。

HAL庫是官方主推的,但是效率不高,而且BUG很多。

但是不影響它開發效率啊,幾乎可以做到不用關心底層就可以開心的開發應用。

以上純屬扯淡。。。

這個好用是好用,但是Bug是有的,而且有些地方說明不清晰。

比如我用F4的Sdio搭載Fatfs。這個Hal庫生成的驅動是不管用的。你只有調用官方例程移植過來才行。

還有一些奇奇怪怪的BUG。但是我建議還是一直跟上,官方更新速度奇快無比。現階段為了提升速度,可以選擇使用部分LL庫。效率大增。

這個庫還有個缺點就是會給編譯器增加很大的負擔。舉個例子,我只想從A到B,這個庫就基本上給你整成A-C-D-E-------B。然後編譯時間超級長。

標準庫基本上速度可以跟寄存器媲美(那是不可能的)。但是入手時間長一點,文檔非常豐富。但是最新款F7以後不支持了。但是學了標準庫玩HAL庫是so easy。

我可以負責任的告訴你,你會用寄存器那你用什麼庫都so easy。你會標準庫用HAL庫也是小菜一碟。所以,看你自己怎麼想的。標準庫要求你對手冊還要比較深入的瞭解。但是Hal庫幾乎可以放下手冊了。特別是時鐘及外設配置。

後面大家都要轉Nxp的Rt1050了,F7也許是絕唱了吧。h7性價比極地。


中國頂級科技評論人


HAL庫移植性好於標準庫,在滿足硬件平臺相同的情況呀,程序向上兼容,即F4的程序可以下到F7裡,但由於HAL庫為了實現這種效果,將底層封裝做的太臃腫,以至於效率太低,編譯時間特別長,而標準庫與之相比較移植性不強,但效率比HAL庫高,再對於同一個芯片,標準庫實現同樣的功能可能會出現不同的程序,但在兩臺電腦上僅有一兩個函數的差別,但卻不能添加或刪去這個函數,舉個例子,一臺機子上程序為ABCD,但另一臺子上是ACD,實現了同樣效果,但如果第一臺去了B卻可能無法實現這個效果。但總的來說,HAL庫容易上手且不會出現標準庫的問題,但標準庫幾乎適合任何條件,HAL要麼有Cube MX生成,或者VS生成,或者自己下了庫,但標準庫,可以在沒有cube mx或者vs,且沒有下載庫的情況下,而使用編譯器MDK自帶的庫


放棄給你自由


我以前一直用標準庫,後來發現cube裡的usb庫更完善和穩定,為了用這個usb庫,免去移植的麻煩,迫不得已,用cube,發現這個hel庫挺好用,而且官方一直在更新,完善,修改bug。目前已經整個了好多東西,jpg解碼,操作系統,usb文件系統等等。其實hal庫和標準庫是一個套路,原理都是一樣的。


分享到:


相關文章: