STM32CubeMx_HAL大概介紹


1.什么是STM32CubeMx和HAL庫

HAL庫對比標准庫,封裝程度更高,更具有移植性。STM32CUbeMx是一種圖形化配置界面,用來完成對外設的初始化,比如RCC模塊、NVIC、GPIO、串口、定時器。使用標准庫都是先對某個外設的結構體賦值,最后調用Init函數將結構體寫入寄存器,這個過程有點繁瑣,因為某個外設的初始化都是差不多固定的,比如定時器的初始化都是先分配,設置ARR。使用CubeMx工具可以直接圖形化設置,省去了自己去賦值外設結構體的步驟。

2.使用之前需要知道的幾個關鍵詞

   句柄:

    再標准庫中如果要初始化一個結構體肯定要先定義一個結構體比如

GPIO_InitTypeDef  GPIO_InitStructure;    //GPIO初始化結構體
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定時器時基結構體
NVIC_InitTypeDef NVIC_InitStructure;      //NVIC初始化結構體

這些都可以算作一個句柄,只不過在HAL庫中,一個外設的結構體不再是單單做一些初始化配置,比如:

 1 typedef struct
 2 {
 3       USART_TypeDef                 *Instance;        /*!< UART registers base address        */
 4       UART_InitTypeDef              Init;             /*!< UART communication parameters      */
 5       uint8_t                       *pTxBuffPtr;      /*!< Pointer to UART Tx transfer Buffer */
 6       uint16_t                      TxXferSize;       /*!< UART Tx Transfer size              */
 7       uint16_t                      TxXferCount;      /*!< UART Tx Transfer Counter           */
 8       uint8_t                       *pRxBuffPtr;      /*!< Pointer to UART Rx transfer Buffer */
 9       uint16_t                      RxXferSize;       /*!< UART Rx Transfer size              */
10       uint16_t                      RxXferCount;      /*!< UART Rx Transfer Counter           */  
11       DMA_HandleTypeDef             *hdmatx;          /*!< UART Tx DMA Handle parameters      */ 
12       DMA_HandleTypeDef             *hdmarx;          /*!< UART Rx DMA Handle parameters      */
13       HAL_LockTypeDef               Lock;             /*!< Locking object                     */
14       __IO HAL_UART_StateTypeDef    State;            /*!< UART communication state           */
15       __IO uint32_t                 ErrorCode;        /*!< UART Error code                    */
16 }UART_HandleTypeDef;
這樣的話,UART_HandleTypeDef這個結構體 定義一個變量,用來完成對串口的所有操作,包括之前的初始化結構體的基本配置,另外還添加了串口其他的操作:DMA,中斷等。有點像C#里面的對象。
對象的所有變量和方法(函數),都可以通過一個對象名+.的方法完成。第4行UART_InitTypeDef 這個結構體類型包含一下內容,這些和標准庫中串口初始化結構體的變量一樣,
 typedef struct
{
  uint32_t BaudRate;                
   uint32_t WordLength;  
   uint32_t StopBits;                
   uint32_t Parity; 
   uint32_t Mode;                   
   uint32_t HwFlowCtl;             
   uint32_t OverSampling;             
 } UART_InitTypeDef;

   回調函數:我們真正需要處理的函數:串口接收中斷回調、發送中斷回調、定時器更新中斷回調、輸入捕獲回調等待。

      回調函數本質上是定義在結構體內部的函數指針,這些回調函數在庫中以weak關鍵字若聲明,大部分內部為空,需要我們實現。

 1   void (* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Tx Half Complete Callback        */
 2   void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Tx Complete Callback             */
 3   void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Rx Half Complete Callback        */
 4   void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Rx Complete Callback             */
 5   void (* ErrorCallback)(struct __UART_HandleTypeDef *huart);             /*!< UART Error Callback                   */
 6   void (* AbortCpltCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART Abort Complete Callback          */
 7   void (* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Transmit Complete Callback */
 8   void (* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart);  /*!< UART Abort Receive Complete Callback  */
 9   void (* WakeupCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Wakeup Callback                  */
10 
11   void (* MspInitCallback)(struct __UART_HandleTypeDef *huart);           /*!< UART Msp Init callback                */
12   void (* MspDeInitCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART Msp DeInit callback              */

   __weak 關鍵詞:弱聲明,如果我們定義了同名函數,則編譯器使用我們編寫的函數。有點像類中的構造函數,你若沒寫,則使用構造函數,若重寫了,則覆蓋系統提供的構造函數。

3.對比標准庫,HAL庫的架構和使用流程

HAL庫中,首先在CubeMx中設置外設的基本配置,比如串口的波特率、字長,定時器的PSC、ARR。然后在生成的工程中處理回調函數。 

 

 

4.MSP函數

MSP函數是和CPU具體相關的配置。比如一個外設本身的配置在 外設名+Init函數中配置,比如串口的:

 1 void MX_USART1_UART_Init(void)
 2 {
 3 
 4   huart1.Instance = USART1;
 5   huart1.Init.BaudRate = 115200;
 6   huart1.Init.WordLength = UART_WORDLENGTH_8B;
 7   huart1.Init.StopBits = UART_STOPBITS_1;
 8   huart1.Init.Parity = UART_PARITY_NONE;
 9   huart1.Init.Mode = UART_MODE_TX_RX;
10   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
11   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
12   if (HAL_UART_Init(&huart1) != HAL_OK)
13   {
14     Error_Handler();
15   }
16 
17 }

而與外設無關但是和CPU相關的配置,比如外設用到的GPIO引腳,這個引腳的配置是在MSP函數中配置:包括開時鍾,配置GPIO引腳的模式、速度。

 1 void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
 2 {
 3 
 4   GPIO_InitTypeDef GPIO_InitStruct = {0};
 5   if(uartHandle->Instance==USART1)
 6   {
 7   /* USER CODE BEGIN USART1_MspInit 0 */
 8 
 9   /* USER CODE END USART1_MspInit 0 */
10     /* USART1 clock enable */
11     __HAL_RCC_USART1_CLK_ENABLE();
12   
13     __HAL_RCC_GPIOA_CLK_ENABLE();
14     /**USART1 GPIO Configuration    
15     PA9     ------> USART1_TX
16     PA10     ------> USART1_RX 
17     */
18     GPIO_InitStruct.Pin = GPIO_PIN_9;
19     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
20     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
21     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
22 
23     GPIO_InitStruct.Pin = GPIO_PIN_10;
24     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
25     GPIO_InitStruct.Pull = GPIO_NOPULL;
26     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
27 
28     /* USART1 interrupt Init */
29     HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
30     HAL_NVIC_EnableIRQ(USART1_IRQn);
31   /* USER CODE BEGIN USART1_MspInit 1 */
32 
33   /* USER CODE END USART1_MspInit 1 */
34   }
35 }

除了GPIO、RCC、NVIC這些CPU本身的東西,別的只要涉及到外設的配置,都會有兩個函數完成初始化:TIMER、ADC等

MX_外設名_Init    //外設的具體配置
HAL_外設名_MspInit //外設和CPU連接的引腳配置

這樣做的好處是方便移植,確實很方便。需要注意的是,

HAL_外設名_MspInit 函數被自動被 MX_外設名_Init調用。

 

4.注意事項:

4.1 打開sys下的debug,不然無法第二次下載程序

4.2自己的代碼要寫在每個begin和end之間,不然會被CubeMx重新生成的工程覆蓋(丟失)

4.3修改外設配置最好從CubeMx中修改。由外設生成的代碼,不要再MDK或IAR中直接修改,除非以后不想再使用這個工程的CubeMx配置工程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM