GPIO
GPIO,即通用输入输出端口,是 MCU 必不可少的外设之一,通俗来说,就是 MCU 可以被程序控制的管脚。通过程序控制 GPIO 从而读写引脚上的电平状态。GPIO 不仅用于控制引脚电平,还可以复用为一些通信端口的信号引脚。
GPIO 电路结构
下图描述了 STM32F1xx 的 GPIO 内部电路结构,大部分 MCU 的 GPIO 电路结构与此大同小异,部分特殊 IO 结构有所出入。
从右往左看,外部引脚进来有一个上下保护二极管,用于避免应电流倒灌等异常造成内部电路损坏。接着为可设置通断的上下拉电阻,具体阻值参考芯片 datasheet。内部分为输入以及输出两大部分,输入输出电路电平处于线与的逻辑,因此在设置输出的电平状态也会反馈到输入部分。输入部分,输入状态寄存器通过一个触发器获取电平数值,部分MCU也可能是直接获取当前引脚电平状态的
GPIO 模式
为适应不同的控制\通信电路,GPIO 通常可配置为多种 I/O 电路模式。
浮空输入
引脚电平通过施密特触发器后直接保存在输入寄存器里面。输出控制保持断开高阻状态。外部输入时0读出的就是0,外部输入时1读出的就是1,外部没有输入IO处于阻塞读不出电平状态。在读取一段一段的波形,可以清晰的知道什么时候是0信号,什么时候是1信号,什么时候是没有信号的。
上拉/下拉输入
与浮空输入类似,但设置了上拉或者下拉电阻,当无输入时,引脚电平取决于下拉或者下拉设置,以明确空闲时的 IO 电平状态。
模拟输入
引脚路径不经过施密特触发器而是直接送到 ADC 外设中,这样保留最原始的电压值,不是转换过后的0和1信号。
模拟输出
DAC 外设建立的电压直接反馈到外部引脚。
推挽输出
输出寄存器写入1或者0,如果写入1,P-mos导通,N-mos截止,IO口等价直接连接在VDD上,所以IO口电平是高电平。同理输出寄存器的值为0时,P-mos截止,N-mos导通。IO口直接连接在VSS上,所有IO口电平为低电平。推挽输出可以快速的切换0和1。
开漏输出
开漏输出与推挽输出唯一的区别就是开漏输出只有一个N-mos管。当输出寄存器的值为0的时候,n-mos导通,IO口直接连接VSS,输出为低电平。当输出寄存器为1的时候,n-mos截止,IO口直接和输出端断开了,处于浮空状态。电平状态不可控制。作为输出的时候一定要加上拉电阻,加上上拉电阻后,输入寄存器为1的时候,n-mos截止截止了,好比IO和输出端断开,这是IO口点压就等于上拉电阻的电压。这样变输出了高电平,如果IO口的高电平,连接到了外设低电平的,就会产生电流,电流不会流到IO口,(N-mos管截止了)直接流到外设。是不是增大了驱动能力了。(IO口的驱动能力有限,不能容忍大电流)。
复用I/O
复用I/O区别在于起点不一样,复用信号源来源片上外设,同样根据外设通信信号设置为推挽或者开漏。I/O在任一时候只能配置为GPIO或者复用外设中的一种。
GPIO 电气特性
输出速率问题
在STM32 GPIO应用中,会遇到GPIO输出速率设置问题,这里速度指的是输出驱动电路的响应速度,而不是输出信号的速度,输出信号翻转速度与程序有关,而这里的响应速度影响输入驱动电路的带宽,在高速的I/O翻转速度下应选择尽量大的带宽,即更快的响应速度。芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。GPIO的引脚速度跟应用相匹配,速度配置越高,噪声越大,功耗越大。
5V兼容IO
针对3.3供电的器件,部分引脚允许承受高电压的输入,对于输出,不能直接用于高电平的IO推挽驱动输出,但允许开漏输出
GPIO 程序控制
读-修改-写问题
此问题出现在51单片机控制GPIO需要注意的,单片机从端口读入数据的通道有两个,一个是从锁存器引入,一个是从输出引脚处引入,分别叫做“读锁存器”和“读引脚”。单片机在进行端口输出时,经常要参考其上一次的输出状态,例如,需要将连接到端口的LED闪烁。编程序时往往需要从输出引脚读前一次的输出状态,将其求反后输出。但如果上次是输出“1”使LED点亮,这时候虽然端口上输出逻辑是“1”,但是由于LED的二极管作用将输出高电平拉至“0”电平(0.7V左右),通过引脚读进来就是“0”而非“1”了。这样,将“0”求反后输出还是“1”,就起不到使灯闪烁的目的了。但是,如果这时读的不是端口而是锁存器的输出端Q,则实现闪烁的功能就正常。上述例子很好地说明了为什么单片机在设置读端口功能后还要设置读锁存器这一功能。
输入/输出状态问题
当引脚配置为输入状态时,输出电路一般是断开的,只能作读取I/O操作
当引脚配置为输出状态时,程序可通过输入寄存器获取当前I/O状态
当引脚配置为复用模式时,一般允许程序直接读取输入寄存器获取当前I/O状态,但不能对输出寄存器进行操作以避免干扰外设控制引脚
GPIO寄存器
- 输入数据寄存器
- 输出数据寄存器
- I/O模式设置寄存器
- 复用功能设置寄存器