找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5592|回復(fù): 3
收起左側(cè)

STM32F103-hal庫函數(shù)

[復(fù)制鏈接]
ID:423265 發(fā)表于 2019-6-14 08:41 | 顯示全部樓層 |閱讀模式
1.      HAL_GPIO_Init:初始化我們需要用到的引腳的工作模式,包括具體引腳的工作速度、是否復(fù)用模式、上下拉等等參數(shù)。
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef*GPIO_Init)

2.      HAL_GPIO_DeInit:將初始化之后的引腳恢復(fù)成默認的狀態(tài)--各個寄存器復(fù)位時的值
       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:讀取我們想要知道的引腳的電平狀態(tài)、函數(shù)返回值為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:翻轉(zhuǎn)某個引腳的電平狀態(tài)
voidHAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);

6.     HAL_GPIO_LockPin:如果一個管腳的當(dāng)前狀態(tài)是1,讀管腳值使用鎖定,當(dāng)這個管腳電平變化時保持鎖定時的值,直到重置才改變
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:這個函數(shù)是外部中斷服務(wù)函數(shù),用來響應(yīng)外部中斷的觸發(fā),函數(shù)實體里面有兩個功能,1是清除中斷標記位,2是調(diào)用下面要介紹的回調(diào)函數(shù)。實際調(diào)用的是下邊的中斷回調(diào)函數(shù)
voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);

8.     HAL_GPIO_EXTI_Callback:中斷回調(diào)函數(shù),可以理解為中斷函數(shù)具體要響應(yīng)的動作。
voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
9.     使能時鐘
/*
       使能時鐘A、B、C、D
       這里使能時鐘的方法與標準庫不一樣,HAL庫其實是宏定義,標準庫則是函數(shù)。
*/
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();

10.  HAL_GetTick:獲取系統(tǒng)當(dāng)前運行時間,返回uint32_t類型,時間為毫秒ms。
__weak uint32_t HAL_GetTick(void)
__weak修飾符:“弱函數(shù)”
加上了__weak 修飾符的函數(shù),用戶可以在用戶文件中重新定義一個同名函數(shù),最終編譯器編譯的時候,會選擇用戶定義的函數(shù),如果用戶沒有重新定義這個函數(shù),那么編譯器就會執(zhí)行__weak 聲明的函數(shù),并且編譯器不會報錯。
__weak 在回調(diào)函數(shù)的時候經(jīng)常用到。這樣的好處是,系統(tǒng)默認定義了一個空的回調(diào)函數(shù),保證編譯器不會報錯。同時,如果用戶自己要定義用戶回調(diào)函數(shù),那么只需要重新定義即可,不需要考慮函數(shù)重復(fù)定義的問題,使用非常方便,在 HAL 庫中__weak關(guān)鍵字被廣泛使用。

11.  HAL_Delay:Delay延時,單位毫秒ms。
__weak void HAL_Delay(__IO uint32_t Delay)
例:HAL_Delay(500); //延時500ms

12.  HAL_UART_Transmit:串口發(fā)送數(shù)據(jù)
HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,uint32_t Timeout)
例:HAL_UART_Transmit(&huart1, MyRxData, 15,100); //發(fā)送串口1數(shù)據(jù)
參數(shù):串口,數(shù)據(jù),大小,超時時間

13.  HAL_UART_Receive:串口接收數(shù)據(jù)
HAL_StatusTypeDefHAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,uint32_t Timeout)
例:HAL_UART_Receive(&huart1, MyRxData1, 15,100)//接收串口1數(shù)據(jù)
參數(shù):串口,數(shù)據(jù),大小,超時時間

14.  HAL_ADC_Start:開啟ADC轉(zhuǎn)換
HAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef* hadc)
例:HAL_ADC_Start(&hadc1);  //hadc1ADC_HandleTypeDef變量


15.  HAL_ADC_PollForConversion:等待ADC轉(zhuǎn)換完成
HAL_StatusTypeDefHAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
例:if (HAL_ADC_PollForConversion(&hadc1, 100)== HAL_OK)   //第二個參數(shù)表示超時時間,單位ms

16.  HAL_ADC_GetValue:獲取ADC轉(zhuǎn)換數(shù)據(jù)
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef*hadc)
例:KeyADCVal =(WORD)HAL_ADC_GetValue(&hadc1);

17.  HAL_ADC_Stop:停止ADC轉(zhuǎn)換
HAL_StatusTypeDefHAL_ADC_Stop(ADC_HandleTypeDef* hadc)
例:HAL_ADC_Stop(&hadc1);

18.  HAL_SPI_Transmit:SPI發(fā)送
HAL_StatusTypeDefHAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size,uint32_t Timeout)
例:HAL_SPI_Transmit(&hspi1, data, 2, 100);//SPI發(fā)送data2個字節(jié),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個字節(jié),100ms超時

20.  HAL_SPI_TransmitReceive:SPI發(fā)送和接收
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef*hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
例://SPI發(fā)送/接收數(shù)據(jù),tx_data:發(fā)送數(shù)據(jù);rx_data:接收數(shù)據(jù),100ms超時
HAL_SPI_TransmitReceive(&hspi1, tx_data,rx_data, 2, 100);

21.  HAL_I2C_Master_Transmit:I2C主機發(fā)送數(shù)據(jù)
HAL_StatusTypeDefHAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t*pData, uint16_t Size, uint32_t Timeout)
例:IIC根據(jù)地質(zhì)發(fā)送數(shù)據(jù)到不同的設(shè)備
HAL_I2C_Master_Transmit(&hi2c1, 0x78,data0, 1, 100); //主機發(fā)送數(shù)據(jù)

22.  HAL_I2C_Master_Receive:I2C主機接收數(shù)據(jù)
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); //主機接收數(shù)據(jù)

23.  HAL_I2C_Slave_Transmit:I2C從機發(fā)送數(shù)據(jù)
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); //發(fā)送數(shù)據(jù)data0

24.  HAL_I2C_Slave_Receive:I2C從機接收數(shù)據(jù)
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) //判斷是否接收到數(shù)據(jù)

25.  HAL_I2C_Mem_Write:I2C設(shè)備寄存器寫數(shù)據(jù)
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設(shè)備號指針,這里用的是I2C1: &hi2c1;
//DevAddress: 設(shè)備地址;MemAddress: 寄存器地址;MemAddSize: 寄存器長度;
//*pData: 數(shù)據(jù)指針;Size: 數(shù)據(jù)長度;Timeout: 超時時間
HAL_I2C_Mem_Write(&hi2c1, 0x78, 0X00, 1,data0, 1, 100); //寫數(shù)據(jù)

26.  HAL_I2C_Mem_Read:I2C設(shè)備寄存器讀數(shù)據(jù)
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設(shè)備號指針,這里用的是I2C1: &hi2c1
//DevAddress: 設(shè)備地址;MemAddress: 寄存器地址;MemAddSize: 寄存器長度;
//*pData: 數(shù)據(jù)指針;Size: 數(shù)據(jù)長度;Timeout: 超時時間
HAL_I2C_Mem_Read(&hi2c1, 0x78, 0X00, 1,data1, 1, 100); //讀數(shù)據(jù)
27.  HAL_IWDG_Refresh:獨立看門狗數(shù)據(jù)重裝函數(shù)
獨立看門狗使用,獨立看門狗時鐘采用與RTC公用的40KHz的時鐘,與系統(tǒng)時鐘分開,即使系統(tǒng)時鐘掛了,看門狗還是可以工作
例:HAL_IWDG_Refresh(&hiwdg); //重裝看門狗數(shù)據(jù)為4095.

28.  三種編程方式
  HAL庫對所有的函數(shù)模型也進行了統(tǒng)一。在HAL庫中,支持三種編程模式:輪詢模式、中斷模式、DMA模式(如果外設(shè)支持)。其分別對應(yīng)如下三種類型的函數(shù)(以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:根據(jù)RCC_OscInitTypeDef結(jié)構(gòu)體中指定的參數(shù)初始化RCC振蕩器
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)
例:ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化,RCC_OscInitTypeDef指針
RCC_OscInitTypeDef結(jié)構(gòu)體:
typedef struct
{
  uint32_t OscillatorType; //①選定將被配置的振蕩器        
  uint32_t HSEState;    //②HSE狀態(tài)              
  uint32_t LSEState;    //③LSE狀態(tài)            
  uint32_t HSIState;    //④HSI狀態(tài)            
  uint32_t HSICalibrationValue;  //⑤HSI校準調(diào)整值  
  uint32_t LSIState;       //⑥LSI狀態(tài)         

#if defined(RCC_HSI48_SUPPORT)
  uint32_t HSI48State; //⑦HSI狀態(tài),#if defined(RCC_HSI48_SUPPORT)            
#endif

  uint32_t MSIState;      //⑧,MSI狀態(tài)              
  uint32_t MSICalibrationValue; //⑨,MSI校準調(diào)整值  
  uint32_t MSIClockRange;   //⑩,MSI頻率范圍      
  RCC_PLLInitTypeDef PLL;   //⑾,PLL結(jié)構(gòu)體參數(shù)         
} RCC_OscInitTypeDef;

30.  HAL_RCC_ClockConfig:根據(jù)RCC_ClkInitTypeDef結(jié)構(gòu)體中指定的參數(shù)初始化CPU、AHB(系統(tǒng)總線)和APB(外圍總線)總線時鐘
HAL_StatusTypeDefHAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
例:ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_2);  //同時設(shè)置FLASH延時周期為2WS,也就是3個CPU周期。
RCC_ClkInitTypeDef結(jié)構(gòu)體:
typedefstruct
{
  uint32_tClockType;       //①,選定將被配置的時鐘            
  uint32_tSYSCLKSource;     //②,用作系統(tǒng)時鐘的時鐘源選擇         
  uint32_tAHBCLKDivider;    //③,AHB時鐘(HCLK)分頻器,該時鐘由SYSCLK而來      
  uint32_tAPB1CLKDivider;    //④,APB1時鐘(PCLK1)分頻器,該時鐘由HCLK而來      
  uint32_tAPB2CLKDivider;    //⑤,APB2時鐘(PCLK2)分頻器,該時鐘由HCLK而來      
}RCC_ClkInitTypeDef;
回復(fù)

使用道具 舉報

ID:525821 發(fā)表于 2019-6-15 05:59 | 顯示全部樓層
用著方便,謝謝。
回復(fù)

使用道具 舉報

ID:595380 發(fā)表于 2019-8-7 10:20 | 顯示全部樓層
thanks
回復(fù)

使用道具 舉報

ID:584195 發(fā)表于 2021-8-11 07:20 | 顯示全部樓層
期待樓主多出教程,學(xué)習(xí)了,謝謝!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表