現階段學習hal庫,發現網上竟然沒有對HAL庫全面詳細的解析,在學習的過程中把我所學到的記錄下來,分享給大家,一起學習,一起進步!第一次寫博文,有不足之處希望大家能在評論區指出。
HAL庫驅動程式概述:
HAL驅動程式被設計成提供一套豐富的API,并且易于與上層應用程式。每個驅動程式由一組函數組成,涵蓋了最常見的外圍裝置特性。每個驅動程式的開發都是由一個通用的API驅動的,該API對驅動程式進行了标準化結構、函數和參數名稱。
HAL驅動程式包括一組驅動子產品,每個子產品連接配接到一個獨立的子產品外圍。 然而,在某些情況下,子產品連結到外圍功能模式。例如,USART外圍裝置有幾個子產品:UART驅動子產品、USART驅動子產品,智能卡驅動子產品,IRDA驅動子產品。HAL的主要特點如下:
● 跨家族的可移植API集,涵蓋了常見的外圍功能擴充API用于特定的外圍特性。
● 三種API程式設計模型:輪詢、中斷和DMA:
----API是RTOS相容的完全可重入的API
----輪詢模式中逾時的系統使用情況
● 支援外設多執行個體,允許多個并發API調用給定外圍裝置的執行個體(USART1, USART2…)
● 所有HAL API都實作使用者回調函數機制:
----外設Init/DeInit HAL api可以調用使用者回調函數來執行初始化/去初始化(時鐘,gpio,中斷,DMA)
----外設中斷事件錯誤的事件。
● 對象鎖定機制:安全硬體通路,防止多重僞通路共享資源。
● 用于所有阻塞程序的逾時:逾時可以是一個簡單的計數器或時基。
本文重點對hal庫做一個綜合的概述,後續還會更新其他外設!
本文将從以下幾個方面介紹HAL庫:
綜合概述(一):
HAL庫驅動程式概述:
綜合概述(一):
1 HAL庫常用名詞縮寫及HAL庫使用者應用程式檔案
1.1常用名詞縮寫與定義
1.2HAL和使用者應用程式檔案
1.2.1 hal庫驅動程式檔案
1.2.2 使用者應用程式檔案
2 HAL庫資料結構
2.1外圍處理結構
2.2 初始化和配置結構
2.3具體的工藝結構
3 PAI的分類
4 HAL驅動程式支援的裝置
綜合概述(二):
5 HAL驅動規則
6 HAL通用API
7 HAL擴充API
8檔案包含方式
綜合概述(三):
9 HAL公共資源
10 HAL配置
11 HAL系統外設處理
12 如何使用HAL驅動程式
1 HAL庫常用名詞縮寫及HAL庫使用者應用程式檔案
1.1常用名詞縮寫與定義
ADC | 模數轉換器 |
ANSI | 美國國家标準協會 |
API | 應用程式接口 |
BSP | 闆級支援包 |
CAN | 控制器區域網路子產品 |
CEC | 單總線協定 |
CMSIS | 微控制器軟體接口标準 |
CPU | 中央處理器 |
CRC | 循環備援校驗碼 |
DAC | 數模轉換器 |
DMA | 直接記憶體存取控制器 |
ETH | 以太網 |
EXTI | 外部中斷事件控制器 |
FLASH | 閃存存儲器 |
GPIO | 通用輸入輸出 |
HAL | hal庫 |
HCD | 高對比顯示屏 |
I2C | 内部內建電路 |
I2S | 內建電路内置音頻總線 |
IRDA | 紅外線資料協定 |
IWDG | 獨立看門狗 |
LCD | 已經顯示器 |
MSP | msp函數 |
NAND | 閃存存儲器 |
NOR | 閃存存儲器 |
NVIC | 嵌套中斷向量清單控制器 |
PCD | USB外設控制器 |
PWR | 電源/功耗控制 |
RCC | 複位與時鐘控制器 |
RTC | 實時時鐘 |
SD | SD存儲卡 |
SRAM | 靜态随機存取存儲器 |
SMARTCARD | 智能卡 |
SPI | 串行外設接口 |
SysTick | 系統嘀嗒定時器 |
TIM | 通用定時器 |
UART | 通用異步接收發射端 |
USART | 通用同步異步接收發射端 |
WWDG | 視窗看門狗 |
USB | 通用串行總線 |
PPP | 所有外設統稱 |
1.2HAL和使用者應用程式檔案
接下來說一下HAL庫的檔案組成,HAL庫使用者應用程式檔案分為兩部分,一部分是HAL庫驅動程式檔案,另一部分是使用者應用程式檔案。
1.2.1 hal庫驅動程式檔案
檔案名 | 描述 |
---|---|
stm32f1xx_hal_ppp.c | 主要外設/驅動檔案,它包括所有STM32裝置通用的API。 例如:stm32f1xx_hal_adc.c(ADC驅動) |
stm32f1xx_hal_ppp.h | 主要外設/驅動C檔案的頭檔案 ,它包括公共資料、句柄和枚舉結構, 定義語句和宏,以及導出的泛型API。 例如:stm32f1xx_hal_adc.h, stm32f1xx_hal_irda.h,… |
stm32f1xx_hal_ppp_ex.c | 外設/子產品驅動程式的擴充檔案。它包括特定的API的給定零件号或系列,以及新定義的API覆寫預設泛型API,如果内部流程以不同的方式實作。 例如:stm32f1 xx_hal_adc_ex.c, stm32f1xx_hal_dma_ex.c,… |
stm32f1xx_hal_ppp_ex.h | 擴充名C檔案的頭檔案,它包括具體的資料和枚舉結構,定義語句和宏,以及導出的裝置部分許多特定API。 例如:stm32f1xx_hal_adc_ex.h, stm32f1xx_hal_dma_ex.h,… |
stm32f1xx_hal.c | 該檔案用于HAL初始化,包含DBGMCU,基于SysTick API的Remap和Time Delay。 |
stm32f1xx_hal.h | stm32f1xx_hal.c的頭檔案。 |
stm32f1xx_hal_msp_template.c | 模闆檔案要複制到使用者應用程式檔案夾,它包含MSP初始化和反初始化(主例程) 以及回調的使用者應用程式中使用的外設。 |
stm32f1xx_hal_conf_template.h | 允許自定義給定驅動程式的模闆檔案應用程式。 |
stm32f1xx_hal_def.h | 公共HAL資源,如公共定義語句、枚舉、結構和宏。 |
1.2.2 使用者應用程式檔案
檔案名 | 描述 |
system_stm32f1xx.c | 這個檔案包含SystemInit(),它在啟動時被調用,就在重置和在分支到主程式之前。不配置系統啟動時的時鐘(與标準庫相反)。這是要用的使用者檔案中的HAL API。 它允許在内部SRAM中重新定位向量表。 |
startup_stm32f1xx.s | 包含重置處理程式和異常向量的工具鍊特定檔案。對于一些工具鍊,它允許調整堆棧/堆大小以适應應用程式的需求。 |
stm32f1xx_flash.icf (optional) | 連結器檔案的EWARM工具鍊允許主要适應堆棧/堆尺寸要符合應用要求。 |
stm32f1xx_hal_msp.c | 這個檔案包含MSP初始化和反初始化(主例程)和回調)的使用者應用程式中使用的外設。 |
stm32f1xx_hal_conf.h | 這個檔案允許使用者定制特定的HAL驅動程式應用程式。 不是必須修改此配置。 應用程式可以使用預設配置,不作任何修改。 |
stm32f1xx_it.c/.h | 這個檔案包含異常處理程式和外圍裝置中斷服務例程,并定期調用HAL_IncTick()來增加本地變量(在stm32f1xx_hal.c中聲明)用作HAL時間基數。 通過預設情況下,該函數在Systick ISR中每1ms被調用一次。 PPP_IRQHandler()例程必須在在應用程式中使用基于中斷的程序。 |
main.c/.h | 這個檔案包含主程式例程,主要是: 1.調用HAL_Init() 2.assert_failed()實作 3.系統時鐘配置 4.外設HAL初始化和使用者應用程式代碼。 |
STM32Cube包附帶了現成的項目模闆,每個模闆對應一個型号的支援。 每個項目包含上面列出的檔案和一個預先配置的項目用于支援的工具鍊。每個項目模闆的main()中都提供了空的主循環函數,可以作為開始點來熟悉STM32Cube的項目設定。 他們的特點是:
1. 它包含HAL, CMSIS和BSP驅動的來源是最小的元件來在給定的開發闆上開發代碼。
2. 它包含所有固件元件的包含路徑。
3. 它定義了支援的STM32裝置,并允許配置CMSIS和HAL相應的驅動程式。
4. 它提供了準備使用預先配置如下定義的使用者檔案:
----HAL初始化
----實作HAL_Delay()的SysTick ISR
----系統時鐘配置為裝置的最大頻率
2 HAL庫資料結構
每個HAL驅動程式可以包含以下資料結構:
----外圍處理結構
----初始化和配置結構
----特定的流程結構
2.1外圍處理結構
這些API有一個子產品化的通用多執行個體體系結構,允許使用同時存在多個IP執行個體。
PPP_HandleTypeDef *句柄是HAL中實作的主要結構驅動程式。 它處理外設/子產品配置,寄存器和嵌入所有的遵循外圍裝置流程所需的結構和變量。
外圍句柄用于以下目的:
----多執行個體支援:每個外設/子產品執行個體都有自己的句柄。 作為一個結果執行個體資源是獨立的。
----外圍程序間通信:句柄用于管理共享資料流程例程之間的資源。
例如:全局指針,DMA句柄,狀态機。
----存儲:這個句柄也用于管理給定HAL驅動中的全局變量。
外圍結構示例如下:
typedef struct
{
USART_TypeDef *Instance; /* USART registers base address */
USART_InitTypeDef Init; /* Usart communication parameters */
uint8_t *pTxBuffPtr;/* Pointer to Usart Tx transfer Buffer */
uint16_t TxXferSize; /* Usart Tx Transfer size */
__IO uint16_t TxXferCount;/* Usart Tx Transfer Counter */
uint8_t *pRxBuffPtr;/* Pointer to Usart Rx transfer Buffer */
uint16_t RxXferSize; /* Usart Rx Transfer size */
__IO uint16_t RxXferCount; /* Usart Rx Transfer Counter */
DMA_HandleTypeDef *hdmatx; /* Usart Tx DMA Handle parameters */
DMA_HandleTypeDef *hdmarx; /* Usart Rx DMA Handle parameters */
HAL_LockTypeDef Lock; /* Locking object */
__IO HAL_USART_StateTypeDef State; /* Usart communication state */
__IO HAL_USART_ErrorTypeDef ErrorCode;/* USART Error code */
}USART_HandleTypeDef;
1)多執行個體特性意味着應用程式中使用的所有api都是重入并避免使用全局變量,因為子例程可能無法重入如果它們依賴于一個全局變量保持不變,但那個變量是在遞歸調用子例程時修改。 由于這個原因,下面尊重規則:
----可重入代碼不包含任何靜态(或全局)非常量資料函數可以處理全局資料。 例如,可重入對象 中斷服務程式可以擷取一塊硬體狀态來進行工作它不僅是全局的,而且是volatile的。 不過,典型的不建議使用靜态變量和全局資料在這些變量中應該使用原子的讀-修改-寫指令。 它在執行過程中是否不可能出現中斷或信号這樣的指令。
----可重入代碼不修改它自己的代碼。
2)當一個外設可以同時管理多個程序使用的DMA(全雙工情況),每個程序的DMA接口句柄被添加到PPP_HandleTypeDef。
3)對于共享和系統外圍裝置,不使用句柄或執行個體對象。
這個例外所涉及的外圍裝置如下:
● GPIO
● SYSTICK
● NVIC
● PWR
● RCC
● FLASH.
2.2 初始化和配置結構
這些結構在通用驅動頭檔案中定義,當它對所有部分都是通用的數字。 當它們可以從一個零件号碼轉換到另一個時,結構是在每個零件号的擴充頭檔案中定義。
typedef struct
{
uint32_t BaudRate; /*!< This member configures the UART communication baudrate.*/
uint32_t WordLength; /*!< Specifies the number of data bits transmitted
or received in a frame.*/
uint32_t StopBits; /*!< Specifies the number of stop bits transmitted.*/
uint32_t Parity; /*!< Specifies the parity mode. */
uint32_t Mode; /*!< Specifies wether the Receive or Transmit mode is
enabled or disabled.*/
uint32_t HwFlowCtl; /*!< Specifies wether the hardware flow control mode
is enabled or disabled.*/
uint32_t OverSampling; /*!< Specifies wether the Over sampling 8 is
enabled or disabled,to achieve higher speed (up to fPCLK/8).*/
}UART_InitTypeDef;
配置結構用于初始化子子產品或子執行個體。 看到下面的例子:
HAL_ADC_ConfigChannel (ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
2.3具體的工藝結構
特定的流程結構用于特定的流程(通用API),他們是在通用驅動頭檔案中定義。
例如:
HAL_PPP_Process (PPP_HandleTypeDef* hadc,PPP_ProcessConfig* sConfig)
3 PAI的分類
HAL api分為三類:
● 通用api:應用于所有STM32裝置的通用api。 這些api是是以出現在所有STM32微控制器的通用HAL驅動檔案中。
HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc);
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);
● 擴充API:這組API分為兩個子類:
----特定于家族的api:應用于給定家族的api。 它們位于擴充HAL驅動檔案(參見下面與ADC相關的示例)。
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc,
uint32_t SingleDiff);
uint32_t HAL_ADCEx_Calibration_GetValue(ADC_HandleTypeDef* hadc,
uint32_t SingleDiff);
----裝置部件号特定的api:這些api在擴充檔案,并由相對于給定部分的特定定義語句分隔号碼。
#if defined (STM32F101xG) || defined (STM32F103x6)|| defined (STM32F103xB) ||
defined (STM32F105xC) || defined (STM32F107xC) || defined (STM32F103xE) || defined
(STM32F103xG) /* ADC multimode */
HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t
*pData, uint32_tLength);
HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef *hadc);
#endif
/* STM32F101xG || defined STM32F103x6 || defined STM32F103xB || defined STM32F105xC
|| defined STM32F107xC || defined STM32F103xE || defined STM32F103xG */
與特定API相關的資料結構由裝置部分分隔數定義語句。 它位于相應的擴充頭C中檔案。
4 HAL驅動程式支援的裝置
以下是來自st官網HAL庫手冊的圖檔,詳細的說明了HAL庫中的驅動程式檔案所支援的晶片型号。

以上就是STM32F1xx HAL庫驅動程式概述的前4小節内容,剩下的部分将在綜合概述(二)和綜合概述(三)中更新。
第一次發文,希望大家多多支援,一起學習,一起進步!!!