// 取消初始化GPIO端口,恢复其默认设置
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
// 取消初始化GPIO的复用功能(AFIO)
void GPIO_AFIODeInit(void);
// 初始化GPIO端口,根据提供的结构体配置GPIO参数
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// GPIO_InitStruct: 指向GPIO_InitTypeDef结构体的指针,包含GPIO配置信息
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
// 将GPIO_InitTypeDef结构体初始化为默认值
// GPIO_InitStruct: 指向GPIO_InitTypeDef结构体的指针,将被初始化为默认设置
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
// 读取指定GPIO端口的指定位的数据
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// GPIO_Pin: 指定要读取的GPIO引脚
// 返回值: 指定引脚的状态(0或1)
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
// 读取指定GPIO端口所有引脚的数据
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// 返回值: 包含所有引脚状态的16位值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
// 读取指定GPIO端口的指定位的输出数据
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// GPIO_Pin: 指定要读取的GPIO引脚
// 返回值: 指定引脚的状态(0或1)
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
// 读取指定GPIO端口所有引脚的输出数据
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// 返回值: 包含所有引脚状态的16位值
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
// 设置指定GPIO端口的指定位
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// GPIO_Pin: 指定要设置的GPIO引脚
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
// 重置指定GPIO端口的指定位
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// GPIO_Pin: 指定要重置的GPIO引脚
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
// 设置或重置指定GPIO端口的指定位
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// GPIO_Pin: 指定要设置的GPIO引脚
// BitVal: 指定要设置的值(Bit_RESET 或 Bit_SET)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
// 向指定GPIO端口写入数据
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// PortVal: 要写入端口的16位值
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
// 锁定指定GPIO端口的引脚配置,防止被意外修改
// GPIOx: 指向GPIO_TypeDef结构体的指针,代表特定的GPIO端口
// GPIO_Pin: 指定要锁定的GPIO引脚
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
// 配置GPIO事件输出,用于触发某些外设事件
// GPIO_PortSource: 指定GPIO端口源
// GPIO_PinSource: 指定GPIO引脚源
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
// 启用或禁用GPIO事件输出
// NewState: 指定启用(ENABLE)或禁用(DISABLE)状态
void GPIO_EventOutputCmd(FunctionalState NewState);
// 重新映射某些外设的引脚到其他GPIO端口
// GPIO_Remap: 指定要重新映射的外设和引脚
// NewState: 指定启用(ENABLE)或禁用(DISABLE)状态
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
// 配置外部中断线(EXTI)的GPIO端口和引脚源
// GPIO_PortSource: 指定外部中断线连接的GPIO端口源
// GPIO_PinSource: 指定外部中断线连接的GPIO引脚源
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
// 配置以太网媒体接口(ETH)的GPIO引脚
// GPIO_ETH_MediaInterface: 指定以太网媒体接口的类型(如MII、RMII等)
// 这个函数通常用于STM32的以太网接口,配置相关的GPIO引脚作为MII或RMII等模式的媒体接口
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
浮空输入
输入用,完全浮空,状态不定
应用场景
- 检测外部触发器的状态:当外部触发器的状态改变时,可能会导致GPIO引脚处于浮空状态。通过检测引脚的状态变化,可以实现外部事件的检测和响应。
- 环境监测:在某些环境监测应用中,可以利用GPIO浮空输入来检测环境中的电磁干扰或其他干扰源,从而判断环境的状态。
- 输入端口的默认状态:在某些情况下,可以将GPIO引脚设置为浮空输入,作为输入端口的默认状态。当外部设备连接时,会改变引脚的状态,从而触发相应的操作。
需要注意的是,对于需要精确控制和稳定电平的应用,应尽量避免使用GPIO浮空输入,以免出现不可预测的问题。
代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
//使用各个外设前必须开启时钟,否则对外设的操作无效
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引脚,赋值为第0号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数
//函数内部会自动根据结构体的参数配置相应寄存器
//实现GPIOA的初始化
typedef enum
{ GPIO_Mode_AIN = 0x0,//模拟输入
GPIO_Mode_IN_FLOATING = 0x04,//浮空输入
GPIO_Mode_IPD = 0x28,//上拉输入
GPIO_Mode_IPU = 0x48,//下拉输入
GPIO_Mode_Out_OD = 0x14,//开漏输出
GPIO_Mode_Out_PP = 0x10,//推挽输出
GPIO_Mode_AF_OD = 0x1C,//复用开漏输出
GPIO_Mode_AF_PP = 0x18//复用推挽输出
}GPIOMode_TypeDef;
上拉输入
输入用,用内部上拉,默认是高电平
应用场景
- 按键输入:当按键未按下时,引脚被上拉到逻辑高电平;当按键按下时,引脚被连接到地,变为逻辑低电平。这种方式可以避免在按键未按下时引脚处于浮空状态而引起的不确定性。
- 开关状态检测:类似于按键输入,可以使用上拉输入来检测开关的状态。开关断开时引脚被上拉,开关闭合时引脚被拉低。
- 传感器输入:某些传感器在未连接时可能输出一个高电平信号,这时可以使用上拉输入来保持一个默认状态。
- 通信线路空闲状态检测:在串行通信中,可以使用上拉输入来检测通信线路的空闲状态。在通信线路未被占用时,引脚被上拉;当开始发送数据时,引脚被拉低。
总的来说,GPIO上拉输入适用于需要保持确定状态的输入信号,并且在外部信号未连接时保持一个默认状态的应用场景。
代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PB1和PB11引脚初始化为上拉输入
下拉输入
输入用,用内部下拉,默认是低电平
应用场景
- 按键输入:与上拉输入类似,当按键未按下时,引脚被下拉到逻辑低电平;当按键按下时,引脚被连接到VDD,变为逻辑高电平。
- 开关状态检测:类似于按键输入,可以使用下拉输入来检测开关的状态。开关断开时引脚被下拉,开关闭合时引脚被拉高。
- 传感器输入:某些传感器在未连接时可能输出一个低电平信号,这时可以使用下拉输入来保持一个默认状态。
- 通信线路空闲状态检测:在串行通信中,可以使用下拉输入来检测通信线路的空闲状态。在通信线路未被占用时,引脚被下拉;当开始发送数据时,引脚被拉高。
总的来说,GPIO下拉输入适用于需要保持确定状态的输入信号,并且在外部信号未连接时保持一个默认状态的应用场景。
代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PB1和PB11引脚初始化为上拉输入
模拟功能
ADC、DAC
应用场景
- 模拟传感器接口:一些传感器输出的是模拟信号,例如温度传感器、光线传感器等。模拟功能的GPIO引脚可以用来读取这些传感器的模拟输出信号。
- 模拟输出控制:某些应用需要输出模拟信号来控制外部设备,例如模拟电压控制器、模拟驱动器等。模拟功能的GPIO引脚可以用来生成这些模拟控制信号。
- 模拟电压监测:一些应用需要监测模拟电压信号,例如电池电压监测。模拟功能的GPIO引脚可以用来读取这些模拟电压信号并进行处理。
- 模拟信号处理:一些应用需要对模拟信号进行处理,例如滤波、放大、衰减等。模拟功能的GPIO引脚可以用来连接外部模拟电路以实现这些功能。
总的来说,模拟功能的GPIO引脚可以用于需要处理模拟信号的应用,包括传感器接口、模拟控制、模拟信号监测和处理等场景。
代码
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA0引脚初始化为模拟输入
开漏输出
软件IIC的SDA、SCL等
应用场景
- 总线通信:在I2C、SPI等总线通信中,通常需要使用开漏输出来实现多个设备共享同一根信号线。开漏输出可以实现多个设备对信号线的控制,而不会造成冲突。
- 控制器件级联:某些时候,需要将多个器件级联在一起,以实现某种功能。开漏输出可以使每个器件都能对信号线进行控制,从而实现级联。
- 驱动低电平逻辑:在某些情况下,需要输出低电平信号给外部电路,但是不需要输出高电平。开漏输出可以实现这种功能。
- 电平转换:在连接不同电平的器件时,可能需要进行电平转换。开漏输出可以与外部电路结合,实现电平的适配。
- 输出电平保护:开漏输出可以使输出引脚对过压和短路具有一定的保护作用,可以提高输出引脚的可靠性。
总的来说,GPIO开漏输出适用于需要实现多路信号共享、级联连接或者对外部电路提供一定保护的应用场景。
代码
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA, &GPIO_InitStructure);
推挽输出
驱动能力强,25mA(max),通用输出
应用场景
- 驱动LED:推挽输出常用于驱动LED,因为LED需要接收一个稳定的高电平或低电平信号来工作。
- 驱动继电器或电机:推挽输出可以用来控制继电器或电机的驱动器,以控制其开关状态或转动方向。
- 驱动蜂鸣器:推挽输出可以用来驱动蜂鸣器发出声音,因为它提供了稳定的高低电平信号。
- 输出控制信号:在某些应用中,需要通过GPIO输出控制信号,例如启动/停止信号、使能/失能信号等。
- 通信接口:在某些通信接口中,需要使用GPIO推挽输出来驱动信号线,例如UART、SPI、I2C等。
- 数字输出控制:在数字逻辑电路中,需要使用GPIO推挽输出来控制数字信号的传输和处理。
总的来说,GPIO推挽输出适用于需要在输出引脚上提供稳定电压的任何应用场景,包括驱动外部设备、控制信号输出等。
代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
//使用各个外设前必须开启时钟,否则对外设的操作无效
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引脚,赋值为第0号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数
//函数内部会自动根据结构体的参数配置相应寄存器
//实现GPIOA的初始化
开漏式复用功能
片上外设功能(硬件IIC 的SDA、SCL引脚等)
应用场景
- I2C总线通信:在I2C总线通信中,引脚需要既能作为开漏输出来驱动总线上的信号,又能作为输入来接收总线上的信号。
- SPI总线通信:在SPI总线通信中,引脚需要既能作为开漏输出来驱动总线上的信号,又能作为输入来接收总线上的信号。
- 串口通信:在串口通信中,引脚需要既能作为输出来发送数据,又能作为输入来接收数据。
- PWM输出:在PWM输出中,引脚需要既能作为输出来产生PWM信号,又能作为其他功能的输入。
- 控制信号输出:在控制信号输出中,引脚需要既能作为输出来控制外部设备,又能作为输入来接收外部设备的状态。
总的来说,GPIO开漏式复用功能适用于需要在同一引脚上实现多种功能的应用场景,包括通信接口、控制信号输出等。
代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
//使用各个外设前必须开启时钟,否则对外设的操作无效
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
推挽式复用功能
片上外设功能(SPI 的SCK、MISO、MOSI引脚等)
应用场景
- PWM输出:在需要生成PWM信号的应用中,可以使用推挽输出模式来输出PWM信号。
- 数字信号输出:在控制外部数字电路时,可以使用推挽输出来提供稳定的数字信号。
- 控制信号输出:在控制外部设备或模块时,可以使用推挽输出来提供控制信号。
- 驱动LED:推挽输出通常用于驱动LED,因为LED需要一个稳定的高电平或低电平信号来工作。
- 通信接口:在一些通信接口中,需要使用推挽输出来驱动信号线,例如UART、SPI、I2C等。
- 数字输出控制:在数字逻辑电路中,需要使用推挽输出来控制数字信号的传输和处理。
总的来说,GPIO推挽式复用功能适用于需要在同一引脚上实现多种功能,并且需要稳定电平输出和较高驱动能力的应用场景。
代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
//使用各个外设前必须开启时钟,否则对外设的操作无效
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA5和PA7引脚初始化为复用推挽输出