1.函數(shù)存放路徑
HAL庫的GPIO函數(shù),存放路徑如圖1所示:路徑Driver/STM32F1xx_HAL_Driver/stm32f1xx_hal_gpio.c,其中一級文件夾STM32F1xx_HAL_Driver存放的是ST公司提供的HAL庫頭文件和源文件,也就是所有底層硬件抽象層API接口函數(shù)的聲明和定義;之前大家學(xué)習(xí)51單片機都是直接對寄存器進(jìn)行配置,而對于STM32數(shù)百個寄存器直接配置將非常繁瑣;HAL庫提供的這一整套API方便開發(fā)者直接調(diào)用函數(shù),不需要去知道操作的哪個寄存器;
但這不是說寄存器相關(guān)原理就完全不用學(xué)習(xí)了,相反,在STM32的學(xué)習(xí)過程中,大家既要知道函數(shù)的功能,也要了解各個外設(shè)的硬件運行機制;這樣HAL庫的開發(fā)才會游刃有余;后面的函數(shù)功能介紹部分,我們也會同步介紹相關(guān)寄存器的操作;
文件夾中的每一個源文件stm32f1xx_hal-ppp.c都對應(yīng)一個頭文件stm32f1xx_hal-ppp.h,
圖1,GPIO函數(shù)的存放路徑
2.1 HAL_GPIO_Init( )
函數(shù)功能介紹:該函數(shù)主要用來初始化我們需要用到的GPIO端口引腳,設(shè)置其工作頻率、工作模式、上下拉等參數(shù),當(dāng)使用CubeMX配置工程時,所有參數(shù)在CubeMX中調(diào)配,函數(shù)自動在工程中生成。
函數(shù)參數(shù):GPIOx: 是GPIO_TypeDef * 類型,參數(shù)可選范圍是:.GPIOA~GPIOG;
函數(shù)參數(shù):GPIO_Init:是 GPIO_InitTypeDef *類型,該結(jié)構(gòu)體指針包含的變量有:GPIO口的速度,GPIO口的模式,GPIO口的上拉或下拉狀態(tài),GPIO口的Pin位操作引腳;
返回值:無
應(yīng)用場景:任何GPIO的端口都需要先進(jìn)行初始化操作;
* @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init.
* @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
* @param GPIO_Init: pointer to a GPIO_InitTypeDef structure that contains
* the configuration information for the specified GPIO peripheral.
* @retval None
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
2.2 HAL_GPIO_WritePin()
函數(shù)功能:主要功能是給某個GPIO寫0或1;
注意事項:此函數(shù)使用GPIOx_BSRR寄存器來允許讀取/修改訪問。通過這種方式,在讀取和修改訪問之間沒有發(fā)生IRQ的風(fēng)險;
函數(shù)參數(shù):GPIOx: 是GPIO_TypeDef * 類型,是GPIO寄存器類型,參數(shù)可選范圍是GPIOA~GPIOG;
函數(shù)參數(shù): GPIO_Pin:是unit16_t類型,是GPIO寄存器的位端口;連接外設(shè)LED燈;參數(shù)可選范圍是GPIO_PIN_0~GPIO_PIN_15;
函數(shù)參數(shù): PinState,指定要寫入選定位的值;參數(shù)可選范圍是,GPIO_PIN_RESET,GPIO_PIN_SET兩個值;
返回值:無;
應(yīng)用場景:設(shè)置LED燈亮滅,與延時函數(shù)配合使用;
寄存器關(guān)聯(lián):通過調(diào)用該函數(shù)HAL_GPIO_WritePin(),可以設(shè)置ODR寄存器的值(該寄存器的16位可讀可寫),然后IO端口即可輸出對應(yīng)寫入的值;
* @brief Sets or clears the selected data port bit.
* @note This function uses GPIOx_BSRR register to allow atomic read/modify
* accesses. In this way, there is no risk of an IRQ occurring between
* the read and the modify access.
* @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
* @param GPIO_Pin: specifies the port bit to be written.
* This parameter can be one of GPIO_PIN_x where x can be (0..15).
* @param PinState: specifies the value to be written to the selected bit.
* This parameter can be one of the GPIO_PinState enum values:
* @arg GPIO_PIN_RESET: to clear the port pin
* @arg GPIO_PIN_SET: to set the port pin
* @retval None
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
2.3 HAL_GPIO_TogglePin()
函數(shù)簡介:用于翻轉(zhuǎn)某個GPIO引腳的電平狀態(tài)。如果為0則變?yōu)?;如果為1則變?yōu)?。
函數(shù)參數(shù):GPIOx: 是GPIO_TypeDef * 類型,是GPIO寄存器類型,參數(shù)可選范圍是GPIOA~GPIOG;
函數(shù)參數(shù): GPIO_Pin:是unit16_t類型,是GPIO寄存器的位端口;連接外設(shè)LED燈;參數(shù)可選范圍是GPIO_PIN_0~GPIO_PIN_15;
返回值:無
應(yīng)用場景:設(shè)置LED燈亮滅
* @brief Toggles the specified GPIO pin
* @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
* @param GPIO_Pin: Specifies the pins to be toggled.
* @retval None
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
2.4 HAL_GPIO_ReadPin()
函數(shù)簡介:讀取輸入端口引腳的狀態(tài);
函數(shù)參數(shù):GPIOx: 是GPIO_TypeDef * 類型,是GPIO寄存器類型,參數(shù)可選范圍是GPIOA~GPIOG;
函數(shù)參數(shù): GPIO_Pin:是unit16_t類型,是GPIO寄存器的位端口;連接外設(shè)LED燈;參數(shù)可選范圍是GPIO_PIN_0~GPIO_PIN_15;
返回值: 引腳輸入狀態(tài)的值;返回值有:GPIO_PIN_RESET或GPIO_PIN_SET;
應(yīng)用場景:按鍵讀取GPIO的狀態(tài);
寄存器關(guān)聯(lián):通過調(diào)用函數(shù) HAL_GPIO_ReadPin(),
可以實現(xiàn)對IDR寄存器的數(shù)據(jù)讀取;
IDR是只讀輸入寄存器,并且只能以16 位的形式讀出;
例如要讀取GPIOF.5 的輸入電平,方法是:
HAL_GPIO_ReadPin (GPIOF, GPIO_Pin_5);
* @brief Reads the specified input port pin.
* @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
* @param GPIO_Pin: specifies the port bit to read.
* This parameter can be GPIO_PIN_x where x can be (0..15).
* @retval The input port pin value.
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
3.函數(shù)參數(shù):結(jié)構(gòu)體類型的函數(shù)參數(shù)
結(jié)構(gòu)體就是將多個變量組合為一個有機整體,
函數(shù) HAL_GPIO_Init( ), 第一個參數(shù) 是 GPIO,它的類型是 GPIO_TypeDef * ,指向結(jié)構(gòu)體變量(GPIO_TypeDef )的指針;右鍵雙擊 GPIO_TypeDef,然后選擇 go to definition.就可以查看到該結(jié)構(gòu)體成員變量的定義如圖2所示:
圖2:GPIO_TypeDef 結(jié)構(gòu)體定義
該結(jié)構(gòu)體成員變量表示了7個寄存器的名稱,STM32 的每個 IO 端口都由這 7 個寄存器來控制;其中,我們最常用的 IO 端口寄存器是 4 個:CRL、CRH、IDR、ODR
2 個 32 位的端口配置寄存器 CRL 和 CRH;
2 個 32 位的數(shù)據(jù)寄存器 IDR 和 ODR;
1 個 32 位的置位/復(fù)位寄存器BSRR;
1個 16 位的復(fù)位寄存器 BRR;
1 個 32 位的鎖存寄存器 LCKR;
第二個參數(shù)是GPIO_Init:它的類型是GPIO_InitTypeDef *,指向結(jié)構(gòu)體變量(GPIO_InitTypeDef )的指針,其中GPIO_InitTypeDef結(jié)構(gòu)體包含了Pin,mode ,pull,speed等幾個成員變量,分別描述了GPIO口的速度,模式,和端口上拉或下拉狀態(tài)等;
結(jié)構(gòu)體指針成員變量的引用方法是通過 '->'符號實現(xiàn),比如要訪問GPIOC結(jié)構(gòu)體指針指向的成員變量Speed,方法是GPIOC-> Speed;
圖3 GPIO_InitTypeDef 結(jié)構(gòu)體定義
當(dāng)函數(shù)的入口參數(shù)隨著開發(fā)不得不增多時,采用結(jié)構(gòu)體變量,只需要在結(jié)構(gòu)體中增加成員變量,而不需要修改函數(shù)定義就可以達(dá)到增加變量的目的;從而提高代碼的可讀性。
上一篇:單片機零基礎(chǔ)學(xué)習(xí)之從“點燈”入門STM32
下一篇:【STM32學(xué)習(xí)筆記5】EXTI外部中斷
推薦閱讀最新更新時間:2025-06-12 22:23



設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹
- ch343g串口通信四電平版
- ADM3232E ±15 kV ESD 保護(hù)、3.3V、RS-232 線路驅(qū)動器/接收器的典型應(yīng)用
- AD587JQ 低功耗電壓基準(zhǔn)、12 位 CMOS DAC 應(yīng)用的典型應(yīng)用電路
- NCP45780IMNGEVB:NCP45780IMN24RTWG 評估套件
- LTC3895IFE 高效 140V 至 12V 降壓轉(zhuǎn)換器的典型應(yīng)用電路
- 使用 Analog Devices 的 RH1185AMK 的參考設(shè)計
- TA8210AL 20W BTL x 2ch 音頻功率放大器典型應(yīng)用
- NSIC2050JBT3G 用于基本交流應(yīng)用的恒流 LED 驅(qū)動器的典型應(yīng)用
- 智能車原理圖+PCB圖(曾經(jīng)國家2等獎)
- 2021年E題-數(shù)字-模擬信號混合傳輸收發(fā)機+猜的都對
- can轉(zhuǎn)Profinet網(wǎng)關(guān)轉(zhuǎn)換:S7-1200PLC與施耐德變頻器間的通信實現(xiàn)
- 變頻器開關(guān)電源的維修檢測方法及案例分析
- 電機常見的噪音、振動問題及解決方法
- 萬利達(dá)電動機保護(hù)器接ModbusRTU轉(zhuǎn)profibusDP網(wǎng)關(guān)與300PLC通訊
- 士林變頻器如何與ModbusRTU轉(zhuǎn)profibusDP網(wǎng)關(guān)通訊
- 什么是邊緣盒子?一文講透邊緣計算設(shè)備在不同行業(yè)的真實應(yīng)用
- 步進(jìn)電機控制指令詳解
- 依利浦實驗室人工智能平臺為Ceva NeuPro-Nano NPU優(yōu)化 推動實現(xiàn)更智能的邊緣設(shè)備
- Bourns 全新推出兩款屏蔽功率電感器系列 專為 DDR5 電源管理電路開發(fā)
- Bourns 推出新型電流變壓器產(chǎn)品,采用坡莫合金 T 型磁芯結(jié)構(gòu),具備高匝數(shù)比特性
- 什么是絕對輸出功率?為什么要測量絕對輸出功率?
- 珠海銀隆是否具備良好的盈利能力和成長性?
- 東芝電子亮相PCIM Asia 2018,為客戶提供全方位系統(tǒng)級解決方案
- 測量技巧 - 用通用計數(shù)器實現(xiàn)更快的頻率測量
- 10個關(guān)于人工智能和機器學(xué)習(xí)的TED演講
- OPPO Reno Ace搭載65W超級閃充,將在10月10日發(fā)布
- vivo NEX 3配置曝光: 99.6%屏占比/6400萬AI四攝
- 小米官宣兩款5G手機 9月24將發(fā)布
- 大眾剛發(fā)布ID.3,續(xù)航尺寸更大ID.4馬上就要來了
- 還記得特斯拉自動駕駛芯片嗎?目前已開啟舊車型改造計劃