天天看點

STM32F1xx HAL庫 中文詳解 之 綜合概述(一)HAL庫驅動程式概述:綜合概述(一):1 HAL庫常用名詞縮寫及HAL庫使用者應用程式檔案2 HAL庫資料結構3 PAI的分類4 HAL驅動程式支援的裝置 

        現階段學習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常用名詞縮寫與定義

表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庫驅動程式檔案

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庫 中文詳解 之 綜合概述(一)HAL庫驅動程式概述:綜合概述(一):1 HAL庫常用名詞縮寫及HAL庫使用者應用程式檔案2 HAL庫資料結構3 PAI的分類4 HAL驅動程式支援的裝置 
STM32F1xx HAL庫 中文詳解 之 綜合概述(一)HAL庫驅動程式概述:綜合概述(一):1 HAL庫常用名詞縮寫及HAL庫使用者應用程式檔案2 HAL庫資料結構3 PAI的分類4 HAL驅動程式支援的裝置 
STM32F1xx HAL庫 中文詳解 之 綜合概述(一)HAL庫驅動程式概述:綜合概述(一):1 HAL庫常用名詞縮寫及HAL庫使用者應用程式檔案2 HAL庫資料結構3 PAI的分類4 HAL驅動程式支援的裝置 
STM32F1xx HAL庫 中文詳解 之 綜合概述(一)HAL庫驅動程式概述:綜合概述(一):1 HAL庫常用名詞縮寫及HAL庫使用者應用程式檔案2 HAL庫資料結構3 PAI的分類4 HAL驅動程式支援的裝置 
STM32F1xx HAL庫 中文詳解 之 綜合概述(一)HAL庫驅動程式概述:綜合概述(一):1 HAL庫常用名詞縮寫及HAL庫使用者應用程式檔案2 HAL庫資料結構3 PAI的分類4 HAL驅動程式支援的裝置 

         以上就是STM32F1xx HAL庫驅動程式概述的前4小節内容,剩下的部分将在綜合概述(二)和綜合概述(三)中更新。

        第一次發文,希望大家多多支援,一起學習,一起進步!!!