
前言文章以STM32F103ZET6芯片为例来介绍一、宏观认识1. GPIO是什么GPIO是General Purpose Input/Output的简写字面含义就是“通用输入 / 输出”。是一个 MCU 内部用来做输入输出的控制器电路。2. GPIO在哪里GPIO属于MCU中的一个片上外设3. 理解GPIO输入输出输入输出的是什么本质就是输入输出高低电平。为什么要输出这些高低电平在上层语言层解释就是 0/1在下层硬件外设角度就会被视为 MCU 控制外设的手段比如输出高电平会被 LED 解释为要求点亮 LED会被电机解释成为电机正转会被串口接收方解释为传送 1 等等输出低电平则反之。为什么要输入单片机的核心作用是 “控制 “控制相关外设就必须先获取外设相关的数据比如需要知道开关是否被闭合传感器是否感受到数据变化设备是否处于休眠等然后根据外设状态数据变化在通过输出控制外设或者报告给用户等。所以输入输出的本质是输入输出高低电平 (手段)达到获取外设信息控制外设的目的。4. 理解GPIO通用为什么叫做通用输入输出“通用”意思就是一个东西被发明出来就是未来给 “大家” 用的。英语被发明出来英国人可以用美国人可以用我们中国人也可以用所以英语叫做世界 通用 语言。同样的道理GPIO 是通用输入输出GPIO 自己可以输入输出高低电平未来 MCU 内集成了其他外设控制器而其他外设控制器也要输出高低电平来控制外设怎么办难道给每一个外设控制器也焊接输入输出高低电平的硬件电路吗这样做势必会增加复杂度这样无疑会隐形的增加单片机成本包括功耗。所以GPIO 都已经做了输入输出高低电平了其他外设控制器你就别凑热闹了直接用 GPIO 不就好了。所以 GPIO 叫做通用输入输出。✨“通用”意思就是一个东西被发明出来就是未来给 “大家” 用的。这里的大家就是集成在 MCU 中的各种外设控制器或者与用来控制外设的硬件电路。✨ 我们把其他外设控制器直接使用 GPIO 硬件电路来进行输入输出的方式叫做复用 GPIO5. MCU内部的GPIO名词说明Pin就是引脚的意思Port端口的意思PORT 原意为 “港口”在计算机科学中引申为 “数据交换的入口或出口”现代微控制器如 STM32继承了这一概念将一组 GPIO 引脚称为 “GPIO PORT”如 GPIOA、GPIOB因为它们本质上是芯片与外部世界的 “数据交换接口”。为什么不叫 GPIO Group而叫做 GPIO Port Group 只能体现分组概念体现不出来数据交换的概念。Port 在计算机领域就有数据交换的概念成分。细节所有的 GPIO 控制器都是挂接在 APB2 桥设备上的为了管理一个一个的 pin (引脚)MCU 把 pin 划分成为了组叫做 GPIO PortSTM32F103ZET6 一共 7 组分别是 GPIOA~GPIOG每一个 GPIOX (X 范围 [A‑G] )都管理 [015] 个 PinMCU 管理 GPIO Pin 的方式是层状的多叉树型结构二、IO端口位电路结构注意GPIO 端口位是指 GPIO 端口中单个引脚的控制单元例如 PA0、PB3 等每一个 Pin 对应到 MCU 内部都会存在一套这样的硬件结构每一个 Pin都可以独立的进行输入和输出 换句话说所以我们搞清楚了一个 Pin 是如何输入输出的那么其他 Pin 也就会了1. IO输入路径理解简化理解2. IO输出路径理解简化输出理解✨结论片上外设其实是 MCU 内部的各种外设控制器或者控制电路宏观上一定要时刻记着MCU ! CPUMCU 内部是包含了片上外设控制器 ARM‑CPU 的GPIO 被设计出来不是只让 ARM‑CPU 进行 IO 读写数据的而是让所有片上设备进行 IO 的这就是为什么 STM32 芯片引脚中大部分引脚都是 GPIO Pin 的原因也是我们学习单片机需要优先学习 GPIO 的原因因为他为所有片上外设提供 IO 能力未来我们学习的其他片上外设不用单独设计 IO 接口电路直接复用 GPIO 即可这样可以大大减少 MCU 内部硬件电路设计的复杂度减少功耗最终表现在单片机价格上价格便宜了应用场景就会更丰富因为各种智能场景用得起 (当然这只是原因之一重点在感受生态问题上)。三、IO端口保护端口钳位保护双二极管钳位电路二极管导通压降一般在 0 点几伏 (常见的基本都在 0.6~0.7V 左右)为了说明该问题我们假设如下数值Vdd 3.3VVss 0V二极管导通电压是 0.7V二极管是一个元器件自身也存在电阻自身会承压结论当 输入电压 Vdd 保护二极管导通压降时上路二极管导通这时被钳位在 Vdd 二极管导通压降当 输入电压 Vss‑保护二极管导通压降时下路二极管导通这时被钳位在 Vss‑二极管导通压降✨思考上面的数值具体是多少不重要重要的是因为有了钳形保护二极管就可以有效防止不合理电压输入到针脚进而形成大电流导致击穿 MCU 内部元器件本质是一种保护电路四、GPIO 工作模式GPIO 主要负责 MCU 的输入和输出也就是 I/O 问题GPIO 的输入、输出拥有多种工作模式输出模式通用推挽输出通用开漏输出复用推挽输出复用开漏输出输入模式浮空输入上拉输入下拉输入模拟输入先暂时不论这些模式具体含义后面会逐一讲解先从宏观层面理解。✨为什么 GPIO 会有这么多 I‑O 模式GPIO 不止能够由 ARM‑CPU 直接控制输入输出还可供其余片上外设调用GPIO 属于共用资源。片上外设种类繁多、使用场景各不相同因此 GPIO 需要丰富的 I/O 功能适配各类外设。类比键盘只打游戏只需要 WASD 按键但是键盘还要用于打字、聊天因此按键数量很多适配全部场景。总结GPIO 具备多种 I/O 模式目的是满足各类片上外设、不同使用环境下的引脚需求。五、输出部分电路1. 输出部分电路输出模式下需要研究 GPIO 端口内部的输出硬件单元。输出部分包含输出数据寄存器、复用功能输出选择、输出驱动器、P‑MOS、N‑MOS 管最外侧为双向保护二极管。2. 四种输出模式输出一共四种模式通用推挽输出通用开漏输出复用推挽输出复用开漏输出推挽开漏通用通用推挽输出通用开漏输出复用复用推挽输出复用开漏输出通用由 ARM‑CPU 直接操控 GPIO 引脚输出电平。复用MCU 内部片上外设接管 GPIO 引脚外设利用引脚完成输入输出。3. 理解输出电路3.1 简化输出电路图输出寄存器为多位这里简化成单比特方便理解。复用器作用在多路输入信号当中选出一路作为有效输出信号。用途决定引脚控制权归属是 CPU 直接控制或是交给片上外设。输出控制接收控制电平驱动后端 MOS 管的栅极管控 MOS 管通断转换成具备驱动能力的引脚电平。3.2 P‑MOS 和 N‑MOS名词释义MOSMetal‑Oxide‑Semiconductor Field‑Effect Transistor金属氧化物半导体场效应管简写 MOSFET再简写MOS这个不用记P‑MOSP‑channel Metal‑Oxide‑SemiconductorP 沟道金属氧化物半导体这个不用记N‑MOSN‑channel Metal‑Oxide‑SemiconductorN 沟道金属氧化物半导体这个不用记Ppositive积极的正向的Nnegative消极的负面的反向的P‑MOS 和 N‑MOS 是本质是本质是一个开关。MOS 引脚定Ssource源极Source 意为 “源头”指这里是载流子电子或空穴的来源DDrain漏极Drain 意为 “漏出”指载流子最终从这里流出器件D 当做 Destination 看貌似也行但是 Destination 是目的地的意思MOS 管往往不是目的地而是一个电流路过的器件所以官方 Drain 更好一些。GGate栅极Gate 就是门的意思预示着开关的开启和关闭由它控制导通特性P‑MOS电流方向 S → DN‑MOS电流方向 D → SP‑MOS 适合传输高电平N‑MOS 适合传输低电平。栅极电平改变开关的开启、关闭。被控制电流方向从 Source 流向 Drain就是 P‑型 MOS 管被控制电流方向从 Drain 流向 Source就是 N‑型 MOS 管positive积极的正向的所以符合 S‑D顺势而为negative消极的负面的反向的所以符合 D‑S逆行行舟但是无论是从 S‑D还是从 D‑S电路必须是导通的上面的图默认都是没有导通的那么对于 P‑MOS 和 N‑MOS 管如何导通呢给 G 极施加一个小电流就可以导通。P‑MOS 导通过程施加电压的过程就是一个闭合开关的过程施加力的方向和红色箭头方向一致这个就是 positive积极的正向的也是顺势而为的所以叫做 P‑MOS 管。N‑MOS导通过程施加电压的过程就是一个闭合开关的过程施加力的方向和红色箭头方向相反与之对抗这个就是 negative消极的负面的反向的对抗趋势逆流而上所以叫做 N‑MOS 管。✨结论P‑MOS 和 N‑MOS 的本质是什么是一个开关为什么要有 P‑MOS 和 N‑MOS通过小电压通过控制开关的手段达到控制大电流的目的✨注意GPIO 输出电路图中上方是 P‑MOS下方是 N‑MOS两者 D 极相接P‑MOS S 极接 VDD (3.3V)N‑MOS S 极接地 (GND)3.3 再次简化输出电路图六、通用推挽输出(Push‑Pull Output)核心思想:交替闭合或者开启 P‑MOS 和 N‑MOS前期基础知识点P‑MOS 和 N‑MOS 的本质是什么是一个开关为什么要有 P‑MOS 和 N‑MOS通过小电压通过控制开关的手段达到控制大电流的目的注意:GPIO 输出电路图中上方是 P‑MOS , 下方是 N‑MOS两者 D 极相接 P‑MOS S 极接 VDD (3.3V) N‑MOS S 极接地 ( GND , 当成 0V 就可以)1. 输出高电平输出数据寄存器写 1闭合 P‑MOS断开 N‑MOS输出高电平2. 输出低电平输出数据寄存器写 0断开 P‑MOS闭合 N‑MOS输出低电平通用推挽输出的名称来源于该电路的工作原理使用一对互补的晶体管通常是 CMOS 工艺的 P‑MOS 和 N‑MOS 管来输出高电平(提供电流“推”)或 输出低电平吸收 / 拉取电流“挽”。本质是交替闭合断开P‑MOS 和 N‑MOS 开关让外部引脚接入 VDD 或者接地进而对外呈现出高电压和低电压然后因为电路通路形成有输出电流 (推) 和吸收 (挽) 电流的效果如果 P‑MOS 和 N‑MOS 都导通会是怎么的情况呢注意:VDD 就会和 GND (Vss) 接通这就会导致短路烧毁电路因此 “输出控制” 单元必须保证 2 个 MOS 管不能同时导通3. 推挽输出过程当 ARM‑CPU 执行用户的代码用户代码要求向数据寄存器写入 1ARM‑CPU 执行用户代码向数据寄存器写入 1复用器选择信号输入源是数据寄存器输出控制器获取到数字 1把数字 1 进行解释给 P‑MOS 管施加电压N‑MOS 什么都不做P‑MOS 感受到电压导通外部引脚接入 VDD对外输出高电平写 0 同上4. MOS 管导通条件了解到这里我们已经理解了推挽输出P‑MOS 和 N‑MOS 的作用和基本原理但是仍旧有一个问题那就是 G 栅极电压给多大就能开启开关。这里需要引入新的名词对任意 MOS 管而言 (P‑MOS/N‑MOS), MOS 管导通需要的电压阈值我们定义为 VthVoltage Threshold也叫做阈值电压这个电压一般范围是 0.3V~1.0V源极电压定义为 Vs栅极电压定义为 Vg对任意 MOS 管而言 (P‑MOS/N‑MOS),导通条件取决于 S 源极和 G 栅极的电压差是否超过 Vth和 D 漏极无关对于 P‑MOS 而言当 Vs‑VgVth 时MOS 管 SD 导通饱和否则 SD 断开截止对于 N‑MOS 而言当 Vg‑VsVth 时MOS 管 SD 导通饱和否则 SD 断开截止对于 MOS 而言开关速度非常高达到 ns 级推导出如下结论:对于 P‑MOSVs − Vg 电压差超过 Vth就导通对于 N‑MOSVg − Vs 电压差超过 Vth就导通5. 最终总结推挽模式下向输出寄存器写 1/0 的本质是让输出控制器选择 P‑MOS还是 N‑MOS进而输出电压打开指定 MOS 管。简易原理概括P‑MOS源极接电源 VDD栅‑源压差达标之后导通向引脚推出电流、输出高电平N‑MOS源极接 GND栅‑源压差达标之后导通把引脚电流拉入地、输出低电平硬件互锁保证两只 MOS 不会同时导通规避电源对地短路。七、通用开漏输出 (Open‑Drain Output)✨ 开漏输出核心思想去掉 P‑MOS让 P‑MOS 永远都关闭所以开漏模式下我们只考虑所以在开漏模式下MCU 针对特定引脚的输出都是该引脚对应的 N‑MOS 的漏极输出✨ 结论向输出数据寄存器写 1 最终表示的是 N‑MOS 断开向输出数据寄存器写 0 表示 N‑MOS 管闭合1. 输出低电平输出数据寄存器写 0 N‑MOS 闭合输出低电平2. 输出高阻抗输出数据寄存器写 1 N‑MOS 断开输出高阻态✨ 所谓高阻抗只是一种说法理解为 MCU 和外部针脚彻底断开相当于开路了或者 N‑MOS D 漏极和外部引脚互相悬空了对于针脚而言如果内部 MCU 断开了和外部引脚的连接可以把 MCU 认为成为一个阻值无穷大的设备我们把这种情况叫做输出高阻抗。✨ 结论开漏模式输出只能输出低电平和高阻抗无法输出高电平3. 开漏模式输出高电平通过以上原理分析可以知道开漏输出电路有输出低电平和开路高阻2 个状态。那如何才能输出高电平呢通过上拉电阻将 I/O 口接通到上拉的电压。因为 MCU 内部电路已经设计好所以往往这个所谓的上拉的电压必须是开发板设计者在 MCU 外部根据自己的需求设计的。✨注意单片机内部不是只有 MCU 内部有 VDD 供电其他 MCU 外部的设备或者 MCU 内部的其他设备也可能会有自己的供电电源提供高电压。这就好比你家 (单片机) 里有很多家用电器 (外设控制器和外设)不止电视要供电冰箱洗衣机也要的那么在开漏模式下要输出高电平就必须在引脚位置设置上拉电阻来提供高电压了。新增上拉电阻之后输出数据寄存器写 0N‑MOS 闭合输低电平图略输出数据寄存器写 1N‑MOS 断开输出高阻抗外部引脚在外部上拉电阻的影响 (或者上拉) 下输出高电平4. 为什么开漏输出高阻抗之后引脚就是高电平为了方便解释为上图中的相关电阻进行命名上拉电阻的阻值是 R_PULL引脚阻值是 R1其实引脚就是导线这个 R1 是无限趋近于 0Ω 的后续我们不需要研究它这里进行命名只是为了表示方便开路位置电阻命名为 R2 , 阻值无穷大是时候引入我们高中学过的知识了欧姆定律 V I * R。因为整个电路通路从 VDD 到 GND整个电路的电流 I 3.3V / (R_PULL R1 R2) , 因为 R2 接近于无穷大所以 I ≈ 0而引脚位置的电压 V 引脚 3.3V − 上拉电阻处的承压 3.3V − I * R_PULL因为 I≈0所以 V 引脚 3.3V − I * R_PULL 3.3V − 0 * R_PULL 3.3V所以引脚处电压就是 3.3V那么输出就是高电平OK啊所以我们现在回答了为什么开漏输出高阻抗之后引脚就是高电平可是上面的推断我们真的理解了吗当然也不知道具体哪里不清楚反正就是感觉不透彻。那么接下来让我提出并解决一些问题看看能不能透彻的理解。我们把视角转到这张图✨ 奇怪的问题真实情况是开路了开路就没有电流啊即电流 I0根据欧姆定律 V I * R那么整个电路结构中都没有电压包括引脚处这点很明显和上面的结论是冲突的啊问题出在哪里呢一块裸的电池没有接入到任何电路中其实就是自身开路正极有电压吗答案是当然有电压的本质是两端 (正负等) 电势差开路情况也可能存在就好像水龙头不打开也有水压一样其实开漏输出下高阻抗输出对应的开路下引脚处是有电压的。上述问题其实是出在对于欧姆定律的理解有偏差上欧姆定律可以用来计算整个电路回路的电流但是计算的电压并不是电路中某个设备 (电阻) 处的电压绝对值而是这个设备在整个电路中承担的电压差有了上面对欧姆定律的深刻理解然后我们再回过头看这张图我们就能理解为什么引脚 (就是导线) 处的电压V 引脚 3.3V − I * R_PULL 3.3V − 0 * R_PULL 3.3V5. 为什么要上拉电阻开漏输出不仅仅要考虑 N‑MOS 断开输出高阻抗的问题电路设计上还要考虑 N‑MOS 闭合接地的情况如果没有上拉电阻设置上拉电阻6. 为什么叫上拉电阻⭐ 在开漏输出模式并且有外部上拉电阻的情况下如果 N‑MOS 管断开MCU 输出高阻抗那么引脚输出的就是外部上拉电压 3.3V输出高电平如果 N‑MOS 管闭合外部引脚接地输出低电平在开漏模式MCU 默认只能输出低电平和高阻抗所以外部接入电阻 高电压在保证电路安全的情况下就可以成功让开漏模式输出高低电平了而输出高电平是被外部电阻 高电压拉起来的我们把这个电阻就叫做上拉电阻。上拉电阻的阻值一般多少合适 4.7kΩ10kΩ这个不做解释八、复用推挽输出理解了通用推挽输出复用推挽输出自然也就懂了只不过是从CPU的输出变成了其他片上外设的输出。九、复用开漏输出理解了通用开漏输出复用开漏输出自然也就懂了只不过是从CPU的输出变成了其他片上外设的输出。