hal库选择滴答时钟函数_STM32入门 : HAL库、标准外设库、LL库
??國內使用STM32 單片機的人很多,ST 為開發者提供了非常方便的開發庫:有標準外設庫(SPL 庫)、HAL 庫、LL 庫 三種。前者是ST的老庫,后兩者是ST現在主推的開發庫,其中 LL 庫是 ST 新添加的,隨 HAL 源碼包一起提供。各庫關系如下所示:
??其中,SPL 庫 和 HAL 庫兩者相互獨立,互不兼容,標準外設庫比較老了,現在推薦使用HAL/LL庫。幾種庫的比較如下:
??目前幾種庫對不同芯片的支持情況如下:
以下是標準庫支持的stm32系列,和上圖是一致的,可見標準庫并不支持最新的高性能的F7/H7系列:
??ST 中文官網上有一篇關于ST庫函數的代碼性能的對比:
STM32 Snippets
stm32 snippet是高度優化的代碼示例的集合,它使用符合CMSIS規范的直接寄存器訪問方式來減少代碼開銷,從而使STM32 mcu在各種應用程序中的性能達到最大化。目前STM32系列共有100多個snippet片段代碼,演示了如何以最小的內存占用率、高效地使用STM32外圍設備。stm32 snippet是直接讀寫STM32的外設寄存器,需要開發者直接操作外設寄存器,對開發者要求比較高。
??這個庫使用比較少,目前只在 STM32F0 和 STM32L0 系列中有提供,如下圖所示:
stm32 snippet就是將 MCU 中的寄存器進行了結構化的封裝,庫文件主要就是一些 .h 文件。如下是對 ADC 的封裝
typedef struct{
__IO uint32_t ISR; ?/*!< ADC Interrupt and Status register,Address offset:0x00 */
__IO uint32_t IER; ?/*!< ADC Interrupt Enable register, Address offset:0x04 */
__IO uint32_t CR; ? /*!< ADC Control register, ?Address offset:0x08 */
__IO uint32_t CFGR1; ? /*!< ADC Configuration register 1, Address offset:0x0C */
__IO uint32_t CFGR2; ? /*!< ADC Configuration register 2, Address offset:0x10 */
__IO uint32_t SMPR; ? ?/*!< ADC Sampling time register, Address offset:0x14 */
uint32_t ? RESERVED1; ?/*!< Reserved, ?0x18 */
uint32_t ? RESERVED2; ?/*!< Reserved, ?0x1C */
__IO uint32_t TR; ? ? ?/*!< ADC watchdog threshold register,Address offset:0x20 */
uint32_t ? RESERVED3; ?/*!< Reserved,0x24 */
__IO uint32_t CHSELR; ?/*!< ADC channel selection register, Address offset:0x28 */
uint32_t ? RESERVED4[5]; ?/*!< Reserved, 0x2C */
__IO uint32_t DR; ? ? ? ?/*!< ADC data register, Address offset:0x40 */
}ADC_TypeDef;
typedef struct{
__IO uint32_t CCR;}ADC_Common_TypeDef;
在實際使用時,我們就可以結構化的訪問 MCU 的寄存器,如下是配置 ADC 的函數實現:
__INLINE void ConfigureADC(void){
ADC1->CFGR2 |= ADC_PRESCALER;
ADC1->CFGR1 |= ADC_CFGR1_AUTOFF;
ADC1->CHSELR = ADC_CHSELR_CHSEL17;
ADC1->SMPR |= ADC_SMPR_SMP_0 | ADC_SMPR_SMP_1 | ADC_SMPR_SMP_2;
ADC->CCR |= ADC_CCR_VREFEN;
}
標準外設庫(Standard Peripheral Libraries)
??標準外設庫(Standard Peripherals Library)是對 STM32 芯片的一個完整的封裝,包括所有標準器件外設的器件驅動器。幾乎全部使用 C 語言實現。但是,標準外設庫也是針對某一系列芯片而言的,沒有可移植性。
??相對于 HAL 庫,標準外設庫仍然接近于寄存器操作,其是將一些基本的寄存器操作封裝成了 C 函數。相對于 STM32 Snippets,標準外設庫對各外設進行了一次封裝,而不是僅僅局限在對寄存器的封裝,標準外設庫實現了各外設的基本操作接口。
??標準外設庫的文件基本架構并不復雜。下圖顯示了 STM32F10xx 標準外設庫文件的基本架構
其他系列的庫文件結構和上圖基本都是一致的。ppp是代表不同的具體外設,比如ADC、DAC、SPI。。。
?STM32 的標準外設庫涵蓋以下內容:
位域和寄存器的完整的寄存器地址映射
涵蓋所有外圍功能的例程和數據結構的集合。
一組包含所有可用外設的示例,其中包含最常用的開發工具的模板項目。
STM32Cube
??ST 為新的標準庫注冊了一個新商標:STMCube?。并且,ST專門為其開發了配套的桌面軟件 STMCubeMX,開發者可以直接使用該軟件進行可視化配置,大大節省開發時間。
??這其中就包含了 HAL 庫和LL 庫。如下圖:
??從上圖看出,LL 庫和 HAL 庫兩者相互獨立,只不過 LL 庫更底層。而且,部分 HAL 庫會調用LL庫(例如:USB驅動)。同樣,LL 庫也會調用 HAL 庫
??用戶可以使用 STMCubeMX 直接生成對應芯片的整個項目(目前主流開發工具IAR/KEIL的項目全支持),STMCubeMX 負責給整理各種需要的源碼文件。
HAL 庫
??HAL是 Hardware Abstraction Layer 的縮寫,即硬件抽象層。HAL 庫是 ST 為 STM32 最新推出的抽象層嵌入式軟件,可以更好的確保跨 STM32 產品的最大可移植性。該庫提供了一整套一致的中間件組件,如 RTOS、USB、TCP/IP 和圖形庫等。
??ST的中間件堆棧有USB 主機和設備庫,STemWin圖形庫、FreeRTOS,FatFs,LwIP等。HAL 庫就是用來取代之前的標準外設庫的。相比標準外設庫,STM32Cube HAL 庫表現出更高的抽象水平,HAL API 集中關注各外設的公共函數功能,這樣便于定義一套通用的用戶友好的API函數接口,從而可以輕松實現從一個STM32產品移植到另一個不同的STM32系列產品。HAL庫是ST未來主推的庫,當前ST新出的芯片已經沒有STD庫了,比如 F7/H7系列都沒有標準庫,只有HAL/LL庫。目前,HAL庫已經支持STM32全線產品。關于HAL庫的使用,在后續推文中將重點介紹。
LL 庫
??LL庫(Low Layer)是 ST 新增的庫,與 HAL 庫捆綁發布,文檔也是和 HAL 庫文檔在一起的,比如:在STM32F3x 的 HAL 庫說明文檔中,ST 新增了LL庫這一章節。LL 庫更接近硬件層,是直接操作寄存器,效率更高,很少在復雜外設中使用。其支持所有外設。使用有兩種方法:
獨立使用,該庫完全獨立實現,可以完全拋開 HAL 庫,只用LL庫編程完成。在使用STM32CubeMX生成項目時,直接選LL庫即可。如果使用了復雜的外設,例如 USB,則會調用 HAL 庫
混合使用,和 HAL 庫結合使用。
目前,CubeMX 在生成項目時,可以選擇采用 LL 庫。
??LL 庫文件的命名方式和 HAL 庫基本相同。LL 庫就是原來的標準外設庫移植到 Cube下的新的實現,但是其實現方法更加高效、簡潔。使用 LL 庫編程和使用標準外設庫的方式基本一樣,會得到比標準外設庫更高的效率。
視頻簡單示例stm32cubeMX:
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的hal库选择滴答时钟函数_STM32入门 : HAL库、标准外设库、LL库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gpu的单位表示_GPU是如何工作的
- 下一篇: 英伟达驱动更新记录_N卡驱动更新软件(N