標題: STM32F103-hal庫函數 [打印本頁]
作者: lzylzylzylzy 時間: 2019-6-14 08:41
標題: STM32F103-hal庫函數
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;
作者: xing1954 時間: 2019-6-15 05:59
用著方便,謝謝。
作者: 51_users 時間: 2019-8-7 10:20
thanks
作者: zyluglugl 時間: 2021-8-11 07:20
期待樓主多出教程,學習了,謝謝!
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |