1.初識HAL庫(了解)
1.1CMSIS簡介
??CMSIS (微控制器軟件接口標準):Cortex Microcontroller Software Interface Standard,是由ARM和與其合作的芯片廠商(比如ST、NXP公司等)、軟件工具廠商(Keil、IAR公司等),共同制定的標準。如果沒有此標準,ARM公司的產(chǎn)品兼容性非常差。
??下圖中分為三層,第一層是用戶層,主要是用戶代碼、在線調(diào)試;第二層是中間層(CMISIS),具體CMSIS體現(xiàn)到用戶手冊是CMSIS-Pack,每個公司提供的包可能不太一樣,會根據(jù)自己的產(chǎn)品制作CMSIS包,其中HAL庫(Peripheral HAL)屬于其內(nèi)容;第三層是硬件層。用戶想要去開發(fā)硬件層,需要經(jīng)過中間層,中間層的CMSIS包由眾多廠商提供。
1.2HAL庫簡介
??ST 為了方便用戶開發(fā) STM32芯片開發(fā)提供了三種庫:
- 標準外設(shè)庫 (Standard Peripheral Libraries),也就是“標準庫”。
- HAL庫(硬件抽象層):Hardware Abstraction Layer
- LL庫:Low Layer,也就是“底層庫”,更加接近硬件,也就是更加接近寄存器。
??下圖是直接操作寄存器、標準庫、HAL庫(不同系列兼容性好,具體表現(xiàn)是不同外設(shè)初始化都是使用一個函數(shù),只是結(jié)構(gòu)體、變量不一樣,但是函數(shù)接口一樣,移植方便。HAL庫是抽象層的庫,經(jīng)過很多次的封裝,導致效率比較低)、LL庫(彌補了HAL庫執(zhí)行效率低的缺點,在HAL庫內(nèi)部一些API函數(shù)就會調(diào)用LL庫中內(nèi)容,但是LL庫也有其缺點,不匹配部分復(fù)雜外設(shè),比如USB)的特點:
2.STM32Cube固件包淺析(了解)
??Cube固件包其實就說CMSIS-Pack,STM32Cube固件包是ST公司根據(jù)標準提供的CMSIS-Pack。
2.1如何獲取STM32Cube固件包?
??之前文章中已經(jīng)總結(jié)如何獲取,具體查看【07】STM32·HAL庫開發(fā)-新建寄存器版本MDK工程 |下載STM32Cube固件包 | 新建MDK工程步驟中的第1.1小節(jié)。
2.2STM32Cube固件包文件夾簡介
【_htmresc】文件夾中包含了一些圖片之類的,對我們來說沒任何作用;
【Documentation】文件夾中為固件包說明文檔;
【Drivers】文件夾比較重要是驅(qū)動源碼,新建工程時需要用到;
【Middlewares】中為中間文件,保存的是ST或者第三方的一些中間文件,后續(xù)會用到,新建工程可能暫時用不到;
【Projects】為ST官方開發(fā)板例程,參考作用;
【Utilities】為ST關(guān)方開發(fā)板例程提供公共組件,一般用不到,可以用作參考;
License.md文件包含了軟件許可、軟件版本信息;
package.xml為固件包版本信息;
Readme.md為自述文件;
Release_Notes.html為補充或更新說明的鏈接,可用瀏覽器打開。
2.3CMSIS文件夾關(guān)鍵文件
??F1系列【Drivers】文件夾中包含了三個文件夾【BSP】、【CMSIS】、HAL庫驅(qū)動【STM32F1xx_HAL_Driver】?!綛SP】中為板級驅(qū)動源碼,也就是板級支持包,適配ST官方的開發(fā)板板級驅(qū)動(針對外設(shè)、或者板子上面的資源做的驅(qū)動),不同開發(fā)板板級驅(qū)動是不一樣的,所以此文件更多是參考意義;【CMSIS】文件夾包含符合CMSIS的組件,包括:DSP庫、Cortex-M內(nèi)核及其設(shè)備文件、微控制器專用頭文件、啟動文件、專用系統(tǒng)文件等,創(chuàng)建工程時會復(fù)制其中部分文件;【STM32F1xx_HAL_Driver】為F1系列HAL庫外設(shè)驅(qū)動源碼,創(chuàng)建工程時會復(fù)制其中部分文件。
??【Middlewares】中包含了【ST】和【Third_Party】兩個文件夾。
??在【CMSIS】文件夾中主要關(guān)注【Device】和【include】兩個文件夾,新建工程時也是用到這兩個文件夾;【Device】文件夾中包含微控制器專用頭文件、啟動文件、專用系統(tǒng)文件;【include】文件夾中包含Cortx-M內(nèi)核及其設(shè)備文件、編譯器相關(guān)頭文件。
2.3.1CMSIS標準規(guī)定軟件包目錄
?? CMSIS標準規(guī)定軟件包目錄也就是STM32Cube固件庫文件夾所包含的內(nèi)容。用到的有【Driver】和【Include】文件夾。
2.3.2Device和Include文件夾的關(guān)鍵文件介紹
?? 【Device】文件夾中用到的文件包含以下文件,以下文件是簡略后的文件。
?? stm32f103后面的xe是根據(jù)FLASH容量進行選擇,在【include】文件夾中保存3個文件:stm32f1xx.h、stm32f103xe.h、system_stm32f1xx.h。
?? 以下目錄中保留文件system_stm32f1xx.c,因為編譯器是ARM,所以保留【arm】文件夾中的啟動文件,并根據(jù)型號和容量來選擇保留哪個啟動文件。
?? 【include】文件夾中用到以下文件:cmsis_armcc.h(針對AC5編譯器)、cmsis_armclang.h(針對AC6編譯器)、cmsis_compiler.h(AC5和AC6編譯器共用)、cmsis_version.h(編譯器版本,也是共用的)、core_cm3.h (Cortex-M3內(nèi)核,重點關(guān)注此文件)、 mpu_armv7.h(mpu內(nèi)存保護)。
3.HAL庫框架結(jié)構(gòu)(了解)
3.1HAL庫文件夾結(jié)構(gòu)
?? F1系列的HAL庫被保存到【STM32F1xx_HAL_Driver】文件夾中,Src(Source):外設(shè)驅(qū)動源碼;Inc(Include):外設(shè)驅(qū)動源碼頭文件。前面提到HAL庫和LL庫是捆綁發(fā)布的,就體現(xiàn)在驅(qū)動源碼包含在【Inc】和【Src】文件夾中?!綢nc】和【Src】文件夾中的【Legacy】文件夾是補充源文件,并不是所有系列都需要。
3.2HAL庫文件介紹
?? 文件名中有hal的就是hal庫文件,有l(wèi)l的就是LL庫文件。stm32f1xx_hal_conf.h文件可用于裁剪HAL庫中用不到的功能,減少編譯后得文件大小。
3.3HAL庫API函數(shù)和變量命名規(guī)則
?? 用戶一般不會直接調(diào)用LL庫,而是通過調(diào)用HAL庫間接使用LL庫,所以不必深入學習LL庫。
??可以將以下初始化函數(shù)中的PPP替換成GPIO,反初始化函數(shù)很少用到,主要用于失能時鐘、恢復(fù)默認配置等。
初始化/反初始化函數(shù):HAL_PPP_Init(), HAL_PPP_DeInit()
外設(shè)讀寫函數(shù):HAL_PPP_Read(),HAL_PPP_Write(),HAL_PPP_Transmit(), HAL_PPP_Receive()
控制函數(shù):HAL_PPP_Set (),HAL_PPP_Get ()
狀態(tài)和錯誤:HAL_PPP_GetState (), HAL_PPP_GetError ()
3.3.1HAL庫對寄存器位操作的相關(guān)宏定義
3.3.2HAL庫回調(diào)函數(shù)
??此類回調(diào)函數(shù)通常被_weak修飾(弱函數(shù)),允許用戶重新定義該函數(shù)。
4.如何使用HAL庫(熟悉)
4.1基于CMSIS應(yīng)用程序文件描述
??CMSIS核心層文件就是將【CMSIS】文件夾中的【Device】和【Include】文件夾中裁剪后剩的11個文件,這11個文件對于新建MDK工程是必須包含的;設(shè)備驅(qū)動層就是HAL庫及LL庫的源碼,也就是【STM32F1xx_HAL_Driver】文件夾中的源碼;用戶程序文件,正點原子例程都將main.h、stm32f1xx_hal_msp.c刪除掉了,放到了例如初始化UART就將UART的在stm32f1xx_hal_msp.c中的回調(diào)函數(shù)放到usart.c中,stm32f1xx_it.c和stm32f1xx_it.h里面本身就定義了一些中斷,所以選擇保留,如果寫串口中斷,推薦寫到usart.c中。。
4.1.1STM32開發(fā)文件結(jié)構(gòu)分布
4.2HAL 庫的用戶配置文件
??如果是F1系列那么就修改stm32f1xx_hal_conf.h。獲取此文件可以從STM32官方例程中獲取,也可以從HAL庫驅(qū)動源碼中獲取,只是名稱不同,復(fù)制時只需要將template刪除即可。
4.2.1裁剪HAL庫外設(shè)驅(qū)動源碼(不進行編譯)
??STM32HAL庫裁剪就是將stm32f1xx_hal_conf.h中用不到的宏定義注釋掉,因為在HAL庫驅(qū)動源碼中都是用的ifdef
判斷宏是否被定義。以GPIO為例如下所示:
??通過對工程中用到什么外設(shè)就加什么驅(qū)動文件,也是起到裁剪作用。如下所示,是部分HAL庫驅(qū)動文件:
4.2.2設(shè)置外部高速晶振頻率(根據(jù)開發(fā)板實際情況設(shè)置)
??以下代碼是設(shè)置高速外部晶振,宏USE_STM3210C_EVAL
判斷是否使用ST官方開發(fā)板,默認為25MHz,否則為8MHz。要根據(jù)開發(fā)板實際情況進行設(shè)置。如果要省事可以簡化以下代碼為:#define HSE_VALUE 8000000U
#if !defined (HSE_VALUE)
#if defined(USE_STM3210C_EVAL)
#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */
#endif
#endif /* HSE_VALUE */
??高速內(nèi)部晶振和低速內(nèi)部晶振可以根據(jù)芯片手冊進行設(shè)置:
#if !defined (HSI_VALUE)
#define HSI_VALUE 8000000U
#endif /* HSI_VALUE */
#if !defined (LSI_VALUE)
#define LSI_VALUE 40000U
#endif /* LSI_VALUE */
4.2.3設(shè)置外部低速晶振頻率(根據(jù)開發(fā)板實際情況設(shè)置)
#if !defined (LSE_VALUE)
#define LSE_VALUE 32768U
#endif /* LSE_VALUE */
4.3stm32f1xx_hal.c 文件
??使用HAL庫最關(guān)心的就說HAL庫初始化函數(shù)HAL_Init()
,不同系列可能有些小區(qū)別,但是核心代碼如下:
HAL_StatusTypeDef HAL_Init(void)
{
__HAL_FLASH_PREFETCH_BUFFER_ENABLE(); /* 使能FLASH預(yù)取緩沖 */
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); /* 配置中斷優(yōu)先級分組 */
/* 使用滴答定時器作為時鐘基準,配置 1ms 滴答(重置后默認的時鐘源為 HSI) */
HAL_InitTick(TICK_INT_PRIORITY);
HAL_MspInit(); /* 初始化其它底層硬件(如果必要) */
return HAL_OK; /* 返回函數(shù)狀態(tài) */
}
?? 第一段程序作用是使能FLASH預(yù)取緩沖,STM32是32位的,每次讀取的指令也是32位的,F(xiàn)LASH存在預(yù)取緩沖區(qū),預(yù)取緩沖區(qū)由2個64位組成,CPU每次讀取指令,將指令放在預(yù)取緩沖區(qū),就可以起到程序加快運行的效果。
__HAL_FLASH_PREFETCH_BUFFER_ENABLE(); /* 使能FLASH預(yù)取緩沖 */
?? 第二段程序是設(shè)置中斷優(yōu)先級分組,默認情況下設(shè)置位為4,正點原子默認設(shè)置成2。
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); /* 配置中斷優(yōu)先級分組 */
??第三段是使能系統(tǒng)滴答定時器,并且配置為1ms。正點原子實際配置滴答定時器在delay.c中的delay_Init()
函數(shù)中。
/* 使用滴答定時器作為時鐘基準,配置 1ms 滴答(重置后默認的時鐘源為 HSI) */
HAL_InitTick(TICK_INT_PRIORITY);
??HAL_MspInit()
為空函數(shù),不用管它。
HAL_MspInit(); /* 初始化其它底層硬件(如果必要) */
5.HAL庫使用注意事項(了解)
1,使用HAL庫出現(xiàn)問題,還是得通過參考手冊檢查是否硬件操作是否有問題;
2,盡量不通過修改庫源碼實現(xiàn)功能,這樣不方便庫更新;
3,HAL庫可能會存在錯誤,要有質(zhì)疑精神;
4,有些HAL庫API函數(shù)執(zhí)行效率偏低,我們可能會直接通過操作寄存器的方式代替。文章來源:http://www.zghlxwxcb.cn/news/detail-664972.html
6.總結(jié)(了解)
文章來源地址http://www.zghlxwxcb.cn/news/detail-664972.html
到了這里,關(guān)于【08】STM32·HAL庫開發(fā)-HAL庫介紹 | STM32Cube固件庫介紹 | HAL庫框架結(jié)構(gòu) | 如何使用HAL庫及使用注意事項的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!