GPIO控制器原理 介绍什么是GPIOGPIO代表通用输入/输出是一种用于与外部设备通信的通用接口。在嵌入式系统中GPIO通常是一组可以配置为输入或输出的引脚用于与外部电子元件如传感器、执行器、LED等进行数字通信。STM32F407 GPIO控制器STM32F407IGH6共有176个引脚其中GPIO引脚共140个。GPIO引脚分为9组(GPIOA~GPIOI)其中GPIOA~GPIOH 8组每组16个引脚(pin0~pin15)GPIOI组12个引脚(pin0~pin11)。GPIO控制器框图分析GPIO的模式模式功能输出模式推挽输出、开漏输出输入模式上拉输入、下拉输入、浮空输入模拟模式ADC 与 DAC复用模式USRT、I2C、SPI 等输入模式GPIO输入模式GPIO输入模式常用来检查芯片外部IO引脚的状态外部电压经过TTL施密特触发器之后将输出逻辑最终写于GPIO寄存器。TTL施密特触发器施密特触发器是一种整形电路可以将输入信号整形为方波信号•当输入电压高于正向阈值电压输出为高•当输入电压低于负向阈值电压输出为低IO口信号经过触发器后可以将电平分为高电平与低电平也就是1和0的数字信号。输入电压范围TTL施密特触发器上触发点2.31V0.7*VDD1.7V≤VDD≤3.6VTTL施密特触发器下触发点0.99V0.3*VDD1.7V≤VDD≤3.6V5V容忍输入电压范围-0.3V~5.5V2V≤VDD≤3.6V)浮空输入浮空输入模式是一种高阻态模式不设置上拉或者是下拉引脚不连接到外部电路处于高阻状态。当接入外部电路时则可通过读取引脚的电平状态来检测外部信号高低电平的变化。上拉输入上拉输入的特点是具有内部上拉电阻引脚的默认电平为高电平常用于检测外部信号为低电平。下拉输入下拉输入的特点是具有内部下拉电阻引脚的默认电平为低电平常用于检测外部信号为高电平。三极管与MOS二极管是一种具有两个电极阴极、阳极的半导体器件单PN结电子元件具有单向导电性。单向导电性给二极管阳极和阴极加上正向电压时二极管导通。当给阳极和阴极加上反向电压时二极管截止。参数描述典型值导通电压 (VT)二极管开始导通的正向电压硅管0.5‑0.7V锗管0.1‑0.3V正向导通压降 (VF)二极管导通后的正向电压降硅管0.6‑0.8V锗管0.2‑0.3V三极管三极管全称是“晶体三极管”也被称作“晶体管”是一种具有放大功能的半导体器件。• 基极用于激活晶体管。• 集电极三极管的正极。• 发射极三极管的负极。三极管可以工作在三种状态分别是截止状态、放大状态、饱和状态。三极管工作状态截止状态当加在三极管发射结的电压小于PN结的导通电压基极电流为零集电极电流和发射极电流都为零集电极和发射极之间相当于开关的断开状态我们称三极管处于截止状态。放大状态当加在三极管发射结的电压大于PN结的导通电压并处于某一恰当的值时三极管的发射结正向偏置集电结反向偏置这时基极电流对集电极电流起着控制作用使三极管具有电流放大作用这时三极管处放大状态。饱和导通当加在三极管发射结的电压大于PN结的导通电压并当基极电流增大到一定程度时集电极电流不再随着基极电流的增大而增大而是处于某一定值附近不怎么变化这时三极管失去电流放大作用集电极与发射极之间的电压很小集电极和发射极之间相当于开关的导通状态。三极管的这种状态我们称之为饱和导通状态。根据结构的不同三极管可分为NPN型三极管由P型半导体夹在两个N型半导体之间基极接正电压(高电平)触发导通PNP型三极管由N型半导体夹在两个P型半导体之间基极接负电压(低电平)触发导通MOS管MOS管是一种场效应管广泛用于功率放大、开关控制、电机驱动、DC-DC转换、射频信号处理等领域。与三极管不同MOS管是电压控制型器件工作时几乎不消耗控制电流因此更适合低功耗和高速开关电路。MOS管主要由栅极Gate, G、漏极Drain, D、源极Source, S三部分组成。MOS管类型根据导电类型不同MOS管分为N沟道MOS管NMOSG相对S加正电压(高电平)P沟道MOS管PMOSG相对S加负电压(低电平)三极管与MOS管对比特性三极管MOS管控制方式电流电压功耗较高低功耗速度较慢更快应用场景低频、信号放大模拟电路、低功率驱动高频、高功率应用开关电源、电机驱动输出模式输出模式GPIO控制器输出模式主要是由P-MOS管和N-MOS管组成的一个结构单元。• 当P-MOS管和N-MOS管同时工作可组成推挽输出模式• 当只有N-MOS管工作时可组成开漏输出模式推挽输出推挽输出模式是根据P-MOS和N-MOS管的工作方式命名的。• 在该结构单元输入一个低电平时P-MOS管导通N-MOS管截止对外输出高电平。• 在该结构单元输入一个高电平时P-MOS管截止N-MOS管导通对外输出低电平。开漏输出• 开漏输出模式时不论输入是高电平还是低电平P-MOS管总处于关闭状态。• 当输入高电平时N-MOS管导通输出即为低电平• 当输入低电平时N-MOS管截止这个时候引脚状态既不是高电平也不是低电平我们称之为高阻态。• 如果想让引脚输出高电平那么引脚必须外接一个上拉电阻由上拉电阻提供高电平。开漏输出的特点线与逻辑在这种逻辑下只有当所有连接设备都输出高电平时总线才会是高电平。如果任何一个设备输出低电平总线将被拉低。这样设计可以方便实现总线仲裁和同步。ODR与BSRR寄存器使用ODR设置IO口引脚状态1.读取ODR寄存器数据2.使用位操作修改要操作的IO引脚状态3.将修改后的数据写回ODR寄存器使用BSRR设置IO口引脚状态1.设置要操作的IO引脚状态(置位对应[0:15],复位对应[16:31])2.将数据写到BSRR寄存器模拟模式GPIO模拟输入的原理相对简单IO引脚上的模拟电压在GPIO部分不做任何处理直接输入到芯片内部的ADC控制器部分进行采样处理。复用模式IO复用模式主要是为后续各种控制器驱动对应外设时提供的一个配置将IO引脚设置为复用模式后该管脚状态的控制不再由GPIO控制器控制其高低状态而是由对应的外设控制器进行状态控制。GPIO控制器HAL库接口 GPIO寄存器映射GPIO控制器基址GPIOA组寄存器基址0x40020000GPIOB组寄存器基址0x40020400GPIOC组寄存器基址0x40020800GPIOD组寄存器基址0x40020C00GPIOE组寄存器基址0x40021000GPIOF组寄存器基址0x40021400GPIOG组寄存器基址0x40021800GPIOH组寄存器基址0x40021C00GPIOI组寄存器基址0x40022000寄存器映射寄存器名称描述偏移地址GPIOx_MODERGPIO端口模式寄存器0x00GPIOx_OTYPERGPIO端口输出类型寄存器0x04GPIOx_OSPEEDERGPIO端口输出速度寄存器0x08GPIOx_PUPDRGPIO端口上拉/下拉寄存器0x0CGPIOx_IDRGPIO端口输入数据寄存器0x10GPIOx_ODRGPIO端口输出数据寄存器0x14GPIOx_BSRRGPIO端口置位/复位寄存器0x18GPIOx_AFRLGPIO复用功能低位寄存器0x20GPIOx_AFRHGPIO复用功能高位寄存器0x24HAL库接口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;GPIO引脚状态typedef enum { GPIO_PIN_RESET 0, /* 低电平状态 */ GPIO_PIN_SET /* 高电平状态 */ } GPIO_PinState;HAL_GPIO_Init函数项目内容函数功能初始化GPIO控制器函数原型void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数参数GPIOxGPIO组控制器基址GPIO_InitGPIO引脚模式配置函数返回值无HAL_GPIO_ReadPin函数函数功能读取GPIO端口电平状态函数原型GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数参数GPIOxGPIO组控制器基址GPIO_PinGPIO组内引脚函数返回值GPIO引脚状态HAL_GPIO_WritePin函数项目内容函数功能设置GPIO端口电平状态函数原型void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)函数参数GPIOxGPIO组控制器基址GPIO_PinGPIO组内引脚PinState要设置的状态函数返回值无HAL_GPIO_TogglePin函数项目内容函数功能反转GPIO端口电平状态函数原型void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数参数GPIOxGPIO组控制器基址GPIO_PinGPIO组内引脚函数返回值无GPIO控制器应用 LED灯控制应用实验LED控制LED发光需要在发光二极管的两端形成压降那么LED0处就需要一个低于发光二极管上端的电压因此当LED0为低电平时发光二极管点亮当LED0为高电平时发光二极管熄灭。按键输入应用实验按键输入由上拉电阻与滤波电容并联按键组成的按键输入电路当单片机正常工作时KEY1由上拉电阻拉高当按键按下时电容放电KEY1信号拉低。单片机通过GPIO引脚来读取KEY1点处的电压就能知道外部电平的状态。调压信号发生器应用实验调压信号发生器SW-OD连接单片机的I/O口当I/O采用开漏输出时输出低电平时SW-OD的电压为0V当我们想控制I/O引脚输出高电平时I/O引脚的状态完全由外部电路决定这里也就是由电阻R110、R111与R112串联电路决定为SW-OD处的电压值。继电器控制应用实验继电器控制当DE两端有电流流过时电磁铁通电把衔铁吸下来BC接触BC两端相当于一根导线电路开始工作。当DE两端有没有电流流过时电磁铁断电时失去磁性弹簧把衔铁拉起来切断工作电路。该电路中采用的线圈为5V的继电器使用NPN三极管来控制继电器通断。Relay1接单片机的IO口当Relay1输出低电平时三极管截止继电器不会动作。当Relay1输出高电平时三极管导通继电器动作。