hal库选择滴答时钟函数_STM32入门 : HAL库、标准外设库、LL库
??國內(nèi)使用STM32 單片機(jī)的人很多,ST 為開發(fā)者提供了非常方便的開發(fā)庫:有標(biāo)準(zhǔn)外設(shè)庫(SPL 庫)、HAL 庫、LL 庫 三種。前者是ST的老庫,后兩者是ST現(xiàn)在主推的開發(fā)庫,其中 LL 庫是 ST 新添加的,隨 HAL 源碼包一起提供。各庫關(guān)系如下所示:
??其中,SPL 庫 和 HAL 庫兩者相互獨(dú)立,互不兼容,標(biāo)準(zhǔn)外設(shè)庫比較老了,現(xiàn)在推薦使用HAL/LL庫。幾種庫的比較如下:
??目前幾種庫對(duì)不同芯片的支持情況如下:
以下是標(biāo)準(zhǔn)庫支持的stm32系列,和上圖是一致的,可見標(biāo)準(zhǔn)庫并不支持最新的高性能的F7/H7系列:
??ST 中文官網(wǎng)上有一篇關(guān)于ST庫函數(shù)的代碼性能的對(duì)比:
STM32 Snippets
stm32 snippet是高度優(yōu)化的代碼示例的集合,它使用符合CMSIS規(guī)范的直接寄存器訪問方式來減少代碼開銷,從而使STM32 mcu在各種應(yīng)用程序中的性能達(dá)到最大化。目前STM32系列共有100多個(gè)snippet片段代碼,演示了如何以最小的內(nèi)存占用率、高效地使用STM32外圍設(shè)備。stm32 snippet是直接讀寫STM32的外設(shè)寄存器,需要開發(fā)者直接操作外設(shè)寄存器,對(duì)開發(fā)者要求比較高。
??這個(gè)庫使用比較少,目前只在 STM32F0 和 STM32L0 系列中有提供,如下圖所示:
stm32 snippet就是將 MCU 中的寄存器進(jìn)行了結(jié)構(gòu)化的封裝,庫文件主要就是一些 .h 文件。如下是對(duì) 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;
在實(shí)際使用時(shí),我們就可以結(jié)構(gòu)化的訪問 MCU 的寄存器,如下是配置 ADC 的函數(shù)實(shí)現(xiàn):
__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;
}
標(biāo)準(zhǔn)外設(shè)庫(Standard Peripheral Libraries)
??標(biāo)準(zhǔn)外設(shè)庫(Standard Peripherals Library)是對(duì) STM32 芯片的一個(gè)完整的封裝,包括所有標(biāo)準(zhǔn)器件外設(shè)的器件驅(qū)動(dòng)器。幾乎全部使用 C 語言實(shí)現(xiàn)。但是,標(biāo)準(zhǔn)外設(shè)庫也是針對(duì)某一系列芯片而言的,沒有可移植性。
??相對(duì)于 HAL 庫,標(biāo)準(zhǔn)外設(shè)庫仍然接近于寄存器操作,其是將一些基本的寄存器操作封裝成了 C 函數(shù)。相對(duì)于 STM32 Snippets,標(biāo)準(zhǔn)外設(shè)庫對(duì)各外設(shè)進(jìn)行了一次封裝,而不是僅僅局限在對(duì)寄存器的封裝,標(biāo)準(zhǔn)外設(shè)庫實(shí)現(xiàn)了各外設(shè)的基本操作接口。
??標(biāo)準(zhǔn)外設(shè)庫的文件基本架構(gòu)并不復(fù)雜。下圖顯示了 STM32F10xx 標(biāo)準(zhǔn)外設(shè)庫文件的基本架構(gòu)
其他系列的庫文件結(jié)構(gòu)和上圖基本都是一致的。ppp是代表不同的具體外設(shè),比如ADC、DAC、SPI。。。
?STM32 的標(biāo)準(zhǔn)外設(shè)庫涵蓋以下內(nèi)容:
位域和寄存器的完整的寄存器地址映射
涵蓋所有外圍功能的例程和數(shù)據(jù)結(jié)構(gòu)的集合。
一組包含所有可用外設(shè)的示例,其中包含最常用的開發(fā)工具的模板項(xiàng)目。
STM32Cube
??ST 為新的標(biāo)準(zhǔn)庫注冊(cè)了一個(gè)新商標(biāo):STMCube?。并且,ST專門為其開發(fā)了配套的桌面軟件 STMCubeMX,開發(fā)者可以直接使用該軟件進(jìn)行可視化配置,大大節(jié)省開發(fā)時(shí)間。
??這其中就包含了 HAL 庫和LL 庫。如下圖:
??從上圖看出,LL 庫和 HAL 庫兩者相互獨(dú)立,只不過 LL 庫更底層。而且,部分 HAL 庫會(huì)調(diào)用LL庫(例如:USB驅(qū)動(dòng))。同樣,LL 庫也會(huì)調(diào)用 HAL 庫
??用戶可以使用 STMCubeMX 直接生成對(duì)應(yīng)芯片的整個(gè)項(xiàng)目(目前主流開發(fā)工具IAR/KEIL的項(xiàng)目全支持),STMCubeMX 負(fù)責(zé)給整理各種需要的源碼文件。
HAL 庫
??HAL是 Hardware Abstraction Layer 的縮寫,即硬件抽象層。HAL 庫是 ST 為 STM32 最新推出的抽象層嵌入式軟件,可以更好的確保跨 STM32 產(chǎn)品的最大可移植性。該庫提供了一整套一致的中間件組件,如 RTOS、USB、TCP/IP 和圖形庫等。
??ST的中間件堆棧有USB 主機(jī)和設(shè)備庫,STemWin圖形庫、FreeRTOS,FatFs,LwIP等。HAL 庫就是用來取代之前的標(biāo)準(zhǔn)外設(shè)庫的。相比標(biāo)準(zhǔn)外設(shè)庫,STM32Cube HAL 庫表現(xiàn)出更高的抽象水平,HAL API 集中關(guān)注各外設(shè)的公共函數(shù)功能,這樣便于定義一套通用的用戶友好的API函數(shù)接口,從而可以輕松實(shí)現(xiàn)從一個(gè)STM32產(chǎn)品移植到另一個(gè)不同的STM32系列產(chǎn)品。HAL庫是ST未來主推的庫,當(dāng)前ST新出的芯片已經(jīng)沒有STD庫了,比如 F7/H7系列都沒有標(biāo)準(zhǔn)庫,只有HAL/LL庫。目前,HAL庫已經(jīng)支持STM32全線產(chǎn)品。關(guān)于HAL庫的使用,在后續(xù)推文中將重點(diǎn)介紹。
LL 庫
??LL庫(Low Layer)是 ST 新增的庫,與 HAL 庫捆綁發(fā)布,文檔也是和 HAL 庫文檔在一起的,比如:在STM32F3x 的 HAL 庫說明文檔中,ST 新增了LL庫這一章節(jié)。LL 庫更接近硬件層,是直接操作寄存器,效率更高,很少在復(fù)雜外設(shè)中使用。其支持所有外設(shè)。使用有兩種方法:
獨(dú)立使用,該庫完全獨(dú)立實(shí)現(xiàn),可以完全拋開 HAL 庫,只用LL庫編程完成。在使用STM32CubeMX生成項(xiàng)目時(shí),直接選LL庫即可。如果使用了復(fù)雜的外設(shè),例如 USB,則會(huì)調(diào)用 HAL 庫
混合使用,和 HAL 庫結(jié)合使用。
目前,CubeMX 在生成項(xiàng)目時(shí),可以選擇采用 LL 庫。
??LL 庫文件的命名方式和 HAL 庫基本相同。LL 庫就是原來的標(biāo)準(zhǔn)外設(shè)庫移植到 Cube下的新的實(shí)現(xiàn),但是其實(shí)現(xiàn)方法更加高效、簡潔。使用 LL 庫編程和使用標(biāo)準(zhǔn)外設(shè)庫的方式基本一樣,會(huì)得到比標(biāo)準(zhǔn)外設(shè)庫更高的效率。
視頻簡單示例stm32cubeMX:
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的hal库选择滴答时钟函数_STM32入门 : HAL库、标准外设库、LL库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gpu的单位表示_GPU是如何工作的
- 下一篇: 英伟达驱动更新记录_N卡驱动更新软件(N