1.GPIO是什么?
字面意思就是通用输入输出,是一个MCU内部,用来做输入输出的控制器电路;
2.GPIO初步理解
本质就是输入输出高低电平(模拟信号),达到获取外设信息,控制外设的⽬的。
“通⽤”,意思就是⼀个东西被发明出来,就是未来给“⼤家”⽤的。这里的大家指的是MCU内部的其他片上外设,我们把其他片上外设使用GPIO这个来输出高低电平或者模拟信号这样一种工作就叫复用GPIO。
3.GPIO 引脚与IO
MCU 上⾯的引脚,通常会外接各种外设,⽐如:LED灯、按键,蜂鸣器, EEROM 等,⽽未来MCU 内部会有对应的输⼊输出寄存器,向对应的寄存器写或者读取对应的寄 存器,就可以从引脚中输出⾼低电平,或者获取引脚⾼低电平。
输⼊(Input):⽐如外接“按钮”, MCU 主要通过感知外部世界的状态变化,⽐如:按键是否被按 下?某个信号是⾼电平还是低电平?来获取外部信息。
按键不摁下,针脚接⼊ VDD ,GPIO 就会获取到⾼电平
当按键摁下,针脚接⼊ GND/VSS ,GPIO 就会获取到低电平
输出(Output):⽐如外接发光⼆极管(LED)。 鸣器响?控制继电器通断?)
GPIO 输出低电平, VDD 反向导通,⼩灯泡点亮
GPIO 输出⾼电平,⼩灯泡左右电压⼀致,没有定压差,就没有电流,⼩灯泡熄灭
注意:
GPIO 不⼀定输出⾼电平,就会“有效”,⽐如输出⾼电平,⽆法点亮⼩灯泡⼀样。
MCU 芯⽚上的这些GPIO 管脚⼜是怎么和外围器件产⽣关联的呢?
MCU 上⾯的引脚,通常会外接各种外设,⽐如:LED灯、按键,蜂鸣器, EEROM 等 MCU 内部会有对应的输⼊输出寄存器,向对应的寄存器写或者读取对应的寄 存器,就可以从引脚中输出⾼低电平,或者获取引脚⾼低电平。
pin:就是引脚的意思;
port:端口的意思,在计算机科学中引申为“数据交换的 ⼊⼝或出⼝”,现代微控制器(如 STM32 )继承了这⼀概念,将⼀组GPIO 引脚称为“GPIO PORT ”(如GPIOA 、 GPIOB ),因为它们本质上是芯⽚与外部世界的“数据交换接⼝”。
GPIO Pin一个硬件电路的位置
上I下O
4.GPIO工作模式
GPIO 主要是负责 MCU 的输⼊和输出,即 I/O 问题,⽽ GPIO 输⼊和输出,会存在很多的⼯作模 式。
输出:
通⽤推挽输出
通⽤开漏输出
复⽤推挽输出
复⽤开漏输出
输入:
浮空输⼊
上拉输⼊
下拉输⼊
模拟输⼊
GPIO 不仅仅给ARM-CPU 直接做输⼊输出,也会被其他⽚上外设使⽤,换句话说, GPIO 是"⼤家的",满足不同片上外设在不同场景下的IO需求,所以有八种工作模式。
通⽤与复⽤是什么意思?
所谓通⽤,就是通常使⽤,指的是由ARM-CPU 直接控制 GPIO 输出
所谓复⽤,复⽤的意思就重复使⽤,指的就是MCU 内部的⽚上外设,复⽤GPIO进⾏输⼊输出
简化成:
输出角度:GPIO输出电路中,包含输出数据寄存器,未来被arm-cpu进行写入的,从而实现控制pin输出高低电平的目的。
复用器:多组输入信号中,选择一个作为有效输入;GPIO到底是被ARM-CPU直接使⽤,还是被其他⽚上外设使⽤,达到复⽤效果,就由它说了算
P-MOS:从S到D
N-MOS:从D到S
P-MOS和N-MOS本质就是一个开关,通过小电压,通过控制开关的手段,达到控制大电流的目的。
GPIO 输出电路图中,上⽅是 P-MOS ,下⽅是 N-MOS
两者 D 极相接,P-MOS S 极接 VDD(3.3V) ,N-MOS S 极接地(GND ,当成 0V 就可以)
再次简化
通⽤推挽输出(Push-PullOutput):
交替闭合或者开启 P-MOS 和 N-MOS 即可;
输出数据寄存器写1,闭合 P-MOS ,断开 N-MOS ,输出⾼电平
输出数据寄存器写0,断开 P-MOS ,闭合 N-MOS ,输出低电平
推挽模式:输出寄存器上的 0 激活 N-MOS, 而输出寄存器上的 1 将激活 P-MOS 。
使⽤⼀对互补的晶体管(通常是 CMOS ⼯艺的 P-MOS 和 N-MOS 管)来输出⾼电平 (提供电流,“推”)或 输出低电平(吸收/拉取电流,“挽”)。
本质是交替闭合断开, P-MOS 和 N-MOS 开关,让外部引脚接⼊ VDD 或者接地,进 ⽽对外呈现出⾼电压和低电压,然后因为电路通路,形成有输出电流(推)和吸收(挽)电 流的效果
推挽模式下,向输出寄存器写 输出电压,打开指定 1/0 的本质:是让输出控制器选择 P-MOS ,还是 N-MOS ,进⽽ MOS 管.
通⽤开漏输出(Open-DrainOutput)
去掉 P-MOS ,让 P-MOS 永远都关闭,只使用N-MOS
在开漏模式下, MCU 针对特定引脚的输出,都是该引脚对应的 N-MOS 的漏极输出
向输出数据寄存器写 1 ,最终表⽰的是 N-MOS 断开
向输出数据寄存器写 0 ,表⽰ N-MOS 管闭合
输出数据寄存器写0, N-MOS 闭合,输低电平
输出数据寄存器写1, N-MOS 断开,输出⾼阻抗
所谓⾼阻抗,只是⼀种说法,真实情况其实是MCU和外部针脚彻底断开,相当于开路了,或 者 N-MOS D 漏极和外部引脚互相悬空了
对于针脚⽽⾔,如果内部 MCU 断开了和外部引脚的连接,可以把 MCU 认为成为⼀个阻值⽆穷⼤的设备,我们把这种情况,叫做输出⾼阻抗
开漏模式,输出只能输出低电平和⾼阻抗,⽆法输出⾼电平
开漏输出:
开漏输出全称叫做漏极开路输出;
没有了 P-MOS ,那么 N-MOS 的D 漏极 ,就相当于什么都没有接!所以叫做漏极开路,简称开漏
不要把引脚当做设备,引脚当做 D 漏极线的延伸;
推挽输出下,P-MOS 和 N-MOS 互为彼此D漏极接⼊的设备,不属于开漏
因此可以知道:开漏输出电路有输出低电平和开路(⾼阻)2个状态。那如何才能输出 ⾼电平呢?
通过上拉电阻将 I/O ⼝接通到上拉的电压。因为 拉的电压,必须是开发板设计者,在 MCU 内部电路已经设计好,所以往往这个所谓的上 MCU 外部,根据⾃⼰的需求设计的。
注意:
单⽚机内部,不是只有 MCU 内部有 VDD 供电,其他MCU 外部的设备,或者 MCU 内部的其他设备,也可能会有⾃⼰的供电源提供⾼电压。比如:你家(单⽚机)⾥有很多家⽤电器(外设控制器和外设),不⽌电视要供电,冰箱洗⾐机也要的
那么,在开漏模式下,要输出⾼电平,就必须在引脚位置设置上拉电阻,来提供⾼电压了。
新增上拉电阻之后:
输出数据寄存器写 0 , N-MOS 闭合,输低电平,图略
输出数据寄存器写 1 , N-MOS 断开,输出⾼阻抗,外部引脚在外部上拉电阻的影响(或者上拉) 下,输出⾼电平
开漏输出⾼阻抗之后,引脚就是⾼电平:
⼀个电路回路中,电压会被各个元器件承接,电阻值越⾼,承压越⾼