一、含义GPIO代表通用输入/输出是一种用于与外部设备通信的通用接口。在嵌入式系统中GPIO通常是一组可以配置为输入或输出的引脚用于与外部电子元件如传感器、执行器、LED等进行数字通信。模式分类工作模式典型功能 / 说明输出模式推挽输出输出高电平为 VCC低电平为 GND驱动能力强开漏输出输出高电平需外部上拉电阻可实现线与功能输入模式上拉输入内部上拉电阻接 VCC无信号时为高电平下拉输入内部下拉电阻接 GND无信号时为低电平浮空输入无上下拉电平由外部电路决定易受干扰模拟模式模拟输入/输出用于 ADC采样模拟电压和 DAC输出模拟电压复用模式复用功能引脚由片上外设控制如 USART、I²C、SPI 等二、输入模式GPIO输入模式常用来检查芯片外部IO引脚的状态外部电压经过TTL施密特触发器之后将输出逻辑最终写于GPIO寄存器。2.1 TTL施密特触发器项目参数 / 说明基本功能整形电路将输入信号整形为方波信号正向阈值电压上触发点2.31V0.7 × VDD适用于 1.7V ≤ VDD ≤ 3.6V负向阈值电压下触发点0.99V0.3 × VDD适用于 1.7V ≤ VDD ≤ 3.6V逻辑规则• 输入电压 正向阈值 → 输出高电平1• 输入电压 负向阈值 → 输出低电平05V 容忍输入电压范围-0.3V ~ 5.5V适用于 2V ≤ VDD ≤ 3.6V输出信号类型数字信号1 / 02.2 各个模式输入模式内部电阻默认电平典型应用说明浮空输入无上拉/下拉高阻态不确定检测外部真实电平如按键、外部信号引脚处于高阻状态电平完全由外部电路决定易受干扰上拉输入内部上拉电阻高电平检测外部信号是否为低电平默认高电平外部拉低时检测到低电平下拉输入内部下拉电阻低电平检测外部信号是否为高电平默认低电平外部拉高时检测到高电平三、输出模式GPIO控制器输出模式主要是由P-MOS管和N-MOS管组成的一个结构单元。当P-MOS管和N-MOS管同时工作可组成推挽输出模式当只有N-MOS管工作时可组成开漏输出模式3.1 推挽输出项目说明命名依据根据 P-MOS 和 N-MOS 管的工作方式命名输入低电平时P-MOS 管导通N-MOS 管截止 →对外输出高电平输入高电平时P-MOS 管截止N-MOS 管导通 →对外输出低电平驱动能力强可直接输出高电平和低电平是否需要外部上拉电阻不需要典型应用驱动 LED、数字信号输出、普通 I/O 通信3.2 开漏输出项目说明P-MOS 管状态不论输入高低始终处于关闭状态输入高电平时N-MOS 管导通 → 输出为低电平输入低电平时N-MOS 管截止 → 输出为高阻态既非高电平也非低电平输出高电平条件必须外接上拉电阻由上拉电阻提供高电平是否需要外部上拉电阻需要如需输出高电平线与逻辑说明当多个开漏输出引脚并联时•所有设备都输出高电平高阻态上拉→ 总线为高电平•任一设备输出低电平N-MOS导通→ 总线被拉低电平• 这种机制方便实现总线仲裁和同步通信典型应用I²C 总线、SMBus、多设备共享线路需线与功能的场景3.2.1 ODR与BSRR寄存器对比项ODR 寄存器BSRR 寄存器定义输出数据寄存器Output Data Register端口位设置/复位寄存器Bit Set/Reset Register作用控制 GPIO 引脚的输出电平状态高/低实现原子操作方式设置或清除 GPIO 引脚状态基本功能• 写 1 → 对应引脚输出高电平• 写 0 → 对应引脚输出低电平• 可读回当前输出值• 低16位写 1 → 对应引脚输出高电平• 高16位写 1 → 对应引脚输出低电平• 写 0 无效不影响其他引脚工作原理读‑改‑写1. 读取整个 ODR 值2. 修改其中特定位3. 将修改后的值写回 ODR直接写1. 软件准备好要置位/复位的位掩码2. 一次性写入 BSRR3. 硬件自动完成对应引脚的电平改变是否支持读取支持可读取当前输出状态不支持只写寄存器读返回无效数据操作原子性非原子读‑改‑写之间可能被中断破坏原子一次写入硬件一次性完成对其它引脚影响有风险修改一位时必须回写整个寄存器可能误改其它位无影响只改变被写 1 的位其他引脚维持原状硬件实现一个锁存器直接连到输出驱动电路两个锁存器/触发器一个用于置位一个用于复位输出由两个触发器的状态决定ODR 是整体覆盖写入修改部分引脚时必须先读取全部状态来保护其他引脚BSRR 是独立脉冲控制置高和置低分开永远不需要读取当前状态因此混合操作也能一步原子完成。四、模拟与复用模式对比项复用模式模拟模式控制主体对应的外设控制器如 USART、I²C、SPI、定时器等ADC 控制器 / DAC 控制器工作原理将 IO 引脚设置为复用模式后管脚状态的控制不再由 GPIO 控制器控制而是由对应的外设控制器进行状态控制IO 引脚上的模拟电压在 GPIO 部分不做任何处理直接输入到芯片内部的 ADC 控制器进行采样处理信号类型数字信号0 或 1模拟信号连续电压值是否经过施密特触发器是输入路径否直通 ADC引脚状态由外设决定高/低电平高阻态电压值由外部模拟电路决定典型应用USART、I²C、SPI、PWM、定时器输入捕获、外部中断等ADC 模拟电压采集、DAC 模拟电压输出配置要点需将引脚映射到对应的复用功能AF需配置为模拟模式引脚连接 ADC/DAC 通道五、GPIO寄存器映射5.1 GPIO 各组寄存器基址GPIO 组寄存器基址GPIOA0x40020000GPIOB0x40020400GPIOC0x40020800GPIOD0x40020C00GPIOE0x40021000GPIOF0x40021400GPIOG0x40021800GPIOH0x40021C00GPIOI0x40022000规律每组 GPIO 寄存器地址间隔0x4001024 字节5.2 GPIO 寄存器映射偏移地址寄存器名称缩写偏移地址功能描述GPIO 端口模式寄存器GPIOx_MODER0x00配置引脚模式输入/输出/复用/模拟GPIO 端口输出类型寄存器GPIOx_OTYPER0x04配置输出类型推挽/开漏GPIO 端口输出速度寄存器GPIOx_OSPEEDR0x08配置输出速度低速/中速/高速/超高速GPIO 端口上拉/下拉寄存器GPIOx_PUPDR0x0C配置上拉/下拉电阻上拉/下拉/浮空GPIO 端口输入数据寄存器GPIOx_IDR0x10读取引脚输入电平状态只读GPIO 端口输出数据寄存器GPIOx_ODR0x14控制引脚输出电平可读可写GPIO 端口置位/复位寄存器GPIOx_BSRR0x18原子操作置高/置低引脚只写GPIO 复用功能低位寄存器GPIOx_AFRL0x20配置引脚 0~7 的复用功能GPIO 复用功能高位寄存器GPIOx_AFRH0x24配置引脚 8~15 的复用功能基址与偏移的使用方法某个具体寄存器的地址 该组基址 偏移地址六、HAL库接口6.1 GPIO引脚初始化配置结构体typedef struct { uint32_t Pin; /* 要配置的 GPIO 引脚 */ uint32_t Mode; /* GPIO 引脚的工作模式 */ uint32_t Pull; /* GPIO 引脚是否使用上、下拉电阻 */ uint32_t Speed; /* GPIO 引脚电平反转速度 */ uint32_t Alternate; /* GPIO 引脚复用模式 */ } GPIO_InitTypeDef;6.2 GPIO引脚状态typedef enum { GPIO_PIN_RESET 0, /* 低电平状态 */ GPIO_PIN_SET /* 高电平状态 */ } GPIO_PinState;6.3 HAL_GPIO_Init函数项目说明函数功能初始化 GPIO 控制器函数原型void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)参数 GPIOxGPIO 组控制器基址如 GPIOA、GPIOB 等参数 GPIO_InitGPIO 引脚模式配置引脚号、模式、上下拉、速度、复用功能等返回值无6.4 HAL_GPIO_ReadPin函数项目说明函数功能读取 GPIO 端口电平状态函数原型GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)参数 GPIOxGPIO 组控制器基址如 GPIOA、GPIOB 等参数 GPIO_PinGPIO 组内引脚如 GPIO_PIN_0、GPIO_PIN_1 等返回值GPIO 引脚状态GPIO_PIN_RESET 低电平 / GPIO_PIN_SET 高电平6.5 HAL_GPIO_WritePin函数项目说明函数功能设置 GPIO 端口电平状态函数原型void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)参数 GPIOxGPIO 组控制器基址如 GPIOA、GPIOB 等参数 GPIO_PinGPIO 组内引脚如 GPIO_PIN_0、GPIO_PIN_1 等参数 PinState要设置的状态GPIO_PIN_RESET 低电平 / GPIO_PIN_SET 高电平返回值无6.6 HAL_GPIO_TogglePin函数项目说明函数功能反转 GPIO 端口电平状态函数原型void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)参数 GPIOxGPIO 组控制器基址如 GPIOA、GPIOB 等参数 GPIO_PinGPIO 组内引脚如 GPIO_PIN_0、GPIO_PIN_1 等返回值无
GPIO控制器原理
一、含义GPIO代表通用输入/输出是一种用于与外部设备通信的通用接口。在嵌入式系统中GPIO通常是一组可以配置为输入或输出的引脚用于与外部电子元件如传感器、执行器、LED等进行数字通信。模式分类工作模式典型功能 / 说明输出模式推挽输出输出高电平为 VCC低电平为 GND驱动能力强开漏输出输出高电平需外部上拉电阻可实现线与功能输入模式上拉输入内部上拉电阻接 VCC无信号时为高电平下拉输入内部下拉电阻接 GND无信号时为低电平浮空输入无上下拉电平由外部电路决定易受干扰模拟模式模拟输入/输出用于 ADC采样模拟电压和 DAC输出模拟电压复用模式复用功能引脚由片上外设控制如 USART、I²C、SPI 等二、输入模式GPIO输入模式常用来检查芯片外部IO引脚的状态外部电压经过TTL施密特触发器之后将输出逻辑最终写于GPIO寄存器。2.1 TTL施密特触发器项目参数 / 说明基本功能整形电路将输入信号整形为方波信号正向阈值电压上触发点2.31V0.7 × VDD适用于 1.7V ≤ VDD ≤ 3.6V负向阈值电压下触发点0.99V0.3 × VDD适用于 1.7V ≤ VDD ≤ 3.6V逻辑规则• 输入电压 正向阈值 → 输出高电平1• 输入电压 负向阈值 → 输出低电平05V 容忍输入电压范围-0.3V ~ 5.5V适用于 2V ≤ VDD ≤ 3.6V输出信号类型数字信号1 / 02.2 各个模式输入模式内部电阻默认电平典型应用说明浮空输入无上拉/下拉高阻态不确定检测外部真实电平如按键、外部信号引脚处于高阻状态电平完全由外部电路决定易受干扰上拉输入内部上拉电阻高电平检测外部信号是否为低电平默认高电平外部拉低时检测到低电平下拉输入内部下拉电阻低电平检测外部信号是否为高电平默认低电平外部拉高时检测到高电平三、输出模式GPIO控制器输出模式主要是由P-MOS管和N-MOS管组成的一个结构单元。当P-MOS管和N-MOS管同时工作可组成推挽输出模式当只有N-MOS管工作时可组成开漏输出模式3.1 推挽输出项目说明命名依据根据 P-MOS 和 N-MOS 管的工作方式命名输入低电平时P-MOS 管导通N-MOS 管截止 →对外输出高电平输入高电平时P-MOS 管截止N-MOS 管导通 →对外输出低电平驱动能力强可直接输出高电平和低电平是否需要外部上拉电阻不需要典型应用驱动 LED、数字信号输出、普通 I/O 通信3.2 开漏输出项目说明P-MOS 管状态不论输入高低始终处于关闭状态输入高电平时N-MOS 管导通 → 输出为低电平输入低电平时N-MOS 管截止 → 输出为高阻态既非高电平也非低电平输出高电平条件必须外接上拉电阻由上拉电阻提供高电平是否需要外部上拉电阻需要如需输出高电平线与逻辑说明当多个开漏输出引脚并联时•所有设备都输出高电平高阻态上拉→ 总线为高电平•任一设备输出低电平N-MOS导通→ 总线被拉低电平• 这种机制方便实现总线仲裁和同步通信典型应用I²C 总线、SMBus、多设备共享线路需线与功能的场景3.2.1 ODR与BSRR寄存器对比项ODR 寄存器BSRR 寄存器定义输出数据寄存器Output Data Register端口位设置/复位寄存器Bit Set/Reset Register作用控制 GPIO 引脚的输出电平状态高/低实现原子操作方式设置或清除 GPIO 引脚状态基本功能• 写 1 → 对应引脚输出高电平• 写 0 → 对应引脚输出低电平• 可读回当前输出值• 低16位写 1 → 对应引脚输出高电平• 高16位写 1 → 对应引脚输出低电平• 写 0 无效不影响其他引脚工作原理读‑改‑写1. 读取整个 ODR 值2. 修改其中特定位3. 将修改后的值写回 ODR直接写1. 软件准备好要置位/复位的位掩码2. 一次性写入 BSRR3. 硬件自动完成对应引脚的电平改变是否支持读取支持可读取当前输出状态不支持只写寄存器读返回无效数据操作原子性非原子读‑改‑写之间可能被中断破坏原子一次写入硬件一次性完成对其它引脚影响有风险修改一位时必须回写整个寄存器可能误改其它位无影响只改变被写 1 的位其他引脚维持原状硬件实现一个锁存器直接连到输出驱动电路两个锁存器/触发器一个用于置位一个用于复位输出由两个触发器的状态决定ODR 是整体覆盖写入修改部分引脚时必须先读取全部状态来保护其他引脚BSRR 是独立脉冲控制置高和置低分开永远不需要读取当前状态因此混合操作也能一步原子完成。四、模拟与复用模式对比项复用模式模拟模式控制主体对应的外设控制器如 USART、I²C、SPI、定时器等ADC 控制器 / DAC 控制器工作原理将 IO 引脚设置为复用模式后管脚状态的控制不再由 GPIO 控制器控制而是由对应的外设控制器进行状态控制IO 引脚上的模拟电压在 GPIO 部分不做任何处理直接输入到芯片内部的 ADC 控制器进行采样处理信号类型数字信号0 或 1模拟信号连续电压值是否经过施密特触发器是输入路径否直通 ADC引脚状态由外设决定高/低电平高阻态电压值由外部模拟电路决定典型应用USART、I²C、SPI、PWM、定时器输入捕获、外部中断等ADC 模拟电压采集、DAC 模拟电压输出配置要点需将引脚映射到对应的复用功能AF需配置为模拟模式引脚连接 ADC/DAC 通道五、GPIO寄存器映射5.1 GPIO 各组寄存器基址GPIO 组寄存器基址GPIOA0x40020000GPIOB0x40020400GPIOC0x40020800GPIOD0x40020C00GPIOE0x40021000GPIOF0x40021400GPIOG0x40021800GPIOH0x40021C00GPIOI0x40022000规律每组 GPIO 寄存器地址间隔0x4001024 字节5.2 GPIO 寄存器映射偏移地址寄存器名称缩写偏移地址功能描述GPIO 端口模式寄存器GPIOx_MODER0x00配置引脚模式输入/输出/复用/模拟GPIO 端口输出类型寄存器GPIOx_OTYPER0x04配置输出类型推挽/开漏GPIO 端口输出速度寄存器GPIOx_OSPEEDR0x08配置输出速度低速/中速/高速/超高速GPIO 端口上拉/下拉寄存器GPIOx_PUPDR0x0C配置上拉/下拉电阻上拉/下拉/浮空GPIO 端口输入数据寄存器GPIOx_IDR0x10读取引脚输入电平状态只读GPIO 端口输出数据寄存器GPIOx_ODR0x14控制引脚输出电平可读可写GPIO 端口置位/复位寄存器GPIOx_BSRR0x18原子操作置高/置低引脚只写GPIO 复用功能低位寄存器GPIOx_AFRL0x20配置引脚 0~7 的复用功能GPIO 复用功能高位寄存器GPIOx_AFRH0x24配置引脚 8~15 的复用功能基址与偏移的使用方法某个具体寄存器的地址 该组基址 偏移地址六、HAL库接口6.1 GPIO引脚初始化配置结构体typedef struct { uint32_t Pin; /* 要配置的 GPIO 引脚 */ uint32_t Mode; /* GPIO 引脚的工作模式 */ uint32_t Pull; /* GPIO 引脚是否使用上、下拉电阻 */ uint32_t Speed; /* GPIO 引脚电平反转速度 */ uint32_t Alternate; /* GPIO 引脚复用模式 */ } GPIO_InitTypeDef;6.2 GPIO引脚状态typedef enum { GPIO_PIN_RESET 0, /* 低电平状态 */ GPIO_PIN_SET /* 高电平状态 */ } GPIO_PinState;6.3 HAL_GPIO_Init函数项目说明函数功能初始化 GPIO 控制器函数原型void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)参数 GPIOxGPIO 组控制器基址如 GPIOA、GPIOB 等参数 GPIO_InitGPIO 引脚模式配置引脚号、模式、上下拉、速度、复用功能等返回值无6.4 HAL_GPIO_ReadPin函数项目说明函数功能读取 GPIO 端口电平状态函数原型GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)参数 GPIOxGPIO 组控制器基址如 GPIOA、GPIOB 等参数 GPIO_PinGPIO 组内引脚如 GPIO_PIN_0、GPIO_PIN_1 等返回值GPIO 引脚状态GPIO_PIN_RESET 低电平 / GPIO_PIN_SET 高电平6.5 HAL_GPIO_WritePin函数项目说明函数功能设置 GPIO 端口电平状态函数原型void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)参数 GPIOxGPIO 组控制器基址如 GPIOA、GPIOB 等参数 GPIO_PinGPIO 组内引脚如 GPIO_PIN_0、GPIO_PIN_1 等参数 PinState要设置的状态GPIO_PIN_RESET 低电平 / GPIO_PIN_SET 高电平返回值无6.6 HAL_GPIO_TogglePin函数项目说明函数功能反转 GPIO 端口电平状态函数原型void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)参数 GPIOxGPIO 组控制器基址如 GPIOA、GPIOB 等参数 GPIO_PinGPIO 组内引脚如 GPIO_PIN_0、GPIO_PIN_1 等返回值无