
你有没有想过一个问题:当你用GPIO去读取外部电路的电平时,你的读取行为本身,会不会改变那个电平?**会的。**每一个测量动作,都会影响被测量对象。这就是物理世界的"测不准原理"。而GPIO的"高阻态",就是为了把这个影响降到最低。
那个"偷电流"的输入(对应教程3.11节), GPIO输入引脚,本质上是一个电压检测器 。它检测引脚上的电压是高还是低。但检测本身需要电流------电流会从外部电路流入引脚,或者从引脚流出到外部电路。如果输入阻抗不够高,这个电流就会分压 ,改变外部电路的电压。你测到的电压,已经不是原来的电压了。你影响了它,然后以为测到了真实值。
那个"1MΩ"的内阻, 一个理想的电压表,内阻应该是无穷大 。这样,它不会从被测电路吸取任何电流,不会改变被测点的电压。GPIO的输入模式,追求的就是"内阻无穷大"。实际能做到多大?CMOS工艺的输入引脚,内阻可以做到1MΩ以上 ,甚至几十MΩ。这就是"高阻态"的含义------高阻抗状态。阻抗高,电流小,对被测电路的影响可以忽略不计。

那个"浮空"的危险(对应教程3.11节), 高阻态有个副作用:引脚容易受干扰。 因为阻抗太高,引脚上的电荷无处泄放。空间中的电磁波、手指触摸、附近导线的电场变化,都会在引脚上感应出电压。这个电压不是0,也不是VCC,而是随机的、不确定的 。这就是"浮空"引脚。它的电平,不是你想的那样,是环境决定的。 教程中强调:永远不要让引脚浮空。
那个"上拉/下拉"的补救(对应教程3.11节), 怎么解决浮空问题?给引脚一个确定的电平 。要么接一个电阻到VCC(上拉),要么接一个电阻到地(下拉)。这样,当外部电路没有驱动引脚时,它有一个确定的默认电平。电阻不能太小,否则会消耗太多电流,影响外部电路。通常用10kΩ到100kΩ。这就是"上拉输入"和"下拉输入"模式的由来。
那个"内部上拉"的体贴, 芯片设计者知道,用户可能忘记加外部上拉电阻。所以,他们在芯片内部集成了可编程上拉/下拉电阻。你只需要配置寄存器,就能把内部电阻接通。
GPIOA->CRL &= ~(0x0F << 0); // 清除PA0配置
GPIOA->CRL |= (0x08 << 0); // 上拉/下拉输入模式
GPIOA->ODR |= (1 << 0); // 启用上拉

不需要外部元件,引脚也有确定的电平。那个"天线"效应 ,如果引脚浮空,它就像一根天线 。空间的电磁干扰,会被它接收,在引脚上产生几十到几百毫伏的噪声。如果这个引脚接的是高阻抗的输入,噪声可能被放大,导致逻辑错误。这就是为什么,不用的引脚,也要配置成上拉输入或下拉输入,不能浮空。 教程中警告:浮空的引脚,是死神接管的领地。
这个故事的启示, 为什么GPIO输入要高阻?因为不打扰,是最好的测量。 你测电压,但不能改变电压。你读信号,但不能影响信号。这就是"测量者的道德"。高阻态,就是GPIO对被测电路的"尊重"。它不偷电流,不改变电平,只是静静地"看"。
写在最后, 下次你再配置GPIO输入,别只想着"读电平"。想想那个叫"高阻态"的东西。它让引脚"轻如鸿毛",不影响外部电路。它也让引脚"弱不禁风",容易被干扰。所以,你要给它一个"依靠"------上拉或下拉电阻。让它在没人管的时候,也知道该做什么。

(本文灵感源于于振南《新概念ARM32单片机》教程第3.11节"GPIO输入高阻态与按键消抖",感谢作者将测量哲学讲得如此通透。)
如果您觉得这个故事对您有启发,欢迎点赞、转发,让更多工程师看到这个藏在"不打扰"背后的高阻态智慧。
