1. HAL_GPIO_Init:初始化我們需要用到的引腳的工作模式,包括具體引腳的工作速度、是否復用模式、上下拉等等參數。 void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef*GPIO_Init)
2. HAL_GPIO_DeInit:將初始化之后的引腳恢復成默認的狀態--各個寄存器復位時的值 void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx,uint32_t GPIO_Pin) 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); 3. HAL_GPIO_ReadPin:讀取我們想要知道的引腳的電平狀態、函數返回值為0或1。 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx, uint16_t GPIO_Pin) 例:GPIO_PinState pinState; pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
4. HAL_GPIO_WritePin:給某個引腳寫0或1,但是不要理解成,寫1就是使能之類的意思,有些寄存器寫1是擦除的意思 voidHAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinStatePinState) 例:#define LED_G(x) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, (x) ? GPIO_PIN_SET :GPIO_PIN_RESET) //配置引腳的初始化電平
5. HAL_GPIO_TogglePin:翻轉某個引腳的電平狀態 voidHAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
6. HAL_GPIO_LockPin:如果一個管腳的當前狀態是1,讀管腳值使用鎖定,當這個管腳電平變化時保持鎖定時的值,直到重置才改變 HAL_StatusTypeDefHAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 例:HAL_StatusTypeDef hal_State; hal_State = HAL_GPIO_LockPin(GPIOC, GPIO_PIN_9);
7. HAL_GPIO_EXTI_IRQHandler:這個函數是外部中斷服務函數,用來響應外部中斷的觸發,函數實體里面有兩個功能,1是清除中斷標記位,2是調用下面要介紹的回調函數。實際調用的是下邊的中斷回調函數 voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
8. HAL_GPIO_EXTI_Callback:中斷回調函數,可以理解為中斷函數具體要響應的動作。 voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 例:HAL_GPIO_EXTI_Callback(GPIO_Pin); 9. 使能時鐘 /* 使能時鐘A、B、C、D 這里使能時鐘的方法與標準庫不一樣,HAL庫其實是宏定義,標準庫則是函數。 */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE();
10. HAL_GetTick:獲取系統當前運行時間,返回uint32_t類型,時間為毫秒ms。 __weak uint32_t HAL_GetTick(void) __weak修飾符:“弱函數” 加上了__weak 修飾符的函數,用戶可以在用戶文件中重新定義一個同名函數,最終編譯器編譯的時候,會選擇用戶定義的函數,如果用戶沒有重新定義這個函數,那么編譯器就會執行__weak 聲明的函數,并且編譯器不會報錯。 __weak 在回調函數的時候經常用到。這樣的好處是,系統默認定義了一個空的回調函數,保證編譯器不會報錯。同時,如果用戶自己要定義用戶回調函數,那么只需要重新定義即可,不需要考慮函數重復定義的問題,使用非常方便,在 HAL 庫中__weak關鍵字被廣泛使用。
11. HAL_Delay:Delay延時,單位毫秒ms。 __weak void HAL_Delay(__IO uint32_t Delay) 例:HAL_Delay(500); //延時500ms
12. HAL_UART_Transmit:串口發送數據 HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,uint32_t Timeout) 例:HAL_UART_Transmit(&huart1, MyRxData, 15,100); //發送串口1數據 參數:串口,數據,大小,超時時間
13. HAL_UART_Receive:串口接收數據 HAL_StatusTypeDefHAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,uint32_t Timeout) 例:HAL_UART_Receive(&huart1, MyRxData1, 15,100)//接收串口1數據 參數:串口,數據,大小,超時時間
14. HAL_ADC_Start:開啟ADC轉換 HAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef* hadc) 例:HAL_ADC_Start(&hadc1); //hadc1為ADC_HandleTypeDef變量
15. HAL_ADC_PollForConversion:等待ADC轉換完成 HAL_StatusTypeDefHAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout) 例:if (HAL_ADC_PollForConversion(&hadc1, 100)== HAL_OK) //第二個參數表示超時時間,單位ms
16. HAL_ADC_GetValue:獲取ADC轉換數據 uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef*hadc) 例:KeyADCVal =(WORD)HAL_ADC_GetValue(&hadc1);
17. HAL_ADC_Stop:停止ADC轉換 HAL_StatusTypeDefHAL_ADC_Stop(ADC_HandleTypeDef* hadc) 例:HAL_ADC_Stop(&hadc1);
18. HAL_SPI_Transmit:SPI發送 HAL_StatusTypeDefHAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size,uint32_t Timeout) 例:HAL_SPI_Transmit(&hspi1, data, 2, 100);//SPI發送data的2個字節,100ms超時 19. HAL_SPI_Receive:SPI接收 HAL_StatusTypeDefHAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size,uint32_t Timeout) 例:while(HAL_SPI_Receive(&hspi1,data, 1, 100) != HAL_OK)//接收1個字節,100ms超時
20. HAL_SPI_TransmitReceive:SPI發送和接收 HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef*hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) 例://SPI發送/接收數據,tx_data:發送數據;rx_data:接收數據,100ms超時 HAL_SPI_TransmitReceive(&hspi1, tx_data,rx_data, 2, 100);
21. HAL_I2C_Master_Transmit:I2C主機發送數據 HAL_StatusTypeDefHAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t*pData, uint16_t Size, uint32_t Timeout) 例:IIC根據地質發送數據到不同的設備 HAL_I2C_Master_Transmit(&hi2c1, 0x78,data0, 1, 100); //主機發送數據
22. HAL_I2C_Master_Receive:I2C主機接收數據 HAL_StatusTypeDefHAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t*pData, uint16_t Size, uint32_t Timeout) 例:HAL_I2C_Master_Receive(&hi2c1, 0x78,data1, 1, 100); //主機接收數據
23. HAL_I2C_Slave_Transmit:I2C從機發送數據 HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef*hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) 例:HAL_I2C_Slave_Transmit(&hi2c1, data0, 1,100); //發送數據data0
24. HAL_I2C_Slave_Receive:I2C從機接收數據 HAL_StatusTypeDefHAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,uint32_t Timeout) 例:if(HAL_I2C_Slave_Receive(&hi2c1,data1, 1, 100) == HAL_OK) //判斷是否接收到數據
25. HAL_I2C_Mem_Write:I2C設備寄存器寫數據 HAL_StatusTypeDefHAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_tMemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_tTimeout) 例://*hi2c: I2C設備號指針,這里用的是I2C1: &hi2c1; //DevAddress: 設備地址;MemAddress: 寄存器地址;MemAddSize: 寄存器長度; //*pData: 數據指針;Size: 數據長度;Timeout: 超時時間 HAL_I2C_Mem_Write(&hi2c1, 0x78, 0X00, 1,data0, 1, 100); //寫數據
26. HAL_I2C_Mem_Read:I2C設備寄存器讀數據 HAL_StatusTypeDefHAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_tMemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_tTimeout) 例://*hi2c: I2C設備號指針,這里用的是I2C1: &hi2c1; //DevAddress: 設備地址;MemAddress: 寄存器地址;MemAddSize: 寄存器長度; //*pData: 數據指針;Size: 數據長度;Timeout: 超時時間 HAL_I2C_Mem_Read(&hi2c1, 0x78, 0X00, 1,data1, 1, 100); //讀數據 27. HAL_IWDG_Refresh:獨立看門狗數據重裝函數 獨立看門狗使用,獨立看門狗時鐘采用與RTC公用的40KHz的時鐘,與系統時鐘分開,即使系統時鐘掛了,看門狗還是可以工作 例:HAL_IWDG_Refresh(&hiwdg); //重裝看門狗數據為4095.
28. 三種編程方式 HAL庫對所有的函數模型也進行了統一。在HAL庫中,支持三種編程模式:輪詢模式、中斷模式、DMA模式(如果外設支持)。其分別對應如下三種類型的函數(以ADC為例): HAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef* hadc); HAL_StatusTypeDefHAL_ADC_Stop(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef*hadc); HAL_StatusTypeDefHAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDefHAL_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模式下也是開中斷的);什么都沒帶的就是輪詢模式(沒有開啟中斷的)。
29. HAL_RCC_OscConfig:根據RCC_OscInitTypeDef結構體中指定的參數初始化RCC振蕩器 HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) 例:ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化,RCC_OscInitTypeDef指針 RCC_OscInitTypeDef結構體: typedef struct { uint32_t OscillatorType; //①選定將被配置的振蕩器 uint32_t HSEState; //②HSE狀態 uint32_t LSEState; //③LSE狀態 uint32_t HSIState; //④HSI狀態 uint32_t HSICalibrationValue; //⑤HSI校準調整值 uint32_t LSIState; //⑥LSI狀態
#if defined(RCC_HSI48_SUPPORT) uint32_t HSI48State; //⑦HSI狀態,#if defined(RCC_HSI48_SUPPORT) #endif
uint32_t MSIState; //⑧,MSI狀態 uint32_t MSICalibrationValue; //⑨,MSI校準調整值 uint32_t MSIClockRange; //⑩,MSI頻率范圍 RCC_PLLInitTypeDef PLL; //⑾,PLL結構體參數 } RCC_OscInitTypeDef;
30. HAL_RCC_ClockConfig:根據RCC_ClkInitTypeDef結構體中指定的參數初始化CPU、AHB(系統總線)和APB(外圍總線)總線時鐘 HAL_StatusTypeDefHAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) 例:ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_2); //同時設置FLASH延時周期為2WS,也就是3個CPU周期。 RCC_ClkInitTypeDef結構體: typedefstruct { uint32_tClockType; //①,選定將被配置的時鐘 uint32_tSYSCLKSource; //②,用作系統時鐘的時鐘源選擇 uint32_tAHBCLKDivider; //③,AHB時鐘(HCLK)分頻器,該時鐘由SYSCLK而來 uint32_tAPB1CLKDivider; //④,APB1時鐘(PCLK1)分頻器,該時鐘由HCLK而來 uint32_tAPB2CLKDivider; //⑤,APB2時鐘(PCLK2)分頻器,該時鐘由HCLK而來 }RCC_ClkInitTypeDef; |