閱讀本專(zhuān)欄其他文章,有助于理解本文。??
一、開(kāi)發(fā)庫(kù)選擇
1.1 概述
STM32開(kāi)發(fā)相關(guān)的庫(kù)有很多,它們都是為了方便開(kāi)發(fā)者使用STM32微控制器而提供的軟件工具。根據(jù)不同的功能和層次,可以將它們分為以下幾類(lèi):
-
CMSIS庫(kù)(準(zhǔn)確來(lái)說(shuō)是CMSIS pack)(
Cortex Microcontroller Software Interface Standard
)是ARM公司推出的一種標(biāo)準(zhǔn)化的微控制器軟件接口,它定義了一些通用的數(shù)據(jù)類(lèi)型、寄存器訪(fǎng)問(wèn)、中斷處理、內(nèi)核功能等,方便開(kāi)發(fā)者使用Cortex-M內(nèi)核的各種功能。CMSIS庫(kù)還包括了一些中間件組件,如RTOS、DSP、Driver、Pack、SVD、DAP和NN等,提供了豐富的軟件功能。CMSIS庫(kù)不是HAL庫(kù),也不是標(biāo)準(zhǔn)庫(kù),它是一種與廠(chǎng)商(比如ST公司)無(wú)關(guān)的軟件層,可以在不同的微控制器上使用。 -
HAL庫(kù)(
Hardware Abstraction Layer
,硬件抽象層)是ST公司推出的一種硬件抽象層庫(kù),它提供了一套統(tǒng)一、簡(jiǎn)潔、易用的API函數(shù)接口,方便開(kāi)發(fā)者使用STM32的各種外設(shè)功能。HAL庫(kù)支持STM32全系列產(chǎn)品,具有可移植性、易用性和可靠性等優(yōu)點(diǎn)。HAL庫(kù)還提供了一些中間件組件,如RTOS,USB,TCP/IP和圖形等,可以快速實(shí)現(xiàn)復(fù)雜的功能。 -
標(biāo)準(zhǔn)庫(kù)(
Standard Peripheral Libraries
)是ST公司為STM32微控制器提供的一種固件函數(shù)包,它封裝了STM32所有外設(shè)的寄存器操作和中斷處理,提供了一套統(tǒng)一、簡(jiǎn)潔、易用的API函數(shù)接口,方便開(kāi)發(fā)者使用STM32的各種外設(shè)功能。標(biāo)準(zhǔn)庫(kù)支持STM32全系列產(chǎn)品,具有可移植性、易用性和可靠性等優(yōu)點(diǎn)。不過(guò),ST官方已經(jīng)不再更新STM32標(biāo)準(zhǔn)固件庫(kù),而是力推新的固件庫(kù):HAL庫(kù)。 -
LL庫(kù)(Low-Layer,底層)是ST公司最近(也不是最近,六七年了)新增的一種底層庫(kù),它與HAL庫(kù)捆綁發(fā)布,文檔也是和HAL文檔在一起的。 LL庫(kù)更接近硬件層,對(duì)需要復(fù)雜上層協(xié)議棧的外設(shè)不適用,直接操作寄存器。LL庫(kù)可以獨(dú)立使用,也可以和HAL庫(kù)結(jié)合使用。
-
其他第三方或開(kāi)源庫(kù):除了ST公司提供的官方庫(kù)外,還有許多第三方或開(kāi)源的軟件庫(kù)可以用于STM32開(kāi)發(fā),如
FreeRTOS、uCOS、FatFs、LwIP
等。這些軟件庫(kù)通常提供了一些特定領(lǐng)域或功能的解決方案,如實(shí)時(shí)操作系統(tǒng)、文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議等。
很顯然,CMSISI庫(kù)(主要是CORE)是最基本的,HAL、SPL、LL(STM32)都是基于CMSIS CORE進(jìn)一步進(jìn)行設(shè)計(jì)和開(kāi)發(fā)的,旨在降低開(kāi)發(fā)難度。
我們通常的、簡(jiǎn)單的開(kāi)發(fā)形式有:HAL庫(kù)開(kāi)發(fā)、LL庫(kù)開(kāi)發(fā)、SPL庫(kù)開(kāi)發(fā)、第三方庫(kù)開(kāi)發(fā)。
插一嘴:
一般,如果你使用正點(diǎn)原子的開(kāi)發(fā)板進(jìn)行學(xué)習(xí)或開(kāi)發(fā),就會(huì)看到他們的相關(guān)資料。你會(huì)看到:《xxx開(kāi)發(fā)指南HAL庫(kù)版本Vx.x》、《xxx開(kāi)發(fā)指南固件庫(kù)版本Vx.x》、《xxx開(kāi)發(fā)指南寄存器版本Vx.x》。
這里說(shuō)明一下:正點(diǎn)原子一些資料里面的“固件庫(kù)”、“標(biāo)準(zhǔn)庫(kù)”、“庫(kù)函數(shù)”,這些名詞一般都指的是:STM32 的 Standard Peripheral Library (
SPL
):標(biāo)準(zhǔn)外設(shè)庫(kù)(或SPL庫(kù)中的函數(shù))。(具體的看資料內(nèi)部描述即可)
實(shí)際上,固件庫(kù)不單單指的是SPL庫(kù),固件庫(kù)是指由芯片廠(chǎng)商提供的針對(duì)特定芯片或系列芯片的軟件包,它包含了對(duì)芯片外設(shè)的驅(qū)動(dòng)函數(shù)、示例代碼、中間件和實(shí)用工具等。固件庫(kù)的目的是為了簡(jiǎn)化開(kāi)發(fā)者對(duì)底層硬件的訪(fǎng)問(wèn)和操作,提供一個(gè)統(tǒng)一的、易于使用的編程接口。所以:LL庫(kù)、HAL庫(kù)、SPL庫(kù)都是固件庫(kù)。所以,當(dāng)您看到HAL固件庫(kù)這樣類(lèi)似的名詞時(shí)應(yīng)當(dāng)理解其就是HAL庫(kù)。
總之,注意一下,正點(diǎn)原子的一些資料可能把SPL庫(kù)叫做固件庫(kù)或標(biāo)準(zhǔn)庫(kù)。
1.2 CMSIS pack
CMSIS (Cortex
Microcontroller Software Interface Standard) 是 ARM 公司為其 Cortex-M
系列微控制器定義的一套軟件接口標(biāo)準(zhǔn)。這套標(biāo)準(zhǔn)旨在簡(jiǎn)化微控制器的軟件開(kāi)發(fā),使得開(kāi)發(fā)者可以更容易地開(kāi)發(fā)跨不同 Cortex-M 處理器系列和供應(yīng)商的嵌入式應(yīng)用程序。
提示: 閱讀本專(zhuān)欄其他文章,學(xué)習(xí)相關(guān)知識(shí)點(diǎn)。
CMSIS pack主要由以下幾部分組成:
-
CMSIS-CORE:提供了Cortex-M處理器的核心功能接口,包括NVIC、SysTick等。它還定義了處理器的寄存器訪(fǎng)問(wèn)、中斷向量和中斷函數(shù)名稱(chēng)。
-
CMSIS-DSP:一個(gè)為Cortex-M處理器優(yōu)化的數(shù)字信號(hào)處理庫(kù),提供了豐富的DSP函數(shù),如FFT、濾波器、矩陣運(yùn)算等。
-
CMSIS-RTOS:為實(shí)時(shí)操作系統(tǒng)提供了一個(gè)標(biāo)準(zhǔn)的API接口,使得開(kāi)發(fā)者可以輕松地在不同的RTOS之間切換。
-
CMSIS-Driver:定義了一套標(biāo)準(zhǔn)的外設(shè)驅(qū)動(dòng)接口,如UART、SPI、I2C等。
-
CMSIS-SVD:系統(tǒng)查看描述,提供了一個(gè)描述微控制器外設(shè)的XML格式。
-
CMSIS-Pack:定義了一個(gè)用于軟件組件、設(shè)備和板卡的描述、交付和安裝的標(biāo)準(zhǔn)。
1
這里的Standard Middleware(標(biāo)準(zhǔn)中間件),提供了一組更高級(jí)別的軟件組件,用于實(shí)現(xiàn)常見(jiàn)的嵌入式系統(tǒng)功能。比如RTOS、USB、文件系統(tǒng)等等。
CMSIS是ARM為Cortex-M系列MCU提供的標(biāo)準(zhǔn)API,而各個(gè)使用該內(nèi)核的芯片廠(chǎng)商(比如NXP、ST、intel),通常會(huì)在這些接口的基礎(chǔ)上進(jìn)一步開(kāi)發(fā)適用于自家芯片的 開(kāi)發(fā)庫(kù),比如ST的HAL、LL、SPL庫(kù)。
CMSIS的優(yōu)勢(shì)
-
跨平臺(tái):由于CMSIS是為Cortex-M系列微控制器定義的標(biāo)準(zhǔn),因此開(kāi)發(fā)者可以輕松地將代碼從一個(gè)Cortex-M處理器遷移到另一個(gè)處理器,而無(wú)需進(jìn)行大量的代碼修改。
-
高效性:CMSIS庫(kù)中的許多函數(shù)都經(jīng)過(guò)了優(yōu)化,以充分利用Cortex-M處理器的特性,如SIMD指令。
-
易于使用:CMSIS提供了清晰、一致的API,使得開(kāi)發(fā)者可以快速上手并開(kāi)始開(kāi)發(fā)。
-
強(qiáng)大的生態(tài)系統(tǒng):許多第三方供應(yīng)商和RTOS提供了對(duì)CMSIS的支持,這使得開(kāi)發(fā)者可以輕松地集成各種軟件組件和工具。
通常在進(jìn)行STM32開(kāi)發(fā)時(shí),不會(huì)直接使用CMSIS 的API,而是使用基于CMSISI的HAL庫(kù)或者SPL庫(kù),它們提供了更高級(jí)的抽象、更易用的API、更豐富的文檔、更好的IDE支持等等。
使用CMSIS庫(kù)可以獲得更精細(xì)粒度的控制、更強(qiáng)大額性能,在以下場(chǎng)景中,可能會(huì)直接使用CMISIS庫(kù):
- DSP開(kāi)發(fā),CMSIS-DSP已經(jīng)為Cortex-M系列微控制器進(jìn)行了優(yōu)化。對(duì)于需要高性能計(jì)算的應(yīng)用,直接使用這些函數(shù)可能會(huì)更有效。
- 如果開(kāi)發(fā)者希望他們的代碼能夠在不同的Cortex-M微控制器之間移植,那么直接使用CMSIS庫(kù)會(huì)更有意義,因?yàn)樗峁┝艘粋€(gè)標(biāo)準(zhǔn)化的接口。
- 使用RTOS。
1.3 SPL庫(kù)
STM32的SPL(Standard Peripheral Libraries),即標(biāo)準(zhǔn)外設(shè)庫(kù),是STMicroelectronics
為其STM32系列Cortex-M微控制器提供的軟件開(kāi)發(fā)庫(kù)。它為STM32微控制器上的各種外設(shè)提供了C語(yǔ)言的函數(shù)API,幫助開(kāi)發(fā)者簡(jiǎn)化硬件配置和使用。
STM32的SPL主要由以下幾部分組成:
-
外設(shè)驅(qū)動(dòng):為STM32微控制器上的各種外設(shè)(如GPIO、UART、SPI、I2C、ADC、TIM等)提供了驅(qū)動(dòng)函數(shù)。
-
CMSIS支持:SPL包括對(duì)CMSIS庫(kù)的支持,特別是CMSIS-CORE部分,為開(kāi)發(fā)者提供了對(duì)Cortex-M核心功能的訪(fǎng)問(wèn)。
-
系統(tǒng)配置:包括系統(tǒng)時(shí)鐘、中斷和其他基礎(chǔ)配置的函數(shù)。
-
工具鏈文件:如啟動(dòng)文件、鏈接腳本等,這些文件為特定的工具鏈(如GCC、Keil、IAR等)提供了支持。
-
示例代碼:STMicroelectronics通常會(huì)提供一些示例代碼,展示如何使用SPL來(lái)開(kāi)發(fā)應(yīng)用程序。
STM32 SPL 應(yīng)用程序的文件描述:
文件名 | 描述 |
---|---|
STM32 SPL | |
stm32yyxx_conf.h | 外設(shè)驅(qū)動(dòng)程序的配置文件。用戶(hù)可以通過(guò)使用模板啟用或禁用外設(shè)頭文件包含。此文件還可用于在編譯固件庫(kù)驅(qū)動(dòng)程序之前啟用或禁用庫(kù)運(yùn)行時(shí)失敗,通過(guò)預(yù)處理器定義USE_FULL_ASSERT |
stm32yyxx_ppp.h | PPP外設(shè)的頭文件 |
stm32yyxx_ppp.c | 用C語(yǔ)言編寫(xiě)的PPP外設(shè)的驅(qū)動(dòng)源代碼文件 |
stm32yyxx_it.h | 包含所有中斷處理程序原型的頭文件 |
stm32yyxx_it.c | 包含Cortex-Mx異常的中斷服務(wù)例程(ISR)的模板源文件。用戶(hù)可以為使用的外設(shè)添加額外的ISRs(有關(guān)可用的外設(shè)中斷處理程序的名稱(chēng),請(qǐng)參考startup_stm32yyxx.s) |
CMSIS | |
stm32yyxx.h | CMSIS Cortex-Mx STM32yyxx 設(shè)備外設(shè)訪(fǎng)問(wèn)層頭文件。這是應(yīng)用程序員在源代碼中使用的唯一包含文件 |
system_stm32yyxx.h | CMSIS Cortex-Mx STM32yyxx 設(shè)備外設(shè)訪(fǎng)問(wèn)層系統(tǒng)頭文件 |
system_stm32yyxx.c | CMSIS Cortex-Mx STM32yyxx 設(shè)備外設(shè)訪(fǎng)問(wèn)層系統(tǒng)源文件 |
2
SPL的優(yōu)勢(shì):
-
簡(jiǎn)化開(kāi)發(fā):STM32的SPL為微控制器的外設(shè)提供了高級(jí)的抽象,使得開(kāi)發(fā)者不需要深入了解硬件細(xì)節(jié)就可以配置和使用外設(shè)。
-
跨設(shè)備兼容性:由于SPL為STM32系列的微控制器提供了統(tǒng)一的API,因此開(kāi)發(fā)者可以更容易地在同一系列的不同微控制器之間移植代碼。
-
供應(yīng)商支持:使用SPL意味著可以獲得STMicroelectronics的支持,包括文檔、示例代碼和可能的固件更新。
SPL的局限性:
-
性能:由于SPL提供了高級(jí)的抽象,某些操作可能不如直接訪(fǎng)問(wèn)硬件寄存器那么快。
-
靈活性:雖然SPL為大多數(shù)常見(jiàn)的用例提供了支持,但對(duì)于一些特定的、非標(biāo)準(zhǔn)的需求,直接使用CMSIS或其他方法可能會(huì)更合適。
-
更新和維護(hù):STMicroelectronics已經(jīng)開(kāi)始推廣其HAL(硬件抽象層)庫(kù),并逐漸減少對(duì)SPL的支持。因此,新的STM32產(chǎn)品可能不再支持SPL,或者SPL可能不再獲得更新。
1.4 HAL 庫(kù)
HAL(Hardware Abstraction Layer),即硬件抽象層,是STMicroelectronics為其STM32系列微控制器提供的一個(gè)新的軟件開(kāi)發(fā)框架。與SPL(標(biāo)準(zhǔn)外設(shè)庫(kù))相比,HAL提供了更高級(jí)的抽象和更多的功能,旨在簡(jiǎn)化和加速STM32微控制器的開(kāi)發(fā)過(guò)程。
STM32的HAL庫(kù)主要由以下幾部分組成:
-
外設(shè)驅(qū)動(dòng):為STM32微控制器上的各種外設(shè)(如GPIO、UART、SPI、I2C、ADC、TIM等)提供了驅(qū)動(dòng)函數(shù)。
-
中間件支持:HAL庫(kù)包括對(duì)各種中間件的支持,如USB、TCP/IP、文件系統(tǒng)等。
-
系統(tǒng)配置:提供了系統(tǒng)時(shí)鐘、電源模式、中斷和其他基礎(chǔ)配置的函數(shù)。
-
回調(diào)機(jī)制:HAL庫(kù)使用了回調(diào)函數(shù)的機(jī)制,允許開(kāi)發(fā)者在特定的事件(如數(shù)據(jù)接收完成)發(fā)生時(shí)執(zhí)行自定義的代碼。
-
錯(cuò)誤處理:HAL庫(kù)提供了錯(cuò)誤處理和檢查機(jī)制,幫助開(kāi)發(fā)者識(shí)別和處理可能的錯(cuò)誤。
HAL庫(kù)的優(yōu)勢(shì):
-
模塊化和可重用性:HAL庫(kù)的設(shè)計(jì)使得開(kāi)發(fā)者可以輕松地重用代碼,特別是在不同的STM32微控制器之間。
-
跨設(shè)備兼容性:由于HAL為STM32系列的微控制器提供了統(tǒng)一的API,因此開(kāi)發(fā)者可以更容易地在同一系列的不同微控制器之間移植代碼。
-
集成開(kāi)發(fā)環(huán)境(IDE)支持:STMicroelectronics提供了STM32CubeMX工具,該工具可以自動(dòng)生成HAL庫(kù)的初始化代碼,進(jìn)一步簡(jiǎn)化了開(kāi)發(fā)過(guò)程。
-
持續(xù)更新和維護(hù):與SPL相比,HAL庫(kù)獲得了更多的更新和維護(hù),以支持新的STM32產(chǎn)品和功能。
HAL庫(kù)的局限性:
-
學(xué)習(xí)曲線(xiàn):對(duì)于習(xí)慣于使用SPL或直接訪(fǎng)問(wèn)硬件寄存器的開(kāi)發(fā)者來(lái)說(shuō),HAL庫(kù)可能需要一些時(shí)間來(lái)熟悉。
-
性能考慮:雖然HAL庫(kù)為開(kāi)發(fā)者提供了很多便利,但它的高級(jí)抽象可能會(huì)導(dǎo)致某些操作的性能略有下降。
1.5 LL庫(kù)
STM32的LL庫(kù)((Low Layer))是STM32Cube庫(kù)的一部分,旨在為STM32外設(shè)提供一個(gè)簡(jiǎn)化的API集,同時(shí)保持最大的靈活性。LL庫(kù)是一個(gè)更接近硬件的編程接口,與HAL(硬件抽象層)庫(kù)相比,它提供了更低的抽象級(jí)別。
主要特點(diǎn):
-
性能:由于LL庫(kù)提供了更接近硬件的API,因此它通常比HAL庫(kù)更快,尤其是在中斷處理程序中。
-
簡(jiǎn)單性:LL庫(kù)的API設(shè)計(jì)得更簡(jiǎn)單,更直接,使得代碼更容易閱讀和維護(hù)。
-
靈活性:LL庫(kù)提供了對(duì)STM32外設(shè)的完全控制,允許開(kāi)發(fā)人員更好地優(yōu)化其應(yīng)用程序。
-
與HAL的互操作性:LL庫(kù)可以與HAL庫(kù)一起使用,這意味著開(kāi)發(fā)人員可以在同一個(gè)項(xiàng)目中混合使用兩者,根據(jù)需要選擇最佳的庫(kù)。
LL庫(kù)的組成:
-
外設(shè)初始化:LL庫(kù)提供了初始化外設(shè)的功能,這些功能通常比HAL庫(kù)提供的功能更簡(jiǎn)單,更直接。
-
外設(shè)控制:LL庫(kù)提供了一組函數(shù),允許開(kāi)發(fā)人員直接控制STM32外設(shè),而無(wú)需經(jīng)過(guò)任何中間抽象。
-
中斷處理:與HAL庫(kù)相比,LL庫(kù)提供了更簡(jiǎn)單、更直接的中斷處理函數(shù)。
使用LL庫(kù)的優(yōu)點(diǎn):
-
代碼大小:由于LL庫(kù)提供了更少的抽象,因此生成的代碼通常比使用HAL庫(kù)的代碼更小。
-
執(zhí)行速度:LL庫(kù)的函數(shù)通常比HAL庫(kù)的函數(shù)執(zhí)行得更快,因?yàn)樗鼈兲峁┝烁俚某橄蟆?/p>
-
更好的控制:LL庫(kù)允許開(kāi)發(fā)人員更直接地控制STM32外設(shè),這可以提供更好的性能和更低的功耗。
STM32Cube庫(kù)的組成如下:(STMicroelectronics為其STM32微控制器系列提供的一個(gè)全面的軟件開(kāi)發(fā)工具集)
HAL (Hardware Abstraction Layer):這是STM32Cube的核心部分,提供了一套完整的外設(shè)驅(qū)動(dòng)程序,用于STM32系列的微控制器。這些驅(qū)動(dòng)程序提供了一個(gè)高級(jí)的API,使開(kāi)發(fā)人員能夠輕松地訪(fǎng)問(wèn)STM32的各種功能。
LL (Low Layer):這是一個(gè)更接近硬件的驅(qū)動(dòng)程序集,為那些需要更高性能或更低級(jí)訪(fǎng)問(wèn)的應(yīng)用程序提供了一個(gè)選擇。
Middleware:STM32Cube還包含了一些中間件組件,如USB庫(kù)、TCP/IP堆棧、文件系統(tǒng)、RTOS接口等。
CMSIS (Cortex Microcontroller Software Interface Standard):這是ARM定義的一個(gè)標(biāo)準(zhǔn),用于開(kāi)發(fā)Cortex-M微控制器的應(yīng)用程序。STM32Cube包含了CMSIS核心和設(shè)備頭文件。
Utilities:這些是一些實(shí)用程序和工具,如數(shù)據(jù)結(jié)構(gòu)、數(shù)學(xué)函數(shù)、圖形界面庫(kù)等。
Examples and Templates:STM32Cube為STM32的各種開(kāi)發(fā)板提供了大量的示例代碼和模板,幫助開(kāi)發(fā)人員快速入門(mén)。
Configuration Tool:STM32CubeMX是一個(gè)圖形工具,允許用戶(hù)圖形化地配置STM32微控制器的外設(shè),并自動(dòng)生成初始化代碼。
1.6 寄存器開(kāi)發(fā)
STM32寄存器開(kāi)發(fā)是一種直接操作STM32微控制器內(nèi)部的寄存器來(lái)控制外設(shè)的開(kāi)發(fā)方式,它可以充分利用STM32的性能和靈活性,但也需要對(duì)寄存器的功能和地址有深入的了解。
STM32寄存器開(kāi)發(fā)的優(yōu)點(diǎn)是:
- 可以實(shí)現(xiàn)最高效的代碼執(zhí)行,無(wú)需調(diào)用庫(kù)函數(shù)或中間件。
- 可以實(shí)現(xiàn)最靈活的外設(shè)配置,無(wú)需受限于庫(kù)函數(shù)或中間件的參數(shù)。
- 可以實(shí)現(xiàn)最低層次的硬件控制,無(wú)需考慮庫(kù)函數(shù)或中間件的兼容性。
STM32寄存器開(kāi)發(fā)的缺點(diǎn)是:
- 需要對(duì)寄存器的功能和地址有深入的了解,否則容易出錯(cuò)或造成沖突。
- 需要編寫(xiě)大量的代碼,否則難以實(shí)現(xiàn)復(fù)雜的功能或邏輯。
- 需要手動(dòng)管理內(nèi)存和堆棧,否則容易出現(xiàn)溢出或泄漏。
有時(shí)候,直接使用寄存器進(jìn)行開(kāi)發(fā)也稱(chēng)作“裸機(jī)開(kāi)發(fā)”。但裸機(jī)開(kāi)發(fā)有時(shí)候也指不使用操作系統(tǒng)的開(kāi)發(fā)。
二、代碼對(duì)比
一個(gè)簡(jiǎn)單功能的實(shí)現(xiàn):點(diǎn)亮一個(gè) LED。以下是使用不同 STM32 開(kāi)發(fā)庫(kù)實(shí)現(xiàn)此功能的代碼示例(主要部分):
2.1 使用寄存器
直接操作STM32的硬件寄存器來(lái)配置和控制GPIO。
#define GPIOB_BASE 0x40020400
#define GPIOB_MODER ( *(volatile uint32_t*)(GPIOB_BASE) )
#define GPIOB_ODR ( *(volatile uint32_t*)(GPIOB_BASE + 0x14) )
int main(void) {
// 設(shè)置PB0為輸出模式
GPIOB_MODER |= (1 << 0);
while(1) {
GPIOB_ODR |= (1 << 0); // 點(diǎn)亮LED
}
}
2.2 使用CMSIS庫(kù)
使用CMSIS定義的結(jié)構(gòu)和宏來(lái)操作寄存器。
#include "stm32f4xx.h"
int main(void) {
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // 使能GPIOB時(shí)鐘
GPIOB->MODER |= GPIO_MODER_MODER0_0; // 設(shè)置PB0為輸出模式
while(1) {
GPIOB->ODR |= GPIO_ODR_OD0; // 點(diǎn)亮LED
}
}
2.3 使用SPL庫(kù)
使用STM32標(biāo)準(zhǔn)外設(shè)庫(kù)函數(shù)。
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
int main(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
while(1) {
GPIO_SetBits(GPIOB, GPIO_Pin_0); // 點(diǎn)亮LED
}
}
2.4 使用HAL庫(kù)
使用STM32硬件抽象層函數(shù)。
#include "stm32f4xx_hal.h"
GPIO_InitTypeDef GPIO_InitStructure;
int main(void) {
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStructure.Pin = GPIO_PIN_0;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
while(1) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 點(diǎn)亮LED
}
}
2.5 使用LL庫(kù)
使用STM32低層庫(kù)函數(shù)。
#include "stm32f4xx_ll_gpio.h"
#include "stm32f4xx_ll_bus.h"
int main(void) {
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_0, LL_GPIO_MODE_OUTPUT);
while(1) {
LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_0); // 點(diǎn)亮LED
}
}
2.6 使用RTOS
使用實(shí)時(shí)操作系統(tǒng)(如FreeRTOS)來(lái)控制LED。
#include "FreeRTOS.h"
#include "task.h"
#include "stm32f4xx_hal.h"
void LedTask(void *pvParameters) {
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStructure.Pin = GPIO_PIN_0;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
while(1) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 點(diǎn)亮LED
vTaskDelay(1000); // 延時(shí)1秒
}
}
int main(void) {
xTaskCreate(LedTask, "LED", 128, NULL, 1, NULL);
vTaskStartScheduler();
}
三、如何在軟件中選擇不同的庫(kù)
3.1 ARM MDK
如何新建工程、安裝pack以及MDK的各個(gè)功能,我前面的文章有詳細(xì)介紹。
假設(shè)我們使用的外設(shè)是GPIO。
再次回顧這張圖:
現(xiàn)在打開(kāi)MDK的RTE管理器,我們就很清楚的知道,無(wú)論使用SPL
還是使用HAL
庫(kù),都必須要選擇下圖CMSIS下的CORE
。因?yàn)檫@些庫(kù)都是基于CMSIS CORE(提供了訪(fǎng)問(wèn)和控制MCU的核心API)進(jìn)行進(jìn)一步開(kāi)發(fā)的。
上面這些選項(xiàng)(software component),與你安裝的pack有關(guān),不一定都是這些內(nèi)容,其作用分別是(當(dāng)然你看后面的Description也是一樣的):
大類(lèi) | 是什么 | 有什么用 |
---|---|---|
Board Support | 與特定開(kāi)發(fā)板相關(guān)的驅(qū)動(dòng)和配置文件。 | 提供了開(kāi)發(fā)板特有的硬件接口和初始化代碼,如 LED、按鈕、LCD 顯示等的驅(qū)動(dòng)。 |
CMSIS |
ARM 提供的一組與硬件無(wú)關(guān)的接口。 | 提供了一種標(biāo)準(zhǔn)化的方法來(lái)訪(fǎng)問(wèn) Cortex-M 內(nèi)核(這是STM32使用的內(nèi)核)的特性,如 NVIC、系統(tǒng)時(shí)鐘等。 |
CMSIS Driver |
CMSIS 的一部分,提供了一組標(biāo)準(zhǔn)的設(shè)備驅(qū)動(dòng)接口。 | 允許以一種與硬件無(wú)關(guān)的方式編寫(xiě)代碼,以控制各種外設(shè),如 UART、SPI、I2C 等。 |
Compiler | 包含了編譯器特定的設(shè)置和庫(kù)。 | 用于優(yōu)化代碼和提供編譯器特定的內(nèi)聯(lián)匯編、宏等。 |
Device |
特定于微控制器(如 STM32F1)的驅(qū)動(dòng)和配置文件。 | 提供了訪(fǎng)問(wèn)和控制特定微控制器硬件的必要代碼和接口。 |
File System | 提供了文件系統(tǒng)的實(shí)現(xiàn)。 | 允許在嵌入式系統(tǒng)中使用如 FAT、NFS 等文件系統(tǒng),通常用于 SD 卡或內(nèi)部存儲(chǔ)的數(shù)據(jù)管理。 |
Graphics | 包含了圖形用戶(hù)界面(GUI)和顯示驅(qū)動(dòng)。 | 提供了創(chuàng)建圖形界面的工具和庫(kù),如按鈕、滑塊、文本框等。 |
Network | 包含了網(wǎng)絡(luò)協(xié)議棧和相關(guān)的服務(wù)。 | 允許嵌入式系統(tǒng)通過(guò) Ethernet、Wi-Fi 等進(jìn)行網(wǎng)絡(luò)通信,支持如 TCP/IP、HTTP、MQTT 等協(xié)議。 |
USB | 包含了 USB 通信的驅(qū)動(dòng)和庫(kù)。 | 提供了實(shí)現(xiàn) USB 主機(jī)或設(shè)備功能的必要接口和代碼,如 USB HID、USB Mass Storage 等。 |
CMSIS Driver
提供了cortex M3 MCU外設(shè)控制的API,我們使用的STM32芯片,既然使用了這個(gè)內(nèi)核,那么我們肯定是可以使用CMSIS Driver下面的API進(jìn)行開(kāi)發(fā)的,但這些API并不是針對(duì)STM32芯片的,是通用API,所以你要使用這些API進(jìn)行開(kāi)發(fā)的話(huà),需要仔細(xì)閱讀具體芯片的數(shù)據(jù)手冊(cè)才行。
因此,推薦使用各個(gè)廠(chǎng)商的API,它們會(huì)對(duì)具體的芯片信號(hào)進(jìn)行適配、優(yōu)化,開(kāi)發(fā)起來(lái)更加便捷。
當(dāng)你安裝芯片對(duì)應(yīng)的pack后,該芯片在MDK中支持的庫(kù)就會(huì)顯示在Device
目錄下面,根據(jù)需要,選擇相關(guān)外設(shè)的API即可。
注意: 由于歷史原因,MDK中,STM32 F1系列的芯片只有SPL這一個(gè)庫(kù),而F4這種比較新的芯片就支持SPL、HAL、LL庫(kù)了。(當(dāng)然,并不是說(shuō)F1系列不支持HAL庫(kù),只是MDK的RTE不提供這個(gè)選項(xiàng),你可以去STM32Cube開(kāi)發(fā),或者從MX復(fù)制過(guò)來(lái))。
F4:
再補(bǔ)充一點(diǎn):有的庫(kù)對(duì)C語(yǔ)言標(biāo)準(zhǔn)是有要求的,MDK可能默認(rèn)設(shè)置的是c90,你手動(dòng)換成新一點(diǎn)的標(biāo)準(zhǔn)就行了。
3.2 STM32Cube IDE
STM32Cube主要使用HAL和LL庫(kù)。
在STM32Cube MX中選擇即可,默認(rèn)就是HAL。每個(gè)外設(shè)都可以單獨(dú)指定(如果你比較熟練,且對(duì)性能有較高的要求)
集成于STM32Cube IDE的STM32Cube MX可能沒(méi)有保存之類(lèi)的按鈕,使用快捷鍵ctrl s就行了。單獨(dú)安裝的STM32Cube MX更方便與其他IDE和工具鏈一起使用。
-
Keil官方:https://www.keil.com/pack/doc/CMSIS_Dev/General/html/index.html ??文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-681096.html
-
ST官方:https://www.st.com/resource/en/application_note/an5044-stm32-standard-peripheral-library-to-stm32cube-lowlayer-migration-stmicroelectronics.pdf ??文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-681096.html
到了這里,關(guān)于【STM32】驅(qū)動(dòng)庫(kù)的選擇:CMSIS Driver、SPL、HAL、LL | 在ARM MDK、STM32Cube中如何選擇?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!