【STM32实践篇】:GPIO 详解
文章目录
- GPIO 基本结构
- GPIO 工作模式
GPIO 基本结构
右边的红框是I/O引脚,这个I/O引脚就是我们可以看到的芯片实物的引脚,其他部分都是GPIO的内部结构。
-
保护二极管
- 上方二极管用于防过压保护,当I/O引脚电压高于 V_DD + 二极管导通压降时,电流从I/O引脚流向V_DD电源,将I/O引脚电压钳位在 V_DD + 0.7V。
- 下方二极管用于防负压保护,当I/O引脚电压低于 V_SS - 二极管导通压降时,电流从V_SS流向I/O引脚,将I/O引脚电压钳位在 V_SS - 0.7V。
-
上拉、下拉电阻
上拉和下拉电阻最根本的作用是确保I/O引脚在未被主动驱动(高阻态)时,有一个确定的逻辑电平,避免引脚“悬空”导致的信号不稳定或误触发。- 上拉电阻 Pull-up Resistor:当I/O引脚未被外部电路或内部驱动主动拉低时,上拉电阻将引脚电位“拉”向V_DD,使其稳定在高电平,也就是逻辑‘1’。
- 下拉电阻 Pull-down Resistor:当I/O引脚未被外部电路或内部驱动主动拉高时,下拉电阻将引脚电位“拉”向V_SS/GND,使其稳定在低电平,也就是逻辑‘0’。
-
施密特触发器
- 施密特触发器有一个正阈值电压V+ 和一个负阈值电压V-,且 V+ > V-。只有当输入电压超过较高的V+时,输出才从低电平跳变为高电平;同样,只有当输入电压低于较低的V-时,输出才从高电平跳变为低电平,当输入电压处于 V- 和 V+ 之间 时,施密特触发器的输出保持之前的状态不变。
- 看一张图理解比较器的(A)和施密特触发器(B)的差异:
施密特触发器的 V+ 和 V- 之间的区域被称为 滞回电压,在 V- < U < V+ 这个区域内,输出保持其之前的状态不变!它不会像比较器一样瞬间产生高低电平的变化,这样就形成了一个 噪声免疫区,只要噪声的幅度小于这个滞回电压,并且输入信号本身的变化趋势足够强能越过V+或V-,短暂的噪声干扰不会导致输出发生翻转,这就是施密特触发器相比普通比较器的核心优势。
-
P-MOS和N-MOS
驱动输出电平(高电平 1 或低电平 0)并承受外部负载。- P-MOS:当其栅极接收到一个相对源极为低电平的控制信号时导通,此时它在 V_DD 和输出引脚之间建立了一个低阻通路,电流从 V_DD 流经导通的P-MOS管,流入输出引脚,这会将输出引脚的电平拉高至接近 V_DD 的电压,向外部电路提供一个稳定的高电平1, 同时能够为连接在输出引脚到 V_SS/GND 的外部负载提供电流,确保外部能识别到高电平。
- N-MOS:当其栅极接收到一个相对源极为高电平的控制信号时导通,此时它在输出引脚和 V_SS/GND 之间建立了一个低阻通路,电流从输出引脚流经导通的 N-MOS 管,流入 V_SS/GND,这会将输出引脚的电平拉低至接近 V_SS/GND 的电压,向外部电路提供一个稳定的低电平0,能够为连接在 V_DD 到输出引脚的外部负载提供电流通路,确保外部能识别到低电平。
GPIO 工作模式
-
输入浮空模式
- 在该模式下,上拉电阻 (Pull-up) 和 下拉电阻 (Pull-down) 的控制开关被断开,输出缓冲器被关闭,这意味着引脚本身几乎没有驱动能力,对外部电路的影响极小,引脚的电压完全由外部连接的电路决定。
- 工作原理:外部信号通过引脚进入,经过保护二极管后,信号直接进入TTL施密特触发器,施密特触发器对输入信号进行整形,将缓慢变化的信号或带有噪声的信号整形成干净的高低电平信号,整形后的数字电平信号被锁存到输入数据寄存器中。
-
输入上拉模式
- 输入上拉模式主要用于将悬空的 GPIO 引脚稳定地拉到一个确定的高电平状态。
- 工作原理:
- 无外部输入时:开启的上拉电阻会将引脚拉至高电平,经过施密特触发器后,读输入数据寄存器该位将得到逻辑1。
- 有外部输入时:
- 当外部电路将引脚下拉至低电平时:外部下拉力量克服了上拉电阻的上拉作用,将引脚拉到 VT- 以下,经过施密特触发器后,读输入数据寄存器该位将得到逻辑0。
- 当外部电路将引脚驱动至高电平时:由于外部信号源阻抗通常远小于上拉电阻,引脚电压会被外部源拉至高电平,读输入数据寄存器该位将得到逻辑1。
- 如果外部信号源是高阻态输出,该信号源本身不会驱动引脚电平,此时,内部上拉电阻起作用,将引脚拉到高电平。
-
输入下拉模式
- 当外部没有连接任何信号源或者外部信号源处于高阻态(Hi-Z)时,通过内置电阻将引脚电压下拉到一个明确的低电平。
- 工作原理:
- 外部信号为低电平时,“战胜”了内部下拉电阻的微弱下拉能力,引脚被拉低到 VSS。
- 外部信号为高电平时,外部的高电平强于内部下拉电阻的拉低作用,引脚的实际电平被外部信号拉高到接近VDD。
-
模拟功能
- 当GPIO用于模拟功能时,必须完全断开其数字电路部分,其中输出缓冲器被禁止,施密特触发器输入停用(施密特触发器的输出被 强制处理为恒定值0),弱上拉和下拉电阻被关闭,对输入数据寄存器的读访问值为0。
- 当用作模拟输入时(如连接至ADC),外部模拟信号通过I/O引脚进入芯片。
- 当用作模拟输出时(如连接至DAC),片上模拟外设(如DAC)产生的模拟信号通过该路径输出到I/O引脚。
-
开漏输出和推挽输出
对 I/O 端口进行编程作为输出时,输出缓冲器被打开,可以被设置为如下两种模式:- 开漏模式:输出寄存器中的“0”可激活 N-MOS,引脚通过导通的N-MOS管拉低到VSS输出低电平;而输出寄存器中的“1”会使端 口保持高组态 (Hi-Z)(P-MOS 始终不激活)。
- 推挽输出:输出寄存器中的“0”可激活 N-MOS,引脚通过导通的N-MOS管拉低到VSS输出低电平;而输出寄存器中的“1”可激活 P-MOS,引脚通过导通的P-MOS管拉高到VDD输出高电平。
- 施密特触发器输入被打开,可以读取输入数据寄存器(IDR)来获取引脚实际的电平状态。
-
复用功能
- 复用功能模式 (AF Mode) 就是让GPIO引脚不再作为普通的输入/输出口,而是将引脚的控制权“交”给某个内置的外设模块,如USART,TIM, I2C,SPI等。
- 引脚输出的信号不再由写入GPIO的输出数据寄存器(ODR)决定,而是由所选外设模块内部产生的信号直接驱动。
- 引脚输入的信号不再只被通过GPIO的输入数据寄存器(IDR)读取,而是会同时被连接到所选外设模块的接收端。