STM32F4 HAL庫 GPIO相關操作API介紹


本文絕大部分翻譯自ST的官方用戶手冊 Description of STM32F4 HAL and LL drivers

使用前注意開啟GPIO時鍾 __HAL_RCC_GPIOx_CLK_ENABLE()


使用方法

  1. 使用__HAL_RCC_GPIOx_CLK_ENABLE() 開啟GPIO總線時鍾
  2. 使用 HAL_GPIO_Init()配置GPIO引腳
  3. 如果要配置外部中斷功能,請先使用HAL_NVIC_SetPriority() 配置 NVIC IRQ 優先級,再使用HAL_NVIC_EnableIRQ()開啟 IRQ
  4. 使用 HAL_GPIO_ReadPin()獲取引腳的電平值
  5. 使用HAL_GPIO_WritePin()/HAL_GPIO_TogglePin()這兩個函數來設置引腳的電平值
  6. 使用 HAL_GPIO_LockPin()來鎖定引腳的配置
  7. 當正在重置單片機或剛重置完單片機后,除了 JTAG 引腳以外,其余所有的引腳都被配置為浮空輸入模式並且原本的復用功能將被取消
  8. LSE 晶振引腳接口( LSE oscillator pins) OSC32_IN(PC14) 與 OSC32_OUT(PC15) 只有在 LSE 時鍾關閉后才能被用作GPIO引腳。
  9. OSC_IN/OSC_OUT(PH0)引腳的使用同 8

GPIO相關結構體變量

typedef struct
{
    uint32_t Pin;//所要初始化的引腳序列 GPIO_PIN_x 參見GPIO_pins_define
  	uint32_t Mode;//輸入輸出模式 GPIO_MODE_xxx 參見GPIO_pins_define
  	uint32_t Speed;//輸入輸出速度 GPIO_XXXX_Speed 參見 GPIO_speed——define
    uint32_t Alternate//要連接到該引腳的外設,即復用功能 參見GPIO_Alternate_function_selection
}GPIO_InitTypeDef;

相關函數

初始化與取消初始化

  • void HAL_GPIO_Init (GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init)

    用於初始化某個GPIO外設

    參數說明:

    • GPIOx 所要初始化的GPIO分組,x可選范圍(A…K)(STM32F429)
    • GPIO_Init GPIO初始化結構體的指針,該結構體定義了一些GPIO引腳的參數
  • void HAL_GPIO_DeInit (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin)

    用於注銷某個GPIO外設,參數同上

GPIO操作

  • GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

    讀取某個GPIO引腳的值

    參數說明:

    • GPIO_Pin 指定要讀取的引腳序號,參數取值包括: GPIO_PIN_x,x可選范圍(0…15),具體參考相關宏定義
  • void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

    設定某個GPIO引腳的值

    參數說明:

    • PinState 引腳狀態:
      • GPIO_PIN_RESET:低電平
      • GPIO_PIN_SET:高電平
  • void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

    切換某個GPIO引腳的狀態,高電平->低電平 或 低電平->高電平

  • HAL_StatusTypeDef HAL_GPIO_LockPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

    鎖定某個GPIO引腳的一些配置寄存器,包括:GPIOx_MODER GPIOx_OTYPER GPIOx_OSPEEDR GPIOx_PUPDR GPIOx_AFRL GPIOx_AFRH

    上述寄存器將無法被更改直到下次單片機reset

    HAL Status:HAL庫函數執行的狀態,包括4種狀態:

    typedef enum
    {
        HAL_OK = 0x00,
        HAL_ERROR = 0x01, 
        HAL_BUSY = 0x02, 
        HAL_TIMEOUT = 0x03 
    }HAL_StatusTyperDef;
    
  • void HAL_GPIO_EXTI_IRQHandler (uint16_t GPIO_Pin)

    GPIO引腳外部中斷處理的公共入口函數,該函數需要在中斷服務函數EXTIx_IRQHandler()中被調用

    該函數已經在HAL庫中聲明並定義好,詳細參見文件stm32f4xx_hal_gpio.c

    //stm32f4xx_hal_gpio.c
    void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    {
      /* EXTI line interrupt detected */
      if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
      {
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
        HAL_GPIO_EXTI_Callback(GPIO_Pin);
      }
    }
    
  • __weak void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)

    __weak 函數

    GPIO引腳外部中斷的回調函數,該函數將在HAL_GPIO_EXTI_IRQHandler()函數中被調用

    用戶通過重構該函數來實現中斷觸發后的邏輯,並且無需考慮重置中斷標識符。

    參數說明:

    GPIO_Pin 觸發外部中斷的引腳序號(等同與中斷線的序號)

相關宏定義

GPIO Alternate Function Selection 復用功能列表

GPIO_AF0_RTC_50Hz
GPIO_AF0_MCO
GPIO_AF0_TAMPER
GPIO_AF0_SWJ
GPIO_AF0_TRACE
GPIO_AF1_TIM1
GPIO_AF1_TIM2
GPIO_AF2_TIM3
GPIO_AF2_TIM4
GPIO_AF2_TIM5
GPIO_AF3_TIM8
GPIO_AF3_TIM9
GPIO_AF3_TIM10
GPIO_AF3_TIM11
GPIO_AF4_I2C1
GPIO_AF4_I2C2
GPIO_AF4_I2C3
GPIO_AF5_SPI1
GPIO_AF5_SPI2
GPIO_AF5_SPI3
GPIO_AF5_SPI4
GPIO_AF5_SPI5
GPIO_AF5_SPI6
GPIO_AF5_I2S3ext
GPIO_AF6_SPI3
GPIO_AF6_I2S2ext
GPIO_AF6_SAI1
GPIO_AF7_USART1
GPIO_AF7_USART2
GPIO_AF7_USART3
GPIO_AF7_I2S3ext
GPIO_AF8_UART4
GPIO_AF8_UART5
GPIO_AF8_USART6
GPIO_AF8_UART7
GPIO_AF8_UART8
GPIO_AF9_CAN1
GPIO_AF9_CAN2
GPIO_AF9_TIM12
GPIO_AF9_TIM13
GPIO_AF9_TIM14
GPIO_AF9_LTDC
GPIO_AF9_QSPI
GPIO_AF10_OTG_FS
GPIO_AF10_OTG_HS
GPIO_AF10_QSPI
GPIO_AF11_ETH
GPIO_AF12_FMC
GPIO_AF12_OTG_HS_FS
GPIO_AF12_SDIO
GPIO_AF13_DCMI
GPIO_AF13_DSI
GPIO_AF14_LTDC
GPIO_AF15_EVENTOUT

宏定義函數(外部中斷相關)

__HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) //檢查指定的中斷線的標志位
__HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) //檢查指定的中斷線的標志位
__HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) //清除 中斷標志
__HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) //清除 中斷標志
__HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) //生成軟件中斷

GPIO mode define GPIO模式宏定義列表

宏定義 解釋
GPIO_MODE_INPUT 浮空輸入
GPIO_MODE_OUTPUT_PP 推挽輸出
GPIO_MODE_OUTPUT_OD 開漏輸出
GPIO_MODE_AF_PP 推挽復用輸出
GPIO_MODE_AF_OD 開漏復用輸出
GPIO_MODE_ANALOG 模擬
GPIO_MODE_IT_RISING 上升沿觸發外部中斷
GPIO_MODE_IT_FALLING 下降沿觸發外部中斷
GPIO_MODE_IT_RISING_FALLING 上升/下降沿觸發外部中斷
GPIO_MODE_EVT_RISING 上升沿觸發外部事件
GPIO_MODE_EVT_FALLING 下降沿觸發外部事件
GPIO_MODE_EVT_RISING_FALLING 上升/下降沿觸發外部事件

GPIO pins define GPIO引腳序列定義列表

GPIO_PIN_0
GPIO_PIN_1
GPIO_PIN_2
GPIO_PIN_3
GPIO_PIN_4
GPIO_PIN_5
GPIO_PIN_6
GPIO_PIN_7
GPIO_PIN_8
GPIO_PIN_9
GPIO_PIN_10
GPIO_PIN_11
GPIO_PIN_12
GPIO_PIN_13
GPIO_PIN_14
GPIO_PIN_15
GPIO_PIN_All
GPIO_PIN_MASK

GPIO pull define GPIO上下拉定義列表

宏定義 解釋
GPIO_NOPULL 不激活上下拉
GPIO_PULLUP 上拉激活
GPIO_PULLDOWN 下拉激活

GPIO speed define GPIO速度定義列表

宏定義 解釋
GPIO_SPEED_FREQ_LOW 工作速度 2MHz
GPIO_SPEED_FREQ_MEDIUM 工作速度 12.5MHz~50MHz
GPIO_SPEED_FREQ_HIGH 工作速度 50MHz~100MHz
GPIO_SPEED_FREQ_VERY_HIGH 工作速度 100MHz~200MHz


免責聲明!

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



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