提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本文为基于cubmax的GPIO学习笔记。
参考资料:《野火HAL库开发指南》
STM32GPIO八种工作模式区别_白面小书生的博客-CSDN博客
GPIO的8种工作模式详解_LzChang的博客-CSDN博客_gpio的8种工作模式
一、GPIO是什么?
GPIO(General Purpose Input Output)通用输入输出口,是接在APB2总线上的外设。
每个GOIO结构内包括一个寄存器和一个驱动器,内核通过APB2总线对寄存器进行读写,寄存器每个,寄存器每一位对应一个引脚 ,每个寄存器有16个引脚,GPIO外设分为GPIOA,GPIOB……GPIOX等等,驱动器用来增强信号。
可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V。
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等。
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。
二、GPIO的八种工作模式
1.输入浮空模式
以上截图就是浮空输入模式的原理图,图中阴影的部分在浮空输入模式下是处于不工作状态的,尤其是下半部分的输出电路,实际上这时的输出电路与输入的端口处于隔离状态。
黄色的高亮部分显示了数据传输通道,外部的电平信号通过左边编号1的I/O 端口进入STM32内部经过编号2的施密特触发器整形以后送入编号为3的“输入数据寄存器”在“输入数据寄存器”的另一端(编号4) ,CPU通过内部的数据总线可以随时读出I/O 端口的电平变化的状态。
由于浮空输入一般多用于外部按键输入,浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
2.输入上拉模式
上图是STM32的GPIO带上拉输入模式的原理图。
与前面介绍的浮空输入模式相比,仅仅是在数据通道上面,接入了一个上拉电阻,根据STM32的数据手册,这个上拉电阻阻值介于30K~50K 欧姆。同样,CPU可以随时在“输入数据寄存器”的另一端,通过内部的数据总线读出I/O 端口的电平变化的状态。
区别在于没有输入信号的时候默认输入高电平(因为有弱上拉)。上拉电阻就是为了保证无信号输入时输入端的电平为高电平,同样还有下拉电阻它是为了保证无信号输入时输入端的电平为低电平。
3.输入下拉模式
对于输入下拉模式的输入,是在数据通道的下部,接入了一个下拉电阻。
根据STM32的数据手册,这个下拉电阻阻值也是介于30K~50K 欧姆。
对于要加上拉或下拉电阻:
1.当作单片机作为输入时,假设我们直接在IO端口接一个按键到地(或电源)。
因为按键按,于不按管脚都是悬空的。单片机就很难检测按键是否按下。
所以人为的接一个上拉(或下拉)。以确定未按下的时候IO输入电平的状态
2.可以提高芯片的抗干扰能
3.当单片机的IO口作输出时,如果不接上拉电阻只能提供灌电流。无法输出电流驱动外接设备。这时也需要考虑上拉电阻。这样才可以使IO输出高电平。
所以区别在于没有输入信号的时候默认输入低电平(因为有弱下拉)。
4.模拟输入模式
如果把STM32配置为模拟输入模式时,工作原理就比较简单了,信号从左边编号为1 的端口进从右边编号为2的一端直接进入STM32单片机的AD模块。
细心的朋友可以看到数据通道中上拉、下拉电阻和施密特触发器,这时均处于关断的状态,“输入数据寄存器”就不能反映IO端口上的电平变化的状态了,换句话说,也就是在模拟输入状态下,CPU不能通过“输入数据寄存器”读到IO端口变化的数据了。
5.开漏输出
上图是GPIO开漏输出模式的工作原理图
当CPU 在编号1 端通过“位设置/ 清除寄存器”或“输出数据寄存器”写入数据后
该数据位将通过编号2的输出控制电路传送到编号4 的I/O端口。
如果CPU 写入的是逻辑“1 ”,则编号3 的N-MOS管将处于关闭状态
此时I/O 端口的电平将由外部的上拉电阻决定
如果CPU 写入的是逻辑“0 ”,则编号3的N-MOS管将处于开启状态
此时I/O端口的电平被编号3 的N-MOS管拉到了“地”的零电位。
在图中的上半部,施密特触发器处于开启状态
这意味着CPU 可以在“输入数据寄存器”的另一端,随时可以监控I/O端口的状态
通过这个特性,还可以实现了虚拟的I/O端口双向通信:假如CPU 输出逻辑“1 ”
由于编号3 的N-MOS管处于关闭状态,I/O 端口的电平将完全由外部电路决定
因此,CPU 可以在“输入数据寄存器”读到外部电路的信号,而不是它自己输出的逻辑“1 ”
GPIO口的输出模式下,有3 种输出速度可选(2MHz 、10MHz和50MHz)
这个速度是指GPIO口驱动电路的响应速度,而不是输出信号的速度
输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路用户可以根据自己的需要选择合适的驱动电路)。
通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
高频的驱动电路,噪声很高
当我们的项目不需要比较高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI 性能。
当然如果我们的项目要求输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到比较失真的输出信号。
这就意味着,输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).。
开漏形式的电路有以下几个特点
a、利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电压。
b、开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)
c、可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。
弱点:带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
6.推挽输出
GPIO的推挽输出模式是在开漏输出模式的基础上,在“输出控制电路”之后,增加了一个P-MOS管。
当CPU输出逻辑“1 ”时,编号3 处的P-MOS管导通,而下方的N-MOS管截止,达到输出高电平的目的;
当CPU输出逻辑“0 ”时,编号3 处的P-MOS管截止,而下方的N-MOS管导通,达到输出低电平的目的;
在这个模式下,CPU 仍然可以从“输入数据寄存器”读到该IO端口电压变化的信号。
所以,推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
7.开漏复用输出
GPIO的开漏复用输出模式与开漏输出模式的工作原理基本相同
不同的是编号为2 的输入的源不同,它是和复用功能的输出端相连
此时的“输出数据寄存器”被输出通道给断开了。
从上面的这个图,我们还可以看到CPU同样可以从“输入数据寄存器”读取到外部IO端口变化的电平信号。
8.推挽复用输出
编号2“输出控制电路” 输入是与复用功能的输出端相连
此时“输出数据寄存器”被从输出通道断开了,片上外设的输出信号直接与“输出控制电路”的输入端想连接。
我们将GPIO配置成复用输出功能后,假如相应的外设模块没有被激活,那么此时IO端口的输出将不确定。
总结
在STM32中常用IO模式
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(TX1,I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(MOSI,MISO.SCK.SS)
通常有5种方式使用某个引脚功能,它们的配置方式如下:
1)作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
2)作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
3)作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
4)作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
5)作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。
如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。
三.GPIO配置
选择芯片后进入页面,点击任意一个你想配置的引脚,如:PC13
这里可以将引脚设置成输入或输出模式。
这个地方可以设置推挽输出