在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32標(biāo)準庫、HAL庫特點與應(yīng)用

jf_52bVvS8T ? 來源:EE時間 ? 2023-02-14 09:17 ? 次閱讀
新手在入門STM32的時候,一般大多數(shù)都會選用標(biāo)準庫和HAL庫,而極少部分人會通過直接配置寄存器進行開發(fā)。

對于剛?cè)腴T的朋友可能沒法直觀了解這些不同開發(fā)發(fā)方式彼此之間的區(qū)別,本文試圖以一種非常直白的方式,用自己的理解去將這些東西表述出來。

配置寄存器

不少先學(xué)了51的朋友可能會知道,會有一小部分人或是教程是通過匯編語言直接操作寄存器實現(xiàn)功能的,這種方法到了STM32就變得不太容易行得通了。

因為STM32的寄存器數(shù)量是51單片機的十?dāng)?shù)倍,如此多的寄存器根本無法全部記憶,開發(fā)時需要經(jīng)常的翻查芯片的數(shù)據(jù)手冊,此時直接操作寄存器就變得非常的費力了。也有人喜歡去直接操作寄存器,因為這樣更接近原理,代碼更少,知其然也知其所以然。

標(biāo)準庫

上面也提到了,STM32有非常多的寄存器,而導(dǎo)致了開發(fā)困難,所以為此ST公司就為每款芯片都編寫了一份庫文件,也就是工程文件里stm32F1xx.....之類的。在這些.c與.h文件中,包括一些常用量的宏定義,把一些外設(shè)也通過結(jié)構(gòu)體變量封裝起來,如GPIO、時鐘等。

所以我們只需要配置結(jié)構(gòu)體變量成員就可以修改外設(shè)的配置寄存器,從而選擇不同的功能。也是目前最多人使用的方式,也是學(xué)習(xí)STM32接觸最多的一種開發(fā)方式,我也就不多闡述了。

HAL庫

HAL庫是ST公司目前主推的開發(fā)方式,全稱就是Hardware Abstraction Layer(抽象印象層),簡單來說就是弱化了開發(fā)者對硬件底層知識的依賴。

同樣的功能,標(biāo)準庫可能要用幾句話,HAL庫只需用一句話就夠了。并且HAL庫也很好的解決了程序移植的問題。不同型號的STM32芯片它的標(biāo)準庫是不一樣的,例如在F4上開發(fā)的程序移植到F3上是不能通用的,而使用HAL庫,只要使用的是相同的外設(shè),程序基本可以完全復(fù)制粘貼,注意是相同外設(shè),意思也就是不能無中生有。例如F7比F3要多幾個定時器,不能明明沒有這個定時器卻非要配置,但其實這種情況不多,絕大多數(shù)都可以直接復(fù)制粘貼。

而且使用ST公司研發(fā)的STMcube軟件,可以通過圖形化的配置功能,直接生成整個適用于HAL庫的工程文件,可以說是方便至極。相關(guān)推薦STM32CubeMX安裝教程。但是方便的同時也造成了它執(zhí)行效率偏低。

綜合上面說的,其實筆者還是強烈推薦HAL庫的,理由:

  • ST公司已經(jīng)停止更新標(biāo)準庫,公司主打HAL庫的目的已經(jīng)非常明顯了

  • 模塊化的HAL庫是趨勢,低效的短板會被硬件的增強所彌補

當(dāng)然底層的基本原理必需是要懂的,HAL庫也不是萬能的,結(jié)合對底層的理解相信一定會讓你的開發(fā)水準大大提高。

STM32的HAL庫、標(biāo)準庫區(qū)別

1 句柄

在STM32的標(biāo)準庫中,假設(shè)我們要初始化一個外設(shè)(這里以USART為例) 我們首先要初始化他們的各個寄存器。

在標(biāo)準庫中,這些操作都是利用固件庫結(jié)構(gòu)體變量+固件庫Init函數(shù)實現(xiàn)的:

 USART_InitTypeDef USART_InitStructure;


 USART_InitStructure.USART_BaudRate = bound;//串口波特率
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
 USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式


 USART_Init(USART3, &USART_InitStructure); //初始化串口1

可以看到,要初始化一個串口,需要對六個位置進行賦值,然后引用Init函數(shù),并且USART_InitStructure并不是一個全局結(jié)構(gòu)體變量,而是只在函數(shù)內(nèi)部的局部變量,初始化完成之后,USART_InitStructure就失去了作用。

而在HAL庫中,同樣是USART初始化結(jié)構(gòu)體變量,我們要定義為全局變量。

UART_HandleTypeDef UART1_Handler;

結(jié)構(gòu)體成員:

typedef struct
{
   USART_TypeDef                 *Instance;        /*!< UART registers base address        */
   UART_InitTypeDef              Init;             /*!< UART communication parameters      */
uint8_t                       *pTxBuffPtr;      /*!< Pointer to UART Tx transfer Buffer */
uint16_t                      TxXferSize;       /*!< UART Tx Transfer size              */
uint16_t                      TxXferCount;      /*!< UART Tx Transfer Counter           */
uint8_t                       *pRxBuffPtr;      /*!< Pointer to UART Rx transfer Buffer */
uint16_t                      RxXferSize;       /*!< UART Rx Transfer size              */
uint16_t                      RxXferCount;      /*!< UART Rx Transfer Counter           */
   DMA_HandleTypeDef             *hdmatx;          /*!< UART Tx DMA Handle parameters      */
   DMA_HandleTypeDef             *hdmarx;          /*!< UART Rx DMA Handle parameters      */
   HAL_LockTypeDef               Lock;             /*!< Locking object                     */
   __IO HAL_UART_StateTypeDef    State;            /*!< UART communication state           */
   __IO uint32_t                 ErrorCode;        /*!< UART Error code                    */
}UART_HandleTypeDef;

我們發(fā)現(xiàn),與標(biāo)準庫不同的是,該成員不僅包含了之前標(biāo)準庫就有的六個成員(波特率,數(shù)據(jù)格式等),還包含過采樣、(發(fā)送或接收的)數(shù)據(jù)緩存、數(shù)據(jù)指針、串口 DMA 相關(guān)的變量、各種標(biāo)志位等等要在整個項目流程中都要設(shè)置的各個成員。

該UART1_Handler就被稱為串口的句柄 它被貫穿整個USART收發(fā)的流程,比如開啟中斷:

HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);

比如后面要講到的MSP與Callback回調(diào)函數(shù):

void HAL_UART_MspInit(UART_HandleTypeDef *huart);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

在這些函數(shù)中,只需要調(diào)用初始化時定義的句柄UART1_Handler就好。

2 MSP函數(shù)

MCU Specific Package單片機的具體方案

MSP是指和MCU相關(guān)的初始化,引用一下正點原子的解釋,個人覺得說的很明白:

我們要初始化一個串口,首先要設(shè)置和 MCU 無關(guān)的東西,例如波特率,奇偶校驗,停止位等,這些參數(shù)設(shè)置和 MCU 沒有任何關(guān)系,可以使用 STM32F1,也可以是STM32F2/F3/F4/F7上的串口。而一個串口設(shè)備它需要一個 MCU 來承載,例如用 STM32F4 來做承載,PA9 做為發(fā)送,PA10 做為接收,MSP 就是要初始化 STM32F4 的 PA9,PA10,配置這兩個引腳。所以 HAL驅(qū)動方式的初始化流程就是:HAL_USART_Init()—>HAL_USART_MspInit(),先初始化與 MCU無關(guān)的串口協(xié)議,再初始化與 MCU 相關(guān)的串口引腳。在 STM32 的 HAL 驅(qū)動中HAL_PPP_MspInit()作為回調(diào),被HAL_PPP_Init()函數(shù)所調(diào)用。當(dāng)我們需要移植程序到 STM32F1平臺的時候,我們只需要修改 HAL_PPP_MspInit 函數(shù)內(nèi)容而不需要修改 HAL_PPP_Init 入口參數(shù)內(nèi)容。

在HAL庫中,幾乎每初始化一個外設(shè)就需要設(shè)置該外設(shè)與單片機之間的聯(lián)系,比如IO口,是否復(fù)用等等,可見,HAL庫相對于標(biāo)準庫多了MSP函數(shù)之后,移植性非常強,但與此同時卻增加了代碼量和代碼的嵌套層級。可以說各有利弊。

同樣,MSP函數(shù)又可以配合句柄,達到非常強的移植性:

void HAL_UART_MspInit(UART_HandleTypeDef *huart);

3 Callback函數(shù)

類似于MSP函數(shù),個人認為Callback函數(shù)主要幫助用戶應(yīng)用層的代碼編寫。還是以USART為例,在標(biāo)準庫中,串口中斷了以后,我們要先在中斷中判斷是否是接收中斷,然后讀出數(shù)據(jù),順便清除中斷標(biāo)志位,然后再是對數(shù)據(jù)的處理,這樣如果我們在一個中斷函數(shù)中寫這么多代碼,就會顯得很混亂:

void USART3_IRQHandler(void) //串口1中斷服務(wù)程序
{
 u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結(jié)尾)
 {
  Res =USART_ReceiveData(USART3); //讀取接收到的數(shù)據(jù)
/*數(shù)據(jù)處理區(qū)*/
 } 
}

而在HAL庫中,進入串口中斷后,直接由HAL庫中斷函數(shù)進行托管:

void USART1_IRQHandler(void)                 
{ 
 HAL_UART_IRQHandler(&UART1_Handler); //調(diào)用HAL庫中斷處理公用函數(shù)
 /***************省略無關(guān)代碼****************/ 
}

HAL_UART_IRQHandler這個函數(shù)完成了判斷是哪個中斷(接收?發(fā)送?或者其他?),然后讀出數(shù)據(jù),保存至緩存區(qū),順便清除中斷標(biāo)志位等等操作。比如我提前設(shè)置了,串口每接收五個字節(jié),我就要對這五個字節(jié)進行處理。在一開始我定義了一個串口接收緩存區(qū):

/*HAL庫使用的串口接收緩沖,處理邏輯由HAL庫控制,接收完這個數(shù)組就會調(diào)用HAL_UART_RxCpltCallback進行處理這個數(shù)組*/
/*RXBUFFERSIZE=5*/
u8 aRxBuffer[RXBUFFERSIZE];

在初始化中,我在句柄里設(shè)置好了緩存區(qū)的地址,緩存大小(五個字節(jié))

/*該代碼在HAL_UART_Receive_IT函數(shù)中,初始化時會引用*/
huart->pRxBuffPtr = pData;//aRxBuffer
huart->RxXferSize = Size;//RXBUFFERSIZE
huart->RxXferCount = Size;//RXBUFFERSIZE

則在接收數(shù)據(jù)中,每接收完五個字節(jié),HAL_UART_IRQHandler才會執(zhí)行一次Callback函數(shù):

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

在這個Callback回調(diào)函數(shù)中,我們只需要對這接收到的五個字節(jié)(保存在aRxBuffer[]中)進行處理就好了,完全不用再去手動清除標(biāo)志位等操作。

所以說Callback函數(shù)是一個應(yīng)用層代碼的函數(shù),我們在一開始只設(shè)置句柄里面的各個參數(shù),然后就等著HAL庫把自己安排好的代碼送到手中就可以了~

綜上,就是HAL庫的三個與標(biāo)準庫不同的地方之個人見解。

個人覺得從這三個小點就可以看出HAL庫的可移植性之強大,并且用戶可以完全不去理會底層各個寄存器的操作,代碼也更有邏輯性。但與此帶來的是復(fù)雜的代碼量,極慢的編譯速度,略微低下的效率??丛趺慈∩崃?。

HAL庫結(jié)構(gòu)

說到STM32的HAL庫,就不得不提STM32CubeMX,其作為一個可視化的配置工具,對于開發(fā)者來說,確實大大節(jié)省了開發(fā)時間。另外STM32CubeIDE集成了STM32CubeMX的功能,是一個集配置與編譯與一體的軟件,可以嘗試一下。軟件更新頻率很高,持續(xù)優(yōu)化某些bug及性能問題。

827ab17a-abeb-11ed-bfe3-dac502259ad0.png

上面兩個開發(fā)軟件是以HAL庫為基礎(chǔ)的,且目前僅支持HAL庫及LL庫!

首先看一下,官方給出的HAL庫的文件結(jié)構(gòu):

828dbc70-abeb-11ed-bfe3-dac502259ad0.png

下圖是STM32庫文件結(jié)構(gòu)。

82bdf944-abeb-11ed-bfe3-dac502259ad0.png

stm32f2xx.h 主要包含STM32同系列芯片的不同具體型號的定義,是否使用HAL庫等的定義,接著,其會根據(jù)定義的芯片信號包含具體的芯片型號的頭文件:

#if defined(STM32F205xx)
#include "stm32f205xx.h"
#elif defined(STM32F215xx)
#include "stm32f215xx.h"
#elif defined(STM32F207xx)
#include "stm32f207xx.h"
#elif defined(STM32F217xx)
#include "stm32f217xx.h"
#else
#error "Please select first the target STM32F2xx device used in your application (in stm32f2xx.h file)"
#endif

緊接著,其會包含 stm32f2xx_hal.h。

  • stm32f2xx_hal.h:stm32f2xx_hal.c/h 主要實現(xiàn)HAL庫的初始化、系統(tǒng)滴答相關(guān)函數(shù)、及CPU的調(diào)試模式配置

  • stm32f2xx_hal_conf.h :該文件是一個用戶級別的配置文件,用來實現(xiàn)對HAL庫的裁剪,其位于用戶文件目錄,不要放在庫目錄中。

接下來對于HAL庫的源碼文件進行一下說明,HAL庫文件名均以stm32f2xx_hal開頭,后面加上_外設(shè)或者模塊名(如:stm32f2xx_hal_adc.c):

庫文件:
 stm32f2xx_hal_ppp.c/.h   // 主要的外設(shè)或者模塊的驅(qū)動源文件,包含了該外設(shè)的通用API
 stm32f2xx_hal_ppp_ex.c/.h  // 外圍設(shè)備或模塊驅(qū)動程序的擴展文件。這組文件中包含特定型號或者系列的芯片的特殊API。以及如果該特定的芯片內(nèi)部有不同的實現(xiàn)方式,則該文件中的特殊API將覆蓋_ppp中的通用API。
 stm32f2xx_hal.c/.h    // 此文件用于HAL初始化,并且包含DBGMCU、重映射和基于systick的時間延遲等相關(guān)的API
 其他庫文件
用戶級別文件:
 stm32f2xx_hal_msp_template.c // 只有.c沒有.h。它包含用戶應(yīng)用程序中使用的外設(shè)的MSP初始化和反初始化(主程序和回調(diào)函數(shù))。使用者復(fù)制到自己目錄下使用模板。
 stm32f2xx_hal_conf_template.h // 用戶級別的庫配置文件模板。使用者復(fù)制到自己目錄下使用
 system_stm32f2xx.c    // 此文件主要包含SystemInit()函數(shù),該函數(shù)在剛復(fù)位及跳到main之前的啟動過程中被調(diào)用。**它不在啟動時配置系統(tǒng)時鐘(與標(biāo)準庫相反)**。時鐘的配置在用戶文件中使用HAL API來完成。
 startup_stm32f2xx.s    // 芯片啟動文件,主要包含堆棧定義,終端向量表等
 stm32f2xx_it.c/.h    // 中斷處理函數(shù)的相關(guān)實現(xiàn)
 main.c/.h

根據(jù)HAL庫的命名規(guī)則,其API可以分為以下三大類:

  • 初始化/反初始化函數(shù):HAL_PPP_Init(), HAL_PPP_DeInit()
  • IO 操作函數(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 ().

注意:目前 LL 庫是和 HAL 庫捆綁發(fā)布的,所以在 HAL 庫源碼中,還有一些名為 stm32f2xx_ll_ppp 的源碼文件,這些文件就是新增的LL庫文件。使用 CubeMX 生產(chǎn)項目時,可以選擇LL庫。

HAL 庫最大的特點就是對底層進行了抽象。在此結(jié)構(gòu)下,用戶代碼的處理主要分為三部分:

  • 處理外設(shè)句柄,實現(xiàn)用戶功能

  • 處理MSP

  • 處理各種回調(diào)函數(shù),外設(shè)句柄定義

HAL庫在結(jié)構(gòu)上,對每個外設(shè)抽象成了一個稱為ppp_HandleTypeDef的結(jié)構(gòu)體,其中ppp就是每個外設(shè)的名字。*所有的函數(shù)都是工作在ppp_HandleTypeDef指針之下。

每個外設(shè)/模塊實例都有自己的句柄。因此,實例資源是獨立的。

外圍進程相互通信:該句柄用于管理進程例程之間的共享數(shù)據(jù)資源。

下面,以ADC為例,

/** 
 * @brief  ADC handle Structure definition
 */
typedef struct
{
 ADC_TypeDef                   *Instance;                   /*!< Register base address */
 ADC_InitTypeDef               Init;                        /*!< ADC required parameters */
  __IO uint32_t                 NbrOfCurrentConversionRank;  /*!< ADC number of current conversion rank */
 DMA_HandleTypeDef             *DMA_Handle;                 /*!< Pointer DMA Handler */
 HAL_LockTypeDef               Lock;                        /*!< ADC locking object */
 __IO uint32_t                 State;                       /*!< ADC communication state */
 __IO uint32_t                 ErrorCode;                   /*!< ADC Error code */
}ADC_HandleTypeDef;

從上面的定義可以看出,ADC_HandleTypeDef中包含了ADC可能出現(xiàn)的所有定義,對于用戶想要使用ADC只要定義一個ADC_HandleTypeDef的變量,給每個變量賦好值,對應(yīng)的外設(shè)就抽象完了。接下來就是具體使用了。

當(dāng)然,對于那些共享型外設(shè)或者說系統(tǒng)外設(shè)來說,他們不需要進行以上這樣的抽象,這些部分與原來的標(biāo)準外設(shè)庫函數(shù)基本一樣。例如以下外設(shè):

  • GPIO
  • SYSTICK
  • NVIC
  • RCC
  • FLASH

以GPIO 為例,對于HAL_GPIO_Init()函數(shù),其只需要GPIO地址以及其初始化參數(shù)即可。

1 三種編程方式

HAL庫對所有的函數(shù)模型也進行了統(tǒng)一。在HAL庫中,支持三種編程模式:輪詢模式、中斷模式、DMA模式(如果外設(shè)支持)。其分別對應(yīng)如下三種類型的函數(shù)(以ADC為例):

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);


HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);

其中,帶_IT的表示工作在中斷模式下;帶_DMA的工作在DMA模式下(注意:DMA模式下也是開中斷的);什么都沒帶的就是輪詢模式(沒有開啟中斷的)。至于使用者使用何種方式,就看自己的選擇了。

此外,新的HAL庫架構(gòu)下統(tǒng)一采用宏的形式對各種中斷等進行配置(原來標(biāo)準外設(shè)庫一般都是各種函數(shù))。針對每種外設(shè)主要由以下宏:

  • __HAL_PPP_ENABLE_IT(HANDLE, INTERRUPT):使能一個指定的外設(shè)中斷
  • __HAL_PPP_DISABLE_IT(HANDLE, INTERRUPT):失能一個指定的外設(shè)中斷
  • __HAL_PPP_GET_IT (HANDLE, __ INTERRUPT __):獲得一個指定的外設(shè)中斷狀態(tài)
  • __HAL_PPP_CLEAR_IT (HANDLE, __ INTERRUPT __):清除一個指定的外設(shè)的中斷狀態(tài)
  • __HAL_PPP_GET_FLAG (HANDLE, FLAG):獲取一個指定的外設(shè)的標(biāo)志狀態(tài)
  • __HAL_PPP_CLEAR_FLAG (HANDLE, FLAG):清除一個指定的外設(shè)的標(biāo)志狀態(tài)
  • __HAL_PPP_ENABLE(HANDLE) :使能外設(shè)
  • __HAL_PPP_DISABLE(HANDLE) :失能外設(shè)
  • __HAL_PPP_XXXX (HANDLE, PARAM) :指定外設(shè)的宏定義
  • _HAL_PPP_GETIT_SOURCE (HANDLE, __ INTERRUPT __)檢查中斷源

2 三大回調(diào)函數(shù)

在 HAL 庫的源碼中,到處可見一些以__weak開頭的函數(shù),而且這些函數(shù),有些已經(jīng)被實現(xiàn)了,比如:

82e89762-abeb-11ed-bfe3-dac502259ad0.png

有些則沒有被實現(xiàn),例如:

__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
/* Prevent unused argument(s) compilation warning */
  UNUSED(hspi);
/* NOTE : This function should not be modified, when the callback is needed,the HAL_SPI_TxCpltCallback should be implemented in the user file
  */
}

所有帶有__weak關(guān)鍵字的函數(shù)表示,就可以由用戶自己來實現(xiàn)。如果出現(xiàn)了同名函數(shù),且不帶__weak關(guān)鍵字,那么連接器就會采用外部實現(xiàn)的同名函數(shù)。通常來說,HAL庫負責(zé)整個處理和MCU外設(shè)的處理邏輯,并將必要部分以回調(diào)函數(shù)的形式給出到用戶,用戶只需要在對應(yīng)的回調(diào)函數(shù)中做修改即可。

HAL 庫包含如下三種用戶級別回調(diào)函數(shù)(PPP為外設(shè)名):

  1. 外設(shè)系統(tǒng)級初始化/解除初始化回調(diào)函數(shù)(用戶代碼的第二大部分:對于MSP的處理):HAL_PPP_MspInit()HAL_PPP_MspDeInit例如:__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)。在HAL_PPP_Init() 函數(shù)中被調(diào)用,用來初始化底層相關(guān)的設(shè)備(GPIOs, clock, DMA, interrupt)

  2. 處理完成回調(diào)函數(shù):HAL_PPP_ProcessCpltCallback(Process指具體某種處理,如UART的Tx),例如:__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)。當(dāng)外設(shè)或者DMA工作完成后時,觸發(fā)中斷,該回調(diào)函數(shù)會在外設(shè)中斷處理函數(shù)或者DMA的中斷處理函數(shù)中被調(diào)用

  3. 錯誤處理回調(diào)函數(shù):HAL_PPP_ErrorCallback例如:__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)。當(dāng)外設(shè)或者DMA出現(xiàn)錯誤時,觸發(fā)終端,該回調(diào)函數(shù)會在外設(shè)中斷處理函數(shù)或者DMA的中斷處理函數(shù)中被調(diào)用。

參考文檔:

ST-Description of STM32F4 HAL and LL drivers.pdf
ST-en.stm32_embedded_software_offering.pdf


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5359

    瀏覽量

    120854
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10918

    瀏覽量

    356868
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4344

    瀏覽量

    62833

原文標(biāo)題:STM32標(biāo)準庫、HAL庫特點與應(yīng)用

文章出處:【微信號:EE時間,微信公眾號:EE時間】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    STM32標(biāo)準、HAL和LL介紹

    我們在進行STM32開發(fā)的時候,使用寄存器進行開發(fā)的終究是少數(shù),大多數(shù)人還是習(xí)慣用庫函數(shù)進行開發(fā)。到目前為止,有標(biāo)準外設(shè)、HAL、LL
    發(fā)表于 06-21 15:13 ?1.4w次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>標(biāo)準</b><b class='flag-5'>庫</b>、<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>和LL<b class='flag-5'>庫</b>介紹

    STM32四種對比 STM32標(biāo)準HAL有什么不同?

    STM32的四種STM32Snippets、Standard Peripheral Library、STM32Cube LL、STM32
    發(fā)表于 08-24 09:45 ?1.4w次閱讀
    <b class='flag-5'>STM32</b>四種<b class='flag-5'>庫</b>對比 <b class='flag-5'>STM32</b><b class='flag-5'>標(biāo)準</b><b class='flag-5'>庫</b>和<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>有什么不同?

    STM32標(biāo)準HAL有哪些不同

    STM32標(biāo)準HAL有哪些不同?標(biāo)準
    發(fā)表于 10-21 07:44

    STM32 HAL標(biāo)準的區(qū)別有哪些

    STM32的開發(fā)方式有哪幾種?怎樣去安裝HAL固件呢?STM32 HAL
    發(fā)表于 10-25 07:49

    STM32標(biāo)準改為HAL的程序?qū)崿F(xiàn)

    標(biāo)準占絕大多數(shù),自己買的板子跟的資料也一般是標(biāo)準,HAL很少,不過要是使用
    發(fā)表于 11-22 11:23 ?3.5w次閱讀

    STM32四種對比:寄存器、標(biāo)準外設(shè)HAL、LL

    1.我是選擇寄存器開發(fā)STM32,還是標(biāo)準外設(shè)呢? 2.你有STM32L0標(biāo)準外設(shè)嗎? 3.
    發(fā)表于 03-05 06:17 ?50次下載
    <b class='flag-5'>STM32</b>四種<b class='flag-5'>庫</b>對比:寄存器、<b class='flag-5'>標(biāo)準</b>外設(shè)<b class='flag-5'>庫</b>、<b class='flag-5'>HAL</b>、LL

    STM32HAL分析及使用

    STM32的三種開發(fā)方式通常新手在入門STM32的時候,首先都要先選擇一種要用的開發(fā)方式,不同的開發(fā)方式會導(dǎo)致你編程的架構(gòu)是完全不一樣的。一般大多數(shù)都會選用標(biāo)準
    發(fā)表于 11-22 11:21 ?115次下載
    <b class='flag-5'>STM32</b>的<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>分析及使用

    仿標(biāo)準,對HAL的補充代碼

    前言: ST官方從2017年下半年開始就不再維護升級標(biāo)準,轉(zhuǎn)而推廣HAL。到2019年,HAL
    發(fā)表于 11-29 11:36 ?30次下載
    仿<b class='flag-5'>標(biāo)準</b><b class='flag-5'>庫</b>,對<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>的補充代碼

    STM32 CubeMX+HAL基本操作

    STM32 CubeMX+HAL基本操作
    發(fā)表于 12-07 11:21 ?50次下載
    <b class='flag-5'>STM32</b> CubeMX+<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>基本操作

    STM32實戰(zhàn) 2 | STM32CubeMX及HAL點亮LED

    STM32實戰(zhàn) 2 | STM32CubeMX及HAL點亮LED
    發(fā)表于 12-08 12:36 ?34次下載
    <b class='flag-5'>STM32</b>實戰(zhàn) 2 | <b class='flag-5'>STM32</b>CubeMX及<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>點亮LED

    STM32STM32標(biāo)準HAL對照學(xué)習(xí)教程一--使用寄存器操控LED閃爍詳講

    STM32STM32標(biāo)準HAL對照學(xué)習(xí)教程一--使用寄存器操控LED閃爍詳講 前言本教
    發(fā)表于 12-31 19:17 ?19次下載
    【<b class='flag-5'>STM32</b>】<b class='flag-5'>STM32</b><b class='flag-5'>標(biāo)準</b><b class='flag-5'>庫</b>與<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>對照學(xué)習(xí)教程一--使用寄存器操控LED閃爍詳講

    STM32標(biāo)準HAL對照學(xué)習(xí)教程特別篇--GPIO詳講

    STM32】SMT32標(biāo)準HAL對照學(xué)習(xí)教程特別篇--GPIO詳講一、前言二、GPIO簡介1、定義2、分類3、復(fù)用三、GPIO工作模
    發(fā)表于 01-13 16:12 ?12次下載
    【<b class='flag-5'>STM32</b>】<b class='flag-5'>標(biāo)準</b><b class='flag-5'>庫</b>與<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>對照學(xué)習(xí)教程特別篇--GPIO詳講

    stm32 hal資料分享

    stm32 hal資料分享
    發(fā)表于 11-03 16:17 ?120次下載

    STM32 HAL的功能和使用方法 STM32 HAL標(biāo)準的區(qū)別

    和可維護性,從而節(jié)省開發(fā)成本和時間。STM32 HALSTM32系列芯片的HAL,由ST公
    發(fā)表于 08-08 18:21 ?4650次閱讀

    STM32 HAL串口收發(fā)是如何使用的?

    STM32 HAL串口收發(fā)是如何使用的? STM32是一款高性能的微控制器,它擁有廣泛的應(yīng)用領(lǐng)域,其中包括了各種通訊應(yīng)用,如UART串口通訊。HA
    的頭像 發(fā)表于 10-26 17:42 ?1265次閱讀
    主站蜘蛛池模板: 免费爱爱网址| 在线观看国产久青草| 在线视频你懂得| 国产精品性| 中文字幕精品一区影音先锋| 欧美精品影院| 午夜寂寞视频在线观看| 爱婷婷视频在线观看| 久久艹影院| 免费你懂的| 国产亚洲人成a在线v网站| 免费爱爱视频| 她也啪97在线视频| 伊人久久大香线蕉综合高清| 乱小说录目伦800| 亚洲68283精品人体| 欧美五月婷婷| fenfencao在线观看免费视频 | 亚洲日本视频在线观看| 欧美猛性| 日本欧美一区二区| 老师您的兔子好软水好多动漫视频| 美女扒开内裤无遮挡禁18| 亚洲国产精品va在线观看麻豆| 一级特级片| 日韩色网| 欧美成人精品一区二三区在线观看| 日本三级日本三级日本三级极| 四虎4hu影库永久地址| 特级黄毛片| 欧美爱爱网| 在线观看午夜| 午夜视频在线免费观看| 亚洲日本中文字幕天天更新| 伊人网综合在线视频| 日日操天天射| 美女丝袜长腿喷水gif动态图| 欧美精品xxxxbbbb| 91av在线视频观看| 国产中文字幕一区| 制服丝袜中文字幕第一页|