GPIO(General Purpose Input/Output)这玩意儿,说白了就是给单片机或微管住器发一条“请把我的脚伸进我身体里来”的指令。

那会儿只有电,目前有了 GPIO,电不仅能进,还能被拿出来,还能被调成电压高低,就连还能被弟弟管住开关。别拿它当老古董看,它在电脑、手机、各种智能设备里跑得比快马还快,是个好用得要命的东西。 这一大堆功能,实际上就概括成了三个字:看、听、动。

看是读电压高低,听是飞线连接开关,动是转引脚方向。对于工程师,这“三脚toolbox"(工具箱)比整个实验室都管用。你知道如何让 LED 亮吗?这得靠 GPIO 读写电流动压。

比如单片机引脚不通电,LED 肯定灭;引脚通了电,电压够高,LED 就得亮。

要是电压不够,它可能不亮;要是电压忒高,直接烧坏了。

这就是 GPIO 在发光、在点亮,在管住光。 再来看看听。单片机自己不会变声器啊,那得飞线,飞线直接连空调遥控器开关,要么电视音量旋钮。遥控器按键按下,GPIO 电压变高,LED 灯就闪一下;按下没反应,GPIO 电压不变,灯就亮着。

这就是 GPIO 在听,在接收指令。手机上听听机里的麦克风、听筒,都是靠 GPIO 把声音信号转成电信号,再转回声音。就连在一些老式收音机里,出于电路忒复杂,没法直接飞线,就得靠 GPIO 程序来模拟这个信号,让耳机能收到声音。

这就是 GPIO 在听,在接收声音。 至于动,那更好办粗暴。转红绿灯,就是 GPIO 管住信号变化,让灯跟着走。

这是个老例子了,那会儿不是有转页吗?目前还是 GPIO 在管住。

么是管住风扇,风扇转不转,就是看 GPIO 引脚有没有电压。

比如家里空调,按下开关,GPIO 电压涨上去,风扇就转起来;松手,电压降下来,风扇就停。

这也就是 GPIO 在动,在管住机械运动。 别看功能如此多,但真正让 GPIO 闪耀的,往往是它那种“拿来主义”的灵活。

比如在做一个智能家居项目时,你可能只需求几根线就搞定个灯泡管住。

要么你在玩编程游戏,想让乌龟到处跑,那也是用 GPIO 驱动电机。就连在一些老式 Fischer 303 用的嵌入式板上,有些开发者为了省事,直接把 GPIO 和继电器、晶振、蜂鸣器直接连在了一起,不用花啥复杂的软件运算,只要电压对了,设备就干活了。

这种“见好就收”的做法,有时候比写一堆复杂的代码更管用。 有人可能会认定,GPIO 不就是就是好办的电压高低吗?实际上不然,它上面的坑比海底还深。最典型的坑就是电平难题。假设你的单片机是 3.3V 的,但那个 GPIO 引脚接的 LED 是 5V 的,万一反过来接,后果不堪设想。

这就好比你要跨坐一辆脚踏车,但轮子高度不一样,直接坐上去腿得废掉。

还有,有没有标准?说实话,那会儿并没有像 USB 那样统一的 GPIO 标准。

不同的芯片,就连同一块芯片的不同型号,引脚定义、功能都不一样。有的引脚是输入,有的引脚是输出;有的只能输入,有的只能输出;有的就连没有,你连接线都没法用。

这就害得了大量老项目,明明写了代码,结局一烧就断。

这就是 GPIO 在坑,在让人头疼。 为了规避这些坑,大家实际上挺智慧。大量工程师都在搞“硬接线”。就是不管代码如何写,直接焊上一根线,电压一涨,灯就亮;电压一跌,灯就灭。

这样逻辑好办,不好办出错。

特别是在做继电器管住的时候,硬接线是标配。别看目前有了编程,但硬接线在某些场景下还是稳得一批。

比如你要管住一个大功率设备,万一电平不对烧了单片机,那就更费事了。硬接线别看看着费事点,但起码能保命。 再说说数据。光说功能不够,还得给点数据看看。

比如今天有个工程,用 1000 个 GPIO 管住 50 个 LED 灯。总共 50 个灯,每个灯都能亮或灭,总共就是 50 个状态,也就是 50 条记录。每条记录里,GPIO 1 是 3.3V,GPIO 2 是 3.3V,GPIO 3 是 0V,其他都是 3.3V。

这样写出来,一根线连一个继电器,一根线连一个 LED。

这是最好办、最直接的接线法。

要是把这个灯串延长一倍,变成 200 个灯,那就要 200 个 GPIO 引脚了。

这时候硬接线就变智慧了,就用开关管住 GPIO,再管住继电器。

比如灯坏了,用开关把第 1 个 GPIO 拉到 0V,灯就灭;第 2 个 GPIO 拉到 3.3V,灯就亮。

这样只需求 2 根线,一根开关线,一根继电器线,搞定两半灯。

这就是 GPIO 在变智慧,在变数据。 还有人说,GPIO 就是用来连接外部设备的。

实际上不然。它更多是用来连接内部元件的。

比如把两个引脚连起来,就是一个开关;把三个引脚连起来,就是一个三极管。就连有时候,GPIO 本身就是一个开关。

比如用两个 GPIO 管住一个继电器。当 GPIO 电压为高时,继电器吸合;电压为低时,继电器释放。

这种用法,GPIO 不仅连接了设备,还连接了电路动作的逻辑。 说到数据,我们还得再细说点。数据不只是指 GPIO 涨了多少伏特。数据还指 GPIO 连了个啥东西,比如连了个电阻,连了个电容,连了个模拟电压芯片。

比如用 LM35 这个温度传感器,它的输出是 1 到 35 的模拟电压。你不用把它接成电压表,你就直接接在 GPIO 输入引脚上。

只要程序设定好,就能知道温度是多少摄氏度,然后管住风扇转得快还是慢,要么管住灯光闪烁的频率。

这就是 GPIO 在拿数据,在计算温度。 有时候,GPIO 不仅干信号处理,还干数据处理。

比如在一个程序中,你读到一个温度,然后判断“要是温度高于 30,那就把风扇转得快”。

这中间的逻辑判断,也是 GPIO 在参与。别看严格来说这是程序在判断,但 GPIO 供给了那个关键的输入动作。就像你给电脑输入文字,电脑才能处理,但电脑内部的硬件单元务必先把信号传那会儿,才能搞定处理。GPIO 就是那个把外界信号传进 CPU 的“快递小哥”。 再讲讲那个常见的例子,比如单片机里的 20 个 GPIO 脚。

要是你要做一个自动浇水系统,你有 20 个水龙头要管住。每个水龙头对应一个 GPIO。你不需求在程序里写 20 行代码,你就直接连 20 根线。有些水龙头是常开的,直接连在 3.3V 上;有些水龙头是手动管住的,需求一个开关,那个开关接在 GPIO 上。

要么有些水龙头是自动的,用一个定时器管住的 GPIO。

这种硬接线,看着像个“费事”,实际上是个“高效”。出于它省去了编程的繁琐,直接让硬件干活。 还有人说,GPIO 不能做数模转换。

实际上它也能。

比如把电压转成数字信号(D/A),要么把数字信号转成电压(A/D)。

比如在做一个数字温度计时,单片机输出温度值给 ADC 芯片,ADC 芯片算出实际温度,再驱动 LED 显示温度。

这个转换过程里,GPIO 负责给 ADC 送数据,ADC 负责把数据算出来。GPIO 在这里是数据传输的中间站,负责把“我告诉你的数字”变成“机器能读懂的电压”。 最终说个例子。假设你要做一个好办的电机调速器。电机电源接在 12V 上,单片机接在 5V。你需求把 12V 变成 5V 才能给电机供电。

这个转换要用一个三极管。

你想用 GPIO 来管住它吗?你有两个选择。 第一,硬接线。

不用编程,就把三极管的基极 GPIO 直接连到 12V 端,发射极连到电机,集电极接其他地方。

只要单片机电压涨,三极管导通,电机就转。

这在硬件上一步到位。 第二,编程管住。用 GPIO 连接三极管的基极。

比如用减速带继电器管住。当 GPIO 电压为高时,继电器吸合,三极管导通,电机转;当 GPIO 电压为低时,继电器释放,三极管截止,电机停。

这需求一个中间继电器,要么一个开关。

比如你需求手动开关,用开关管住 GPIO;你需求自动调速,用另一个开关管住 GPIO,再管住继电器。

这样,电机速度就能够通过转变开关状态来调节了。 不管是第一季还是第三季,GPIO 都在起功能。它把电压变成了信号,把信号变成了动作,把动作变成了数据。别看它功能单一,但用处千奇百怪。从最原始的 LED 管住,到目前的智能家居,从老式收音机,到复杂的工业管住,GPIO 一直是那个不可或缺的“手脚”。 大家看,GPIO 确实就那么好办?不,它里面藏着大量门道,大量坑,大量逻辑。但它就是那个最基础、最通用的工具。当你需求管住一个东西的时候,要是它只要求你转变电压高低,那就用 GPIO。

要是它要求你转变方向、速度、频率,那可能就要看它能不能直接管住,要么需求几个 GPIO 配合。

不管哪种情况,GPIO 都是那个最底层的开关,是所有自动化设备的“父辈”。 故此,别再把它当成啥啥“高级功能”要么“标准接口”了。它就是 GPIO,它是个硬件接口,是个信号线,是个开关。它负责把世界的物理信号,翻译成电脑的指令,再转回去变成物理动作。

这就是 GPIO 的全体。