
GPIO 基础与配置方法一、GPIO单片机与外界交互最基础的外设输出控制引脚输出高低电平驱动 LED、蜂鸣器等输入读取引脚电平用于按键等外部信号。STM32F103C8T6 的 GPIO 按端口分组每组 16 个引脚二、GPIO 的 8 种工作模式引脚内部通过寄存器配置决定工作模式模式方向说明典型用途浮空输入输入电平由外部决定容易悬空极少使用上拉输入输入内部上拉空闲默认高按键按下接地下拉输入输入内部下拉空闲默认低按键按下接高模拟输入输入不经过施密特触发器ADC 采样开漏输出输出只能拉低需外部上拉I2C、多机共线推挽输出输出能拉高也能拉低驱动强驱动 LED、蜂鸣器复用开漏输出复用由外设控制开漏外设功能复用推挽输出复用由外设控制推挽外设功能如 PWM输出点灯用推挽输出GPIO_Mode_Out_PP读按键用上拉输入GPIO_Mode_IPU。三、GPIO 常用寄存器标准库把寄存器封装成GPIOA-CRL形式代码里无需直接操作寄存器作用CRL配置低 8 位引脚PIN0~7模式CRH配置高 8 位引脚PIN8~15模式IDR输入数据寄存器读ODR输出数据寄存器写BSRR位设置/清除寄存器四、GPIO 配置1. 使能时钟GPIO 挂在 APB2RCC_APB2PeriphClockCmd2. 填充 GPIO_InitTypeDef 结构体调用 GPIO_Init 写入寄存器3. 输入→读取输出→控制使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);配置结构体并初始化GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; // 引脚 PA0 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 输出速度 GPIO_Init(GPIOA, GPIO_InitStructure);输入模式不需要GPIO_Speed模式改为GPIO_Mode_IPU/GPIO_Mode_IPD。操作引脚操作函数输出高电平GPIO_SetBits(GPIOA, GPIO_Pin_0)输出低电平GPIO_ResetBits(GPIOA, GPIO_Pin_0)按值写单引脚GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET/Bit_RESET)整端口写GPIO_Write(GPIOA, 0x0001)读取单引脚GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)读取输出寄存器GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)五、编程常用技巧1. 延时函数软件延时void Delay(uint32_t i) { while (i--); } // 空转延时大小需按主频校准2. 按键软件消抖机械按键按下瞬间会抖动5~20ms需消抖检测到变化后延时跳过抖动二次确认。3. LED 翻转GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)));4. 流水灯位运算GPIO_Write(GPIOA, 0x0001 i); // 1 左移 i 位点亮第 i 个 LED六、光敏传感器控制蜂鸣器1. 光敏传感器光敏电阻光照强 → 输出低电平光照弱遮挡→ 输出高电平STM32 用 GPIO输入模式读取该电平。2. 与按键的对比输入源电平来源空闲状态读取函数按键手动按下上拉高GPIO_ReadInputDataBit光敏传感器光照变化取决于光照GPIO_ReadInputDataBit思路一致配置为输入模式 → 读取电平 → 根据电平执行动作。区别只在信号源不同。3. 两个功能按键控制 LED按键按下翻转 LED光敏控制蜂鸣器光线变暗时蜂鸣器响起4. 光敏模块接线光敏模块输出引脚 ── GPIO 输入引脚如 PA1 光敏模块 VCC ── 3.3V 光敏模块 GND ── GND七、常见易错点忘记使能时钟→ 写入无效引脚无反应选错总线GPIO 必须用RCC_APB2PeriphClockCmd端口与引脚不一致GPIO_Init(GPIOA,...)要和GPIO_Pin_0对应引脚选错按开发板原理图确认实际引脚模式选错输出用 Push-Pull输入用 IPU/IPD二者不能混用按键不消抖→ 一次按压多次触发高/低电平逻辑错误看清电路低电平点亮时ResetBits才亮