STM32 HAL庫和LL庫的區別

    上次開發一個項目,使用一個小容量的STM32 ARM CORTEX核心的單片機,使用STM32CUBEMX自動生成配置代碼,正準備編寫程序的時候,發現容量竟然有6K多。這個容量在使用大容量FLASH的單片機時不感到什麼,可是使用小容量單片機的時候,就明顯不夠用了。

    沒有辦法,只好打算回去使用原來的StdLib庫,前兩年不就這麼幹的嘛,也沒什麼難的。可是回頭找對應庫的時候,發現悲劇了,沒有這個序列的標準庫。

    這也難不倒我們老司機!我就從HAL庫裏面把必須的寄存器語句摘出來,把冗餘的有效檢驗和衝突處理去掉,不就精簡下來了麼,就這麼幹!

    打開“Drivers\STM32F0xx_HAL_Driver\Src”的目錄,突然發現除了一般常用的“stm32f0xx_hal_”開頭的文件,還有“stm32f0xx_ll_”開頭的文件,這是什麼鬼?!而且這兩種文件都是一一對應的,每個模塊,GPIO, RCC, CRC, DMA,... ,都有對應的文件。打開看看,跟hal的一對比,發現精簡很多。

    我一下子精神了,意識到這是一個精簡的庫。於是上網查資料,終於查到了,這是STM32Cube LL庫,看起來比較新,似乎是ST最近推出來的。

LL1-COMP.png

    看上表也發現它的優化性(內存和MIPS)好很多,只是產品線覆蓋還沒有全,但我需要的系列是有的。

LL2 AVAIL.png

    於是,果斷用它,並做了一下小小的對比。

    我使用一款16k的單片機,配置的時候把UART, ADC, GPIO功能打開,分別用HAL庫和LL庫生成後,使用KEIL 5進行編譯,做了對比。

    以下是芯片配置:

LL3 CHIP.png

    以下是編譯後的代碼對比:

HAL庫Program Size: Code=5376 RO-data=232 RW-data=8 ZI-data=1232  
LL庫Program Size: Code=1804 RO-data=232 RW-data=4 ZI-data=1028  

    是不是相當震撼,編譯後LL庫只有HAL庫的33%體積。

    太完美了,於是我使用LL庫完成了剩餘的編程工作。LL庫基本是基於寄存器的操作,有的模塊需要再自己再配置一下。比如Systick在使用STM32CUBEMX之後並不運行,需要Enable一下,並把IRQ打開。

     LL庫的選擇,在STM32CUBEMX中,點擊菜單的“Project”-->“Settings”,在下面的界面中選擇“Advanced Settings”,然後在每個模塊後面選擇使用的庫。

LL4 MX.png


STM32 HAL庫和LL庫的更多說明,見:http://www.st.com/content/ccc/resource/sales_and_marketing/presentation/product_presentation/37/55/ff/bc/a8/71/4f/c5/stm32_embedded_software_offering.pdf/files/stm32_embedded_software_offering.pdf/jcr:content/translations/en.stm32_embedded_software_offering.pdf


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章