一、GPIO基本功能概述
STM32F103C8T6的每个GPIO(通用输入输出)引脚均可独立配置为多种工作模式,支持数字信号输入/输出、模拟信号采集、复用功能(连接内部外设)等。芯片共有37个GPIO引脚(PA0-PA15, PB0-PB15, PC13-PC15, PD0-PD1),部分引脚与电源或调试接口复用。
二、GPIO工作模式
1. 输入模式
-
浮空输入(Floating Input)
引脚电平由外部电路决定,无内部上拉/下拉电阻。适用于需要精确电平检测的场景(如按键检测需外接电阻)。 -
上拉输入(Pull-up Input)
内部上拉电阻(约40kΩ)激活,默认高电平。适合简化外部电路设计(如按键直接接地)。 -
下拉输入(Pull-down Input)
内部下拉电阻(约40kΩ)激活,默认低电平。用于避免悬空引脚引入噪声。
2. 输出模式
-
推挽输出(Push-Pull Output)
可输出高电平(接近VDD)或低电平(接近GND),驱动能力强(最大25mA)。适用于驱动LED、继电器等负载。 -
开漏输出(Open-Drain Output)
仅能输出低电平或高阻态,需外接上拉电阻实现高电平。适用于总线通信(如I2C)避免电平冲突。
3. 复用功能模式
- 复用推挽/开漏输出
引脚由片上外设(如USART、SPI、TIM等)控制,输出模式与外设需求匹配。例如:- USART_TX引脚需配置为复用推挽输出。
- I2C_SDA引脚需配置为复用开漏输出。
4. 模拟模式
- 模拟输入/输出
关闭数字电路,直接连接至ADC/DAC模块。用于采集模拟信号(如传感器输出)或生成模拟电压。
三、GPIO中断功能
-
外部中断/事件控制器(EXTI)
每个GPIO引脚均可映射至16个EXTI线(PA0-Px0共享EXTI0,依此类推),支持以下触发方式:- 上升沿触发(Rising Edge)
- 下降沿触发(Falling Edge)
- 双边沿触发(Both Edges)
- 软件触发(Software Trigger)
-
应用场景
用于实时响应外部事件,如按键按下、传感器信号跳变等。
四、GPIO重映射功能
- 部分引脚支持功能重定位
通过AFIO(复用功能重映射和调试I/O配置寄存器)可将外设功能映射到不同引脚。例如:- USART1默认在PA9/PA10,可重映射至PB6/PB7。
- 定时器通道重映射用于优化PCB布局。
五、GPIO配置参数
-
速度等级
输出模式可配置为2MHz、10MHz或50MHz,决定引脚电平翻转速度。高速模式适用于高频信号(如PWM),但会增加电磁干扰(EMI)。 -
驱动能力
单个引脚最大输出电流25mA,但所有引脚总电流不超过100mA(避免芯片过热)。 -
电压容限
- 所有GPIO兼容3.3V和5V输入(5V容忍特性)。
- 输出高电平典型值为VDD-0.5V(如3.3V供电时约2.8V)。
六、GPIO使用注意事项
-
避免电气冲突
- 同一引脚不可同时配置为输出和输入模式。
- 开漏输出必须外接上拉电阻。
-
未使用引脚处理
建议配置为模拟模式或固定电平,减少功耗和噪声。 -
电源与接地
- 确保VDD和GND引脚可靠连接,避免电压跌落。
- 大电流负载(如电机)需独立供电,避免影响MCU稳定性。
-
ESD保护
裸露引脚(如调试接口)应添加TVS二极管,防止静电损坏。
七、上完整程序模版,复制可用,已详细注释
/* 包含STM32标准外设库头文件 */
#include "stm32f10x.h"
/* 宏定义引脚和端口(示例:LED在PA5,按键在PC13) */
#define LED_PIN GPIO_Pin_5
#define LED_PORT GPIOA
#define KEY_PIN GPIO_Pin_13
#define KEY_PORT GPIOC
/**
* @brief GPIO初始化函数
* @param GPIOx: 目标端口(GPIOA, GPIOB等)
* @param GPIO_Pin: 引脚号(GPIO_Pin_0~GPIO_Pin_15)
* @param GPIO_Mode: 工作模式(输入/输出/复用/模拟)
* @param GPIO_Speed: 输出速度(仅输出模式有效)
* @retval 无
*/
void GPIO_Config(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIOMode_TypeDef GPIO_Mode, GPIOSpeed_TypeDef GPIO_Speed) {
GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO配置结构体
/* 启用对应GPIO端口时钟(必须!否则无法操作寄存器) */
if (GPIOx == GPIOA) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
else if (GPIOx == GPIOB) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
else if (GPIOx == GPIOC) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/* 配置引脚参数 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin; // 选择目标引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode; // 设置模式(输入/输出/复用/模拟)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed; // 输出速度(2/10/50MHz)
/* 应用配置到指定引脚 */
GPIO_Init(GPIOx, &GPIO_InitStructure);
}
int main(void) {
/* 系统初始化 */
SystemInit(); // 配置系统时钟(默认72MHz)
/* 配置LED引脚为推挽输出模式,速度50MHz */
GPIO_Config(LED_PORT, LED_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz);
/* 配置按键引脚为上拉输入模式(速度参数无效) */
GPIO_Config(KEY_PORT, KEY_PIN, GPIO_Mode_IPU, GPIO_Speed_2MHz);
while(1) {
/* 读取按键状态(低电平表示按下) */
if (GPIO_ReadInputDataBit(KEY_PORT, KEY_PIN) == Bit_RESET) {
GPIO_SetBits(LED_PORT, LED_PIN); // LED亮(高电平驱动)
// 或使用 GPIO_WriteBit(LED_PORT, LED_PIN, Bit_SET);
} else {
GPIO_ResetBits(LED_PORT, LED_PIN); // LED灭(低电平)
// 或使用 GPIO_WriteBit(LED_PORT, LED_PIN, Bit_RESET);
}
}
}
/* 用户可选添加中断服务函数(需配合EXTI配置) */
// void EXTI15_10_IRQHandler(void) {
// if (EXTI_GetITStatus(EXTI_Line13) != RESET) {
// /* 处理PC13中断 */
// EXTI_ClearITPendingBit(EXTI_Line13);
// }
// }
八、模板程序功能说明
-
硬件抽象层
通过宏定义分离硬件配置(LED和按键引脚),便于移植修改。 -
GPIO通用配置函数
GPIO_Config()
封装了时钟使能、模式设置等操作,支持复用至任何引脚。 -
输入/输出控制
GPIO_ReadInputDataBit()
读取输入引脚状态GPIO_SetBits()/GPIO_ResetBits()
直接控制输出电平GPIO_WriteBit()
提供更灵活的电平写入方式
九、关键参数详解
-
GPIO_Mode(工作模式)
GPIO_Mode_AIN // 模拟输入(ADC/DAC使用) GPIO_Mode_IN_FLOATING // 浮空输入 GPIO_Mode_IPD // 下拉输入 GPIO_Mode_IPU // 上拉输入 GPIO_Mode_Out_OD // 开漏输出 GPIO_Mode_Out_PP // 推挽输出 GPIO_Mode_AF_OD // 复用开漏(如I2C) GPIO_Mode_AF_PP // 复用推挽(如USART)
-
GPIO_Speed(输出速度)
GPIO_Speed_2MHz // 低噪声,适合低速信号 GPIO_Speed_10MHz // 平衡模式 GPIO_Speed_50MHz // 高频需求(如PWM),但增加EMI
-
电平操作宏
Bit_SET // 高电平(对应寄存器值1) Bit_RESET // 低电平(对应寄存器值0)
十、使用注意事项
-
时钟使能
操作任何GPIO前必须启用对应端口时钟(RCC_APB2PeriphClockCmd()
)。 -
引脚冲突
避免同一引脚同时配置为输入和输出模式。 -
5V容忍
所有I/O支持5V输入,但输出电平仍为3.3V。 -
库依赖
需正确链接stm32f10x_gpio.c
和stm32f10x_rcc.c
标准外设库文件。
该模板覆盖了GPIO基本操作,可根据需求扩展中断、复用功能等高级特性。
十一、典型应用场景
- 数字输入
按键检测、开关状态读取、数字传感器(如红外接收管)。 - 数字输出
LED控制、蜂鸣器驱动、继电器控制。 - 模拟输入
温度传感器(LM35)、光照传感器(光敏电阻+ADC)。 - 复用功能
USART通信、SPI接口驱动显示屏、定时器PWM控制电机。 - 中断驱动
旋转编码器信号检测、外部触发信号捕获。