GPIO--单片机连接物理世界的唯一桥梁
GPIOGeneral Purpose Input/Output通用输入输出是嵌入式系统中最基础也最核心的接口可以把它看作是微控制器如单片机与外部世界沟通的“数字神经末梢”。简单来说它就是一个位于芯片上的物理引脚你可以通过软件将其配置为输入模式来读取外部信号如按键是否按下或配置为输出模式来控制外部设备如点亮一盏LED灯。通过编程我们可以将芯片的物理引脚配置成输入或输出模式以此来读取外部信号或控制外部设备控制GPIO本质上是操作芯片内部的一组寄存器通过向寄存器写入特定的值来配置模式、读取状态或设置输出电平。GPIO可配置为输出模式和输入模式由此衍生出8种工作模式。首先我们给出GPIO通用输入输出引脚的内部标准结构框图将图用红线切割为上下两部分图片上半部分输入路径读取外部信号图片下半部分输出路径与寄存器控制输出信号。1.当引脚作为输入模式时信号从I/O引脚流入分两路走模拟输入左上角直通信号不经过任何数字整形直接连接到片上的ADC模数转换器外设。这对应配置里的模拟输入模式用于读取电压模拟量。数字输入经过施密特触发器信号先经过TTL肖特基触发器图中标注它能把外部缓慢变化或带噪声的模拟信号整形成边缘陡峭的干净数字信号0或1。整形后的信号兵分两路一路进入输入数据寄存器IDR供CPU通过读寄存器指令读取即GPIO_ReadInputDataBit。另一路直接送往片上外设如UART、TIM、I2C这对应复用功能输入引脚作为RX或捕获引脚时使用。2.当引脚作为输出模式时信号从内部流向I/O引脚核心在于驱动电路输出控制核心P-MOS 和 N-MOS这是驱动器的功率管它们串联在VDD和VSS之间中间节点连接I/O引脚。P-MOS上管导通时引脚被强拉到高电平VDD。N-MOS下管导通时引脚被强拉到低电平VSS。输出驱动器控制逻辑根据你的配置决定谁来控制这对MOS管输出数据寄存器ODR你通过GPIO_SetBits写入的数据经由位设置/清除寄存器BSRR作用后直接控制MOS管。推挽输出上下管都工作和开漏输出只有下管工作上管关闭就是在这里区分的。复用功能输出开关切换让片上的SPI、USART等外设直接接管对MOS管的控制引脚作为TX或SCK时。接下来介绍几种工作模式1. 推挽输出注当GOIO工作在输出模式时输入电路并非完全切断还是存在如图示电路可以通过此电路读取GPIO的状态。当我们要输出1时有俩种写入方式第一种是将位设置寄存器置1然后写入输出数据寄存器ODR第二种是直接写输出数据寄存器随后数据将通过输出电路到达2个MOS管可以直接将MOS管当作开关我们要注意输出控制模块中带有反向器所以现在到达MOS管的信号为0P-MOS被打开VDD通向IO引脚输出高电平1。当我们要输出0时同样有俩种方式但需要注意的是此时需要将清除寄存器置1其他步骤类似。我们可以发现倘如芯片向IO口输出1/0时要形成闭合回路IO引脚要接入0/1这样类似与将电流推/挽(push-up)这就是推挽输出。2. 开漏输出开漏输出下P-MOS处于关闭状态。开漏输出下输出0步骤与推挽输出模式保持一致但是我们发现由于P-MOS关闭输出1无法通过内部电路完成因此我们通过外接上拉电阻实现输出1的需求如图此时两个MOS管都关闭内部电路处于高阻态状态通过上拉电阻可以将IO引脚输出为高电平。在此工作模式下两个MOS管共漏连接此时两个MOS管漏接开路因此称为开漏输出。怎么选择推挽输出和开漏输出呢?(1) 当你的引脚需要主动、强劲地输出高电平和低电平时选推挽。内部原理P-MOS上管和N-MOS下管交替导通。输出高电平时P-MOS强力把引脚拉到VDD如3.3V输出低电平时N-MOS强力把引脚拉到GND0V。适用场景控制数字信号点亮LED、驱动蜂鸣器、控制继电器需加三极管/MOS管驱动。普通通信接口SPISCK, MOSI、UARTTX、PWM脉宽调制输出。优点响应速度快边沿陡峭驱动能力强毫安级电流抗干扰性好。(2) 当你的引脚不能主动输出高电平只能拉低高电平全靠外部电路决定时必须选开漏。内部原理P-MOS上管被强制关闭只有N-MOS下管工作。引脚输出低电平时导通拉地想输出高电平时N-MOS关闭引脚处于高阻态必须依赖外接的上拉电阻把电平拉高。适用场景极其重要多主机通信总线必须典型就是I2CSCL, SDA。因为总线上可能挂多个设备开漏模式配合上拉电阻能实现“线与”逻辑只要有一个设备拉低总线就是低避免推挽模式下两个设备一个输出高、一个输出低导致的电源短路烧毁。电平不匹配总线电平转换当你的主控是3.3V但外设是5V且引脚耐压为5V容忍FT时上拉电阻接到5V。开漏模式下低电平主控能拉低0V高电平由5V上拉提供实现了逻辑电平的灵活转换无需电平转换芯片。共享总线多个输出共用一根线类似LED点阵的行列扫描或者多路报警信号共用一个中断引脚谁拉低谁触发。什么时候坚决避开开漏输出高速场景高速通信如SPI频率1MHz或UART高波特率开漏输出的高电平是靠外接电阻“慢悠悠”充电上去的RC延迟边沿非常平缓。如果用于SPI或高速UART会导致波形失真、通信失败。推挽输出的上升沿是P-MOS瞬间充上去的速度极快。3. 复用输出功能“复用输出功能”简单来说就是把这个GPIO引脚的控制权从你写的软件CPU手里移交给芯片内部的其他硬件外设如串口、定时器、SPI。此时信号来源于芯片外部外设。它与“通用输出”的本质区别谁在控制通用输出GPIO_OUT软件控制。你调用GPIO_SetBits()CPU向“输出数据寄存器ODR”写1引脚就输出高电平。电平怎么变完全由你的代码顺序决定。复用输出AF_OUT硬件控制。配置好后CPU不再干预引脚电平。引脚的电平完全由片上外设如USART的发送器、定时器的PWM波形发生器自动产生。电平怎么变由外设的硬件逻辑决定。复用输出依然延续之前的选择逻辑分为两种复用推挽输出绝大多数外设选这个。用于UARTTX、SPISCK, MOSI、PWM定时器输出。因为这些需要快速的边沿跳变高→低瞬间完成和强驱动能力。复用开漏输出只有特定总线选这个。主要用于I2CSCL, SDA。因为I2C协议要求多设备“线与”必须配合外部上拉电阻。4. 输入模式如图为输入模式框图此处施密特触发器作用是除去边缘毛刺。当I/O端口配置为输入时● 输出缓冲器被禁止● 施密特触发输入被激活● 根据输入配置(上拉下拉或浮动)的不同弱上拉和下拉电阻被连接● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器● 对输入数据寄存器的读访问可得到I/O状态当内部电路处于不同状态时处于不同工作状态浮空输入两个开关都断开引脚内部是“悬空”的。上拉输入连接VDD高电平的开关闭合引脚内部被电阻拉到高电平。下拉输入连接VSS地的开关闭合引脚内部被电阻拉到低电平。如何选择输入模式选择浮空、上拉还是下拉输入核心原则只有一条看外部电路已经帮你把电平“固定”成什么样了内部电阻的作用是“补充”而非“对抗”。秒选指南按场景匹配外部电路特征首选模式为什么外部信号源驱动能力很强能稳定输出明确的高/低电平如另一个MCU的推挽输出、逻辑门电路浮空输入外部电平足够强无需内部电阻多此一举。而且关闭内部电阻最省电无静态电流消耗。外部设备只在“按下/触发”时输出低电平0V未触发时引脚处于“悬空”状态如按键接地上拉输入未触发时内部电阻将电平拉高默认为1触发时引脚被外部强行拉低0。完美实现“低电平有效”检测。外部设备只在“按下/触发”时输出高电平VDD未触发时引脚处于“悬空”状态如按键接电源下拉输入未触发时内部电阻将电平拉低默认为0触发时引脚被外部强行拉高1。完美实现“高电平有效”检测。通信总线处于空闲状态但协议要求空闲时必须为确定电平如某些单总线协议上拉或下拉根据协议要求选择内部电阻确保总线空闲时不会乱跳。模拟输入当I/O端口被配置为模拟输入配置时● 输出缓冲器被禁止● 禁止施密特触发输入实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为’0’● 弱上拉和下拉电阻被禁止● 读取输入数据寄存器时数值为’0’。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →