
本文共 14505 字,大约阅读时间需要 48 分钟。
文章目录
前言
本文主要介绍HAL库中Stm32F429的GPIO用法。主要参考资料:
- STM32F439xx HAL USER Manual
- STM32F429数据手册
关于GPIO寄存器相关知识,可以参阅stm32F4xx中文参考手册,里面对于硬件底层以及寄存器有详细的介绍,本文不再详细展开。在使用HAL库的时候,即使不了解底层硬件和寄存器知识,同样可以完成项目的开发。此处,只需要了解HAL库驱动函数的使用方法即可。了解驱动函数的使用方法可以通过以下两种途径:
- 阅读源程序和其中的注释
- 阅读用户手册
用户手册在HAL库压缩包中自带,相对地址在:\STM32Cube_FW_F4_V1.11.0\Drivers\STM32F4xx_HAL_Driver 。如下图所示:

主要功能与使用方法
功能
HAL库的GPIO驱动模块。主要提供以下两种功能:
- 初始化和去初始化功能。
- IO操作功能。
使用方法
- 使能GPIO AHB时钟,使用函数: __HAL_RCC_GPIOx_CLK_ENABLE() 。
- 配置GPIO引脚功能,使用函数: HAL_GPIO_Init() 以及结构体 GPIO_InitTypeDef。
- 通过结构体中成员 “mode” 配置IO模式。相关寄存器为(GPIOx_MODER)。
- 通过结构体中成员“pull”激活上拉电阻下拉电阻。相关寄存器为“ GPIOx_PUPDR ”。
- 通过结构体中成员“speed”改变引脚的速度。相关寄存器为“GPIOx_OSPEEDR”
- 通过结构体中成员“alternate”改变引脚的复用功能。相关寄存器为“GPIOx_AFRL和GPIOx_AFRH”
- 在外部中断启用的情况下,需要使用 HAL_NVIC_SetPriority() 配置映射到EXTI行的NVIC IRQ优先级,并使用 HAL_NVIC_EnableIRQ() 启用它。
- 在输入模式情况下,使用 HAL_GPIO_ReadPin() 获取引脚电平状态。
- 在输出模式情况下,使用 HAL_GPIO_WritePin()/HAL_GPIO_TogglePin() 函数来改变引脚电平状态。
- 使用 HAL_GPIO_LockPin() 锁定引脚状态,锁定状态一直维持到下次启动之前。
注意:
- 结构体中mode 成员中的模拟模式,适用于该引脚用于ADC或者DAC。
- 结构体中“mode”成员除了与GPIOx_MODER 寄存器相关的数据,还有一些与外部中断模式有关的参数。
函数与结构体
函数
void HAL_GPIO_Init (GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
根据参数GPIO_Init初始化GPIOx外设。
void HAL_GPIO_DeInit (GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
去初始化,复位GPIO外设寄存器到他们初始的默认值。
GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
读取特定的输入输入引脚。
void HAL_GPIO_WritePin (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
置位或者清除选定的数据位。
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引脚配置寄存器。
void HAL_GPIO_EXTI_IRQHandler (uint16_t GPIO_Pin)
该函数处理EXIT中断请求。
__weak void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
EXTI 线路检测回调。
参数与结构体
GPIO_TypeDef *GPIOx
在F429中,x可以取 (A-K) 。其具体定义为:
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE)#define GPIOJ ((GPIO_TypeDef *) GPIOJ_BASE)#define GPIOK ((GPIO_TypeDef *) GPIOK_BASE)
定义的详细解析,可以参考上一篇博客:<>。其本质是一个常量地址。
对应结构体定义为:
typedef struct{ __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */} GPIO_TypeDef;
此结构体对应着F429的GPIO寄存器,可以通过操作该结构体的成员变量,直接操纵对应寄存器。至于每个结构体的详细含义,请参考< STM32F4XX参考手册 >,此处不再赘述。
uint16_t GPIO_Pin
确定端口的引脚位。此参数可以取GPIO_PIN_x,其中x的取值范围为[0,15]。具体的定义如下:
#define GPIO_PIN_0 ((uint16_t)0x0001U) /* Pin 0 selected */#define GPIO_PIN_1 ((uint16_t)0x0002U) /* Pin 1 selected */#define GPIO_PIN_2 ((uint16_t)0x0004U) /* Pin 2 selected */#define GPIO_PIN_3 ((uint16_t)0x0008U) /* Pin 3 selected */#define GPIO_PIN_4 ((uint16_t)0x0010U) /* Pin 4 selected */#define GPIO_PIN_5 ((uint16_t)0x0020U) /* Pin 5 selected */#define GPIO_PIN_6 ((uint16_t)0x0040U) /* Pin 6 selected */#define GPIO_PIN_7 ((uint16_t)0x0080U) /* Pin 7 selected */#define GPIO_PIN_8 ((uint16_t)0x0100U) /* Pin 8 selected */#define GPIO_PIN_9 ((uint16_t)0x0200U) /* Pin 9 selected */#define GPIO_PIN_10 ((uint16_t)0x0400U) /* Pin 10 selected */#define GPIO_PIN_11 ((uint16_t)0x0800U) /* Pin 11 selected */#define GPIO_PIN_12 ((uint16_t)0x1000U) /* Pin 12 selected */#define GPIO_PIN_13 ((uint16_t)0x2000U) /* Pin 13 selected */#define GPIO_PIN_14 ((uint16_t)0x4000U) /* Pin 14 selected */#define GPIO_PIN_15 ((uint16_t)0x8000U) /* Pin 15 selected */#define GPIO_PIN_All ((uint16_t)0xFFFFU) /* All pins selected */#define GPIO_PIN_MASK ((uint32_t)0x0000FFFFU) /* PIN mask for assert test */
GPIO_InitTypeDef *GPIO_Init
该参数对应GPIO功能初始化的所有参数,具体含义需要解析结构体成员,结构体的定义如下:
typedef struct{ uint32_t Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */ uint32_t Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIO_mode_define */ uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. This parameter can be a value of @ref GPIO_pull_define */ uint32_t Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIO_speed_define */ uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. This parameter can be a value of @ref GPIO_Alternate_function_selection */}GPIO_InitTypeDef;
该结构体有五个成员变量,都与GPIO初始化相关。
Pin
指定需要初始化的GPIO引脚。该参数可以取GPIO引脚定义的任意值。其定义值可以取节uint16_t GPIO_Pin中的定义部分任意值,此处不再列出。
Mode
指定特定引脚的模式选择。参数可以取:
#define GPIO_MODE_INPUT ((uint32_t)0x00000000U) /*!< Input Floating Mode */#define GPIO_MODE_OUTPUT_PP ((uint32_t)0x00000001U) /*!< Output Push Pull Mode */#define GPIO_MODE_OUTPUT_OD ((uint32_t)0x00000011U) /*!< Output Open Drain Mode */#define GPIO_MODE_AF_PP ((uint32_t)0x00000002U) /*!< Alternate Function Push Pull Mode */#define GPIO_MODE_AF_OD ((uint32_t)0x00000012U) /*!< Alternate Function Open Drain Mode */#define GPIO_MODE_ANALOG ((uint32_t)0x00000003U) /*!< Analog Mode */ #define GPIO_MODE_IT_RISING ((uint32_t)0x10110000U) /*!< External Interrupt Mode with Rising edge trigger detection */#define GPIO_MODE_IT_FALLING ((uint32_t)0x10210000U) /*!< External Interrupt Mode with Falling edge trigger detection */#define GPIO_MODE_IT_RISING_FALLING ((uint32_t)0x10310000U) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ #define GPIO_MODE_EVT_RISING ((uint32_t)0x10120000U) /*!< External Event Mode with Rising edge trigger detection */#define GPIO_MODE_EVT_FALLING ((uint32_t)0x10220000U) /*!< External Event Mode with Falling edge trigger detection */#define GPIO_MODE_EVT_RISING_FALLING ((uint32_t)0x10320000U) /*!< External Event Mode with Rising/Falling edge trigger detection */
以上参数定义规则可以总结如下:
设定数据为: 0xX0yz00YZ
- X : GPIO mode or EXTI Mode
- y : External IT or Event trigger detection
- z : IO configuration on External IT or Event
- Y : Output type (Push Pull or Open Drain)
- Z : IO Direction mode (Input, Output, Alternate or Analog)
PULL
指定上拉,下拉或者浮空方式。其具体可以为:
#define GPIO_NOPULL ((uint32_t)0x00000000U) /*!< No Pull-up or Pull-down activation */#define GPIO_PULLUP ((uint32_t)0x00000001U) /*!< Pull-up activation */#define GPIO_PULLDOWN ((uint32_t)0x00000002U) /*!< Pull-down activation */
Speed
指定引脚速度,其具体选择如下:
#define GPIO_SPEED_FREQ_LOW ((uint32_t)0x00000000U) /*!< IO works at 2 MHz, please refer to the product datasheet */#define GPIO_SPEED_FREQ_MEDIUM ((uint32_t)0x00000001U) /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */#define GPIO_SPEED_FREQ_HIGH ((uint32_t)0x00000002U) /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */#define GPIO_SPEED_FREQ_VERY_HIGH ((uint32_t)0x00000003U) /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */
Alternate
指定GPIO的复用功能,其具体选择如下:
#if defined(STM32F429xx) || defined(STM32F439xx)/** * @brief AF 0 selection */ #define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping *//** * @brief AF 1 selection */ #define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping *//** * @brief AF 2 selection */ #define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping *//** * @brief AF 3 selection */ #define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping *//** * @brief AF 4 selection */ #define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping *//** * @brief AF 5 selection */ #define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */#define GPIO_AF5_SPI5 ((uint8_t)0x05U) /* SPI5 Alternate Function mapping */#define GPIO_AF5_SPI6 ((uint8_t)0x05U) /* SPI6 Alternate Function mapping */#define GPIO_AF5_I2S3ext ((uint8_t)0x05U) /* I2S3ext_SD Alternate Function mapping *//** * @brief AF 6 selection */ #define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */#define GPIO_AF6_SAI1 ((uint8_t)0x06U) /* SAI1 Alternate Function mapping *//** * @brief AF 7 selection */ #define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping *//** * @brief AF 8 selection */ #define GPIO_AF8_UART4 ((uint8_t)0x08U) /* UART4 Alternate Function mapping */#define GPIO_AF8_UART5 ((uint8_t)0x08U) /* UART5 Alternate Function mapping */#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */#define GPIO_AF8_UART7 ((uint8_t)0x08U) /* UART7 Alternate Function mapping */#define GPIO_AF8_UART8 ((uint8_t)0x08U) /* UART8 Alternate Function mapping *//** * @brief AF 9 selection */ #define GPIO_AF9_CAN1 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */#define GPIO_AF9_CAN2 ((uint8_t)0x09U) /* CAN2 Alternate Function mapping */#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */#define GPIO_AF9_LTDC ((uint8_t)0x09U) /* LCD-TFT Alternate Function mapping *//** * @brief AF 10 selection */ #define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */#define GPIO_AF10_OTG_HS ((uint8_t)0x0AU) /* OTG_HS Alternate Function mapping *//** * @brief AF 11 selection */ #define GPIO_AF11_ETH ((uint8_t)0x0BU) /* ETHERNET Alternate Function mapping *//** * @brief AF 12 selection */ #define GPIO_AF12_FMC ((uint8_t)0x0CU) /* FMC Alternate Function mapping */#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0CU) /* OTG HS configured in FS, Alternate Function mapping */#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping *//** * @brief AF 13 selection */ #define GPIO_AF13_DCMI ((uint8_t)0x0DU) /* DCMI Alternate Function mapping *//** * @brief AF 14 selection */#define GPIO_AF14_LTDC ((uint8_t)0x0EU) /* LCD-TFT Alternate Function mapping *//** * @brief AF 15 selection */ #define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */#endif /* STM32F429xx || STM32F439xx */









GPIO_PinState PinState
引脚状态,为高电平或者低电平。其具体定义如下所示:
typedef enum{ GPIO_PIN_RESET = 0, GPIO_PIN_SET}GPIO_PinState;
结构体HAL_StatusTypeDef
typedef enum { HAL_OK = 0x00U, HAL_ERROR = 0x01U, HAL_BUSY = 0x02U, HAL_TIMEOUT = 0x03U} HAL_StatusTypeDef;
发表评论
最新留言
关于作者
