GPIO 驱动可以用作多个用途,包括管脚设置,单位设置/重置,锁定机制,从端口管脚读入或者向端口管脚写入数据。
函数描述格式:
函数名 | 外设函数的名称 |
---|---|
函数原形 | 原形声明 |
功能描述 | 简要解释函数是如何执行的 |
输入参数{x} | 输入参数描述 |
输出参数{x} | 输出参数描述 |
返回值 | 函数的返回值 |
先决条件 | 调用函数前应满足的要求 |
被调用函数 | 其他被该函数调用的库函数 |
缩写定义
缩写 | 外设/单元 |
---|---|
ADC | 模数转换器 |
BKP | 备份寄存器 |
CAN | 控制器局域网模块 |
DMA | 直接内存存取控制器 |
EXTI | 外部中断事件控制器 |
FLASH | 闪存存储器 |
GPIO | 通用输入输出 |
I2C | 内部集成电路 |
IWDG | 独立看门狗 |
NVIC | 嵌套中断向量列表控制器 |
PWR | 电源/功耗控制 |
RCC | 复位与时钟控制器 |
RTC | 实时时钟 |
SPI | 串行外设接口 |
SysTick | 系统嘀嗒定时器 |
TIM | 通用定时器 |
TIM1 | 高级控制定时器 |
USART | 通用同步异步接收发射端 |
WWDG | 窗口看门狗 |
序号 | 函数名 | 描述 |
---|---|---|
1 | GPIO_DeInit | 将外设 GPIOx 寄存器重设为默认值 |
2 | GPIO_Init | 根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器 |
3 | GPIO_StructInit | 把 GPIO_InitStruct 中的每一个参数按默认值填入 |
4 | GPIO_PinLockConfig | 锁定 GPIO 管脚设置寄存器 |
5 | GPIO_ReadInputDataBit | 读取指定端口管脚的输入 |
6 | GPIO_ReadInputData | 读取指定的 GPIO 端口输入 |
7 | GPIO_ReadOutputDataBit | 读取指定端口管脚的输出 |
8 | GPIO_ReadOutputData | 读取指定的 GPIO 端口输出 |
9 | GPIO_SetBits | 设置指定的数据端口位 |
10 | GPIO_ResetBits | 清除指定的数据端口位 |
11 | GPIO_WriteBit | 设置或者清除指定的数据端口位 |
12 | GPIO_Write | 向指定 GPIO 数据端口写入数据 |
13 | GPIO_ToggleBits | 将GPIO 的引脚 IO 状态翻转 |
14 | GPIO_AFIODeInit | 将复用功能(重映射事件控制和 EXTI 设置)重设为默认值 |
15 | GPIO_EventOutputConfig | 选择 GPIO 管脚用作事件输出 |
16 | GPIO_EventOutputCmd | 使能或者失能事件输出 |
17 | GPIO_PinRemapConfig | 改变指定管脚的映射 |
18 | GPIO_EXTILineConfig | 选择 GPIO 管脚用作外部中断线路 |
导出功能:
序号1 函数是将外设 GPIOx 寄存器重设为默认值;
序号2~4函数是GPIO初始化和配置函数;
序号5~13函数是GPIO读写功能;
序号14~18函数是GPIO其他功能;
函数名 | GPIO_DeInit |
---|---|
函数原形 | void GPIO_DeInit(GPIO_TypeDef* GPIOx) |
功能描述 | 将外设 GPIOx 寄存器重设为默认值 |
输入参数 | GPIOx:x 可以是 A,B,C,D 或者 E等等,来选择 GPIO 外设 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | RCC_APB2PeriphResetCmd() |
代码如下(示例):
/* 将GPIOA外围寄存器重置为默认重置值 */
GPIO_DeInit(GPIOA);
函数名 | GPIO_Init |
---|---|
函数原形 | void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) |
功能描述 | 根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器 |
输入参数 1 | GPIOx:x 可以是 A,B,C,D 或者 E等等,来选择 GPIO 外设 |
输出参数 2 | GPIO_InitStruct:指向结构 GPIO_InitTypeDef 的指针,包含了外设 GPIO 的配置信息 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
GPIO_InitTypeDef 定义于文件“stm32fxxx_gpio.h”:
typedef struct
{
u16 GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
} GPIO_InitTypeDef;
该参数选择待设置的 GPIO 管脚,使用操作符“|”可以一次选中多个管脚。可以使用下表中的任意组合。
GPIO_Pin | 值 |
---|---|
GPIO_Pin | 描述 |
GPIO_Pin_None | 无管脚被选中 |
GPIO_Pin_0 | 选中管脚 0 |
GPIO_Pin_1 | 选中管脚 1 |
GPIO_Pin_2 | 选中管脚 2 |
GPIO_Pin_3 | 选中管脚 3 |
GPIO_Pin_4 | 选中管脚 4 |
GPIO_Pin_5 | 选中管脚 5 |
GPIO_Pin_6 | 选中管脚 6 |
GPIO_Pin_7 | 选中管脚 7 |
GPIO_Pin_8 | 选中管脚 8 |
GPIO_Pin_9 | 选中管脚 9 |
GPIO_Pin_10 | 选中管脚 10 |
GPIO_Pin_11 | 选中管脚 11 |
GPIO_Pin_12 | 选中管脚 12 |
GPIO_Pin_13 | 选中管脚 13 |
GPIO_Pin_14 | 选中管脚 14 |
GPIO_Pin_15 | 选中管脚 15 |
GPIO_Pin_All | 选中全部管脚 |
GPIO_Speed 用以设置选中管脚的速率。
GPIO_Speed 值
GPIO_Speed | 描述 |
---|---|
GPIO_Speed_10MHz | 最高输出速率 10MHz |
GPIO_Speed_2MHz | 最高输出速率 2MHz |
GPIO_Speed_50MHz | 最高输出速率 50MHz |
GPIO_Speed_100MHz | 最高输出速率 100MHz |
GPIO_Mode 用以设置选中管脚的工作状态。
GPIO_Mode 值
GPIO_Speed | 描述 |
---|---|
GPIO_Mode_AIN | 模拟输入 |
GPIO_Mode_IN_FLOATING | 浮空输入 |
GPIO_Mode_IPD | 下拉输入 |
GPIO_Mode_IPU | 上拉输入 |
GPIO_Mode_Out_OD | 开漏输出 |
GPIO_Mode_Out_PP | 推挽输出 |
GPIO_Mode_AF_OD | 复用开漏输出 |
GPIO_Mode_AF_PP | 复用推挽输出 |
注意:
当某管脚设置为上拉或者下拉输入模式,使用寄存器 Px_BSRR 和 PxBRR
GPIO_Mode 允许同时设置 GPIO 方向(输入/输出)和对应的输入/输出设置,:位[7:4]对应 GPIO 方向,位[4:0]对应配置。
GPIO 方向有如下索引
-GPIO 输入模式 = 0x00
-GPIO 输出模式 = 0x01
GPIO方向 | 索引 | 模式 | 设置 | 模式代码 |
---|---|---|---|---|
GPIO Input | 0x00 | GPIO_Mode_AIN | 0x00 | 0x00 |
GPIO_Mode_IN_FLOATING | 0x04 | 0x04 | ||
GPIO_Mode_IPD | 0x08 | 0x28 | ||
GPIO_Mode_IPU | 0x08 | 0x48 | ||
GPIO Output | 0x01 | GPIO_Mode_Out_OD | 0x04 | 0x14 |
GPIO_Mode_Out_PP | 0x00 | 0x10 | ||
GPIO_Mode_AF_OD | 0x0C | 0x1C | ||
GPIO_Mode_AF_PP | 0x08 | 0x18 | ||
代码如下(示例):
/* 配置所有GPIOA为输入 浮空输入模式 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
函数名 | GPIO_StructInit |
---|---|
函数原形 | void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) |
功能描述 | 把 GPIO_InitStruct 中的每一个参数按默认值填入 |
输入参数 | GPIO_InitStruct:指向结构 GPIO_InitTypeDef 的指针,待初始化 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
成员 | 默认值 |
---|---|
GPIO_Pin | GPIO_Pin_All |
GPIO_Speed | GPIO_Speed_2MHz |
GPIO_Mode | GPIO_Mode_IN_FLOATING |
代码如下(示例):
/* 初始化GPIO Init Structure参数 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure);
函数名 | GPIO_PinLockConfig |
---|---|
函数原形 | void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 | 锁定 GPIO 管脚设置寄存器 |
输入参数 1 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输入参数 2 | GPIO_Pin:待锁定的端口位 |
该参数可以取 | GPIO_Pin_x(x 可以是 0-15)的任意组合参阅 Section:GPIO_Pin 查阅更多该参数允许取值范围 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/* 锁定GPIOA Pin0和Pin1*/
GPIO_PinLockConfig(GPIOA, GPIO_Pin_0 | GPIO_Pin_1);
函数名 | GPIO_ReadInputDataBit |
---|---|
函数原形 | u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 | 读取指定端口管脚的输入 |
输入参数 1 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输入参数 2 | GPIO_Pin:待读取的端口位 |
参阅 Section: | GPIO_Pin 查阅更多该参数允许取值范围 |
输出参数 | 无 |
返回值 | 输入端口管脚值 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/*读取GPIOB的第七个引脚,并将其存储在ReadValue变量中 */
u8 ReadValue;
ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
函数名 | GPIO_ReadInputData |
---|---|
函数原形 | u16 GPIO_ReadInputData(GPIO_TypeDef* GPIOx) |
功能描述 | 读取指定的 GPIO 端口输入 |
输入参数 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输出参数 | 无 |
返回值 | GPIO 输入数据端口值 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
例:
/*读取GPIOE输入数据端口并将其存储在ReadValue变量中*/
u16 ReadValue;
ReadValue = GPIO_ReadInputData(GPIOE);
函数名 | GPIO_ReadOutputDataBit |
---|---|
函数原形 | u8 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 | 读取指定端口管脚的输出 |
输入参数 1 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输入参数 2 | GPIO_Pin:待读取的端口位 |
参阅 Section: | GPIO_Pin 查阅更多该参数允许取值范围 |
输出参数 | 无 |
返回值 | 输出端口管脚值 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
例:
/* 读取GPIOC的第七个引脚,并将其存储在ReadValue变量中 */
u8 ReadValue;
ReadValue = GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7);
函数名 | GPIO_ReadOutputData |
---|---|
函数原形 | u16 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) |
功能描述 | 读取指定的 GPIO 端口输出 |
输入参数 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输出参数 | 无 |
返回值 | GPIO 输出数据端口值 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/* 读取GPIOE输入数据端口并将其存储在ReadValue变量中 */
u16 ReadValue;
ReadValue = GPIO_ReadOutputData(GPIOE);
函数名 | GPIO_SetBits |
---|---|
函数原形 | void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 | 设置指定的数据端口位 |
输入参数 1 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输入参数 2 | GPIO_Pin:待设置的端口位 |
该参数可以取 | GPIO_Pin_x(x 可以是 0-15)的任意组合 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/* 设置GPIOA接口引脚10和引脚15 */
GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);
函数名 | GPIO_ResetBits |
---|---|
函数原形 | void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 | 清除指定的数据端口位 |
输入参数 1 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输入参数 2 | GPIO_Pin:待清除的端口位 |
该参数可以取 | GPIO_Pin_x(x 可以是 0-15)的任意组合 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/* 清除GPIOB接口引脚1和引脚13 */
GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_13);
函数名 | GPIO_WriteBit |
---|---|
函数原形 | void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal) |
功能描述 | 设置或者清除指定的数据端口位 |
输入参数 1 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输入参数 2 | GPIO_Pin:待设置或者清除指的端口位;该参数可以取 GPIO_Pin_x(x 可以是 0-15)的任意组合 |
输入参数 3 | BitVal: 该参数指定了待写入的值。该参数必须取枚举 BitAction 的其中一个值。Bit_RESET:清除数据端口位;Bit_SET: 设置数据端口位 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/* 设置GPIOB接口 的15号引脚*/
GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_SET);
函数名 | GPIO_Write |
---|---|
函数原形 | void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal) |
功能描述 | 向指定 GPIO 数据端口写入数据 |
输入参数 1 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输入参数 2 | PortVal: 待写入端口数据寄存器的值 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/*写入数据到GPIOA数据端口 */
GPIO_Write(GPIOA, 0x1101);
函数名 | GPIO_ToggleBits |
---|---|
函数原形 | void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) |
功能描述 | 将GPIO 的引脚 IO 状态翻转 |
输入参数 1 | GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 |
输入参数 2 | GPIO_Pin:待设置或者清除指的端口位;该参数可以取 GPIO_Pin_x(x 可以是 0-15)的任意组合 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/*将GPIOA接口的15引脚IO状态翻转 */
GPIO_ToggleBits(GPIOA,GPIO_Pin_15 );
函数名 | GPIO_AFIODeInit |
---|---|
函数原形 | void GPIO_AFIODeInit(void) |
功能描述 | 将复用功能(重映射事件控制和 EXTI 设置)重设为默认值 |
输入参数 | 无 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | RCC_APB2PeriphResetCmd() |
代码如下(示例):
/* 将备用函数寄存器重置为它们的默认重置值 */
GPIO_AFIODeInit();
函数名 | GPIO_EventOutputConfig |
---|---|
函数原形 | void GPIO_EventOutputConfig(u8 GPIO_PortSource, u8 GPIO_PinSource) |
功能描述 | 选择 GPIO 管脚用作事件输出 |
输入参数 1 | GPIO_PortSource: 选择用作事件输出的 GPIO 端口 |
输入参数 2 | GPIO_PinSource:事件输出的管脚该参数可以取 GPIO_PinSourcex(x 可以是 0-15) |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
GPIO_PortSource 用以选择用作事件输出的 GPIO 端口
GPIO_PortSource 值
GPIO_PortSource | 描述 |
---|---|
GPIO_PortSourceGPIOA | 选择 GPIOA |
GPIO_PortSourceGPIOB | 选择 GPIOB |
GPIO_PortSourceGPIOC | 选择 GPIOC |
GPIO_PortSourceGPIOD | 选择 GPIOD |
GPIO_PortSourceGPIOE | 选择 GPIOE |
代码如下(示例):
/* 选择事件输出的GPIOE引脚5 */
GPIO_EventOutputConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5);
函数名 | GPIO_EventOutputCmd |
---|---|
函数原形 | void GPIO_EventOutputCmd(FunctionalState NewState) |
功能描述 | 使能或者失能事件输出 |
输入参数 1 | NewState: 事件输出的新状态这个参数可以取:ENABLE 或者 DISABLE |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/*使能事件输出到GPIOC引脚6 */
GPIO_EventOutputConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
GPIO_EventOutputCmd(ENABLE);
函数名 | GPIO_ PinRemapConfig |
---|---|
函数原形 | void GPIO_PinRemapConfig(u32 GPIO_Remap, FunctionalState NewState) |
功能描述 | 改变指定管脚的映射 |
输入参数 1 | GPIO_Remap: 选择重映射的管脚 |
输入参数 2 | NewState: 管脚重映射的新状态这个参数可以取:ENABLE 或者 DISABLE |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
GPIO_Remap 用以选择用作事件输出的 GPIO 端口
GPIO_Remap | 值 |
---|---|
GPIO_Remap | 描述 |
GPIO_Remap_SPI1 | SPI1 复用功能映射 |
GPIO_Remap_I2C1 | I2C1 复用功能映射 |
GPIO_Remap_USART1 | USART1 复用功能映射 |
GPIO_PartialRemap_USART3 | USART2 复用功能映射 |
GPIO_FullRemap_USART3 | USART3 复用功能完全映射 |
GPIO_PartialRemap_TIM1 | TIM1复用功能部分映射 |
GPIO_FullRemap_TIM1 | TIM1 复用功能完全映射 |
GPIO_PartialRemap1_TIM2 | TIM2 复用功能部分映射 1 |
GPIO_PartialRemap2_TIM2 | TIM2 复用功能部分映射 2 |
GPIO_FullRemap_TIM2 T | IM2 复用功能完全映射 |
GPIO_PartialRemap_TIM3 | TIM3 复用功能部分映射 |
GPIO_FullRemap_TIM3 | TIM3 复用功能完全映射 |
GPIO_Remap_TIM4 | TIM4 复用功能映射 |
GPIO_Remap1_CAN | CAN 复用功能映射 1 |
GPIO_Remap2_CAN | CAN 复用功能映射 2 |
GPIO_Remap_PD01 | PD01 复用功能映射 |
GPIO_Remap_SWJ_NoJTRST | 除 JTRST 外 SWJ 完全使能(JTAG+SW-DP) |
GPIO_Remap_SWJ_JTAGDisable | JTAG-DP 失能 + SW-DP 使能 |
GPIO_Remap_SWJ_Disable | SWJ 完全失能(JTAG+SW-DP) |
代码如下(示例):
/*PB.08上的I2C1 SCL, PB.09上的I2C1 SDA */
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
函数名 | GPIO_EXTILineConfig |
---|---|
函数原形 | void GPIO_EXTILineConfig(u8 GPIO_PortSource, u8 GPIO_PinSource) |
功能描述 | 选择 GPIO 管脚用作外部中断线路 |
输入参数 1 | GPIO_PortSource: 选择用作外部中断线源的 GPIO 端口 |
输入参数 2 | GPIO_PinSource:待设置的外部中断线路;该参数可以取 GPIO_PinSourcex(x 可以是 0-15) |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
代码如下(示例):
/* 选择PB.08作为EXTI行8 */
GPIO_EXTILineConfig(GPIO_PortSource_GPIOB, GPIO_PinSource8);
修改时间 | 修改说明 |
---|---|
2023年3月5日 | 第一次发布,介绍了STM32通用输入/输出(GPIO)的18种函数及使用 |
以上就是STM32固件库函数之通用输入/输出(GPIO)函数介绍及说明的内容,本文介绍了通用输入/输出(GPIO)函数的简单使用。
有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。
创作不容,如果文档对您有帮助,记得给个赞。