GPIO(也称为通用输入/输出)是控制器中最简单也是最重要的配置。但即便如此,IO也有各种各样的类型和配置选项,有输入,输出,上拉,下拉,推挽等。虽然我们天天都和它打交道,但是你真的了解其中的配置吗?
输入模式
通常,GPIO输入主要通过以下三种方式之一进行配置:
● 高阻抗 (Hi-Z,也称为浮动floating)
● 上拉 (Pull-up,内部电阻连接到VCC)
● 下拉 (Pull-down,内部电阻连接到地)
当Input port被处在高阻抗的模式下,若没有外部讯号源进来的话,此时是无法确定port的状态(不能确定现在处在高电位或低电位),除非有外部讯号来驱动电路。换句话说,Input floating,这个Input电位状态完全是由外部讯号来决定,没有讯号驱动的话,就会呈现高阻抗状态。
如果我们需要这个port有一个明确的预设状态时,必须借助pull-up(pull-down)resistor来做调整,在pull-up resistor(pull-up外接高电压,pull-down通常会接地)的作用之下,让port的维持在明确的高电压状态(pull-down则是让port维持在低电压状态)。
至于具体电阻的大小,一般在芯片手册中都有详细的描述。在实际配置中,除了要考虑port口内的上下拉电阻大小,还需要考虑MCU外围电路所带来的影响。
输出模式
GPIO的输出模式,常见的有开漏输出(Open-Drain)、推挽输出(Push-Pull)与开集输出(Open-Collector)。其中开漏输出和开集输出,这两种输出的原理和特性基本是类似的,区别在于一个是使用MOS管,其中的"漏"指的就是MOS管的漏极;另一个使用三极管,其中的"集"指的就是三极管的集电极。这两者其实都是和推挽输出相对应的输出模式,由于使用MOS管的情况较多,很多时候就用"开漏输出"这个词代替了开漏输出和开集输出。
● 推挽输出:一般是指两个MOSFET分别受两互补信号的控制,总是在一个MOS管导通时另一个MOS管截止。(推挽输出的最大特点是可以真正的输出高电平和低电平,且两种电平下都有驱动能力)。
Push - 当连接到晶体管栅极的内部信号(见上图)设置为低逻辑电平(逻辑0)时,PMOS晶体管被激活,电流从VDD流到输出引脚。NMOS晶体管无效(开路)且不导通。
Pull - 当连接到晶体管栅极的内部信号被设置为高逻辑电平(逻辑1)时,NMOS晶体管被激活(闭合)并且电流开始从输出引脚流到GND。同时,PMOS晶体管无效(开路)且不导通电流。看起来推挽输出十分完美,对高低电平都有相当不错的输出能力。但推挽输出的一个缺点是,如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害。这也是为什么推挽输出不能实现" 线与"的原因。
● 开漏输出:顾名思义,就是从MOSFET的漏极输出的电路,要得到高电平状态需要加上拉电阻才行。适合做电流型的驱动,其吸收电流的能力比较强(开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平)。
开漏输出的这一特性一个明显的优势就是可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。
开漏输出最常用于通信接口,其中多个器件连接在同一线路上(例如I2C等)。当连接到线路的器件的所有输出都处于Hi-Z状态时,通过上拉将线路驱动到默认逻辑1电平。任何器件都可以使用其开漏输出将线路拉至逻辑0,并且所有器件都可以看到此电平。
1.浮空输入_IN_FLOATING
浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果该引脚在悬空状态下,读取该端口的电平状态是不确定的。
2.上拉输入_IPU
在浮空输入的基础上加了上拉电阻,防止输入端悬空,减少外部电流对芯片的干扰,默认状态为高电平。
3.下拉输入_IPD
在浮空输入的基础上加了下拉电阻,防止输入端悬空,减少外部电流对芯片的干扰,默认状态为低电平。
4.模拟输入_AIN
模拟输入状态下,信号直接进入AD采集寄存器,从输入数据寄存器是读不到电平变化的。
5.开漏输出_OUT_OD
CPU在编号1处写入数据,如果写入的是逻辑1,则编号3的N-MOS管处于关闭状态,端口输出的电平由外部上拉电阻决定;如果写入的是逻辑0,则编号3的N-MOS管处于开启状态,编号3的电平被拉到了零电平。
在输入部分,施密特触发器处于开启状态,可以通过输入数据寄存器监控IO端口的输出状态,根据这个特性,可以实现虚拟IO端口的双向通信。
芯片内部输出部分有多个响应速度不同的驱动电路可以选择,有2MHz、10MHz、50MHz;通过选择不同速度的驱动电路,达到噪声控制和降低功耗的目的,高频驱动噪声高,低频驱动信号易失真。
适合电流型驱动,电流20mA以内。
6.推挽输出_OUT_PP
推挽输出在开漏输出的基础上加了P-MOS管,当输出逻辑1时,编号3处P-MOS管导通,N-MOS管截止,达到输出高电平,当输出0时,编号3处P-MOS管截止,N-MOS管截止,达到输出低电平。
该模式下也可在输入寄存器读到端口电压变化信号。
7.开漏复用输出_AF_OD
开漏复用输出和开漏输出基本一样,只是在数据的输入源不是输出数据寄存器,而是来自其他地方。
8.推挽复用输出_AF_PP
推挽复用输出和推挽输出区别就是输出的数据不是来自输出数据寄存器,而是来自其他外设,如果外设未被配置激活,则IO端口的输出信号无法确定。
#define LED9 (0x01 <<25)//此句将LED9定义为一个宏,在编译预处理阶段,编译器会将出现LED9的地方直接替换成(0x01 <<25)。
FIO3DIR=LED9//FIO3DIR为arm芯片的IO(F代表快速IO)方向(direction)寄存器,就是用来配置输出的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)