本文介绍了GPIO的八种工作模式,可供初学者在学习STM32时,较为深刻的了解工作模式的原理,希望对初学者有所帮助!
初学推荐!GPIO的8种工作模式详解
STM32中GPIO的8种工作模式
本文以STM32F103C8T6这款初学者常用的MCU为例,介绍其GPIO的八种模式。
1.1 基本的概念
1.1.1 何为GPIO?
GPIO,即**“General Purpose Input Output”**的简称,中文为通用输入输出端口,简单来说就是 STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
STM32芯片的GPIO被分成很多组,每组有16个引脚,以Cortex-M3内核的STM32F103C8T6为例,查看数据手册知,它共有48个引脚(管脚,PIN),如下图 1.1所示。也列出了该款芯片所具有的片上资源。而STM32F103VET6有5组GPI/O,共有100个引脚,资源比C8T6丰富。但是它们的GPIO模块都是类似的。
每个GPI/O端口有:两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)、两个32位数据寄存器(GPIOx_IDR,即input data register和GPIOx_ODR)、一个32位置位/复位寄存器(GPIOx_BSRR即set/reset register)、一个16位复位寄存器(GPIOx_BRR,即reset register)和一个32位锁定寄存器(GPIOx_LCKR,lock register),共有7个寄存器。
这些寄存器的地址在其参考手册中列出来了,如下图 1.2所示。通过读写这些寄存器(可理解为具有特殊功能的存储器,普通存储器可以写入/读出数据,但是这些数据没有控制能力,而寄存器的每一位与特定的硬件电路相连,通过读写这些位,就能控制硬件的功能),就能配置相应的功能。
1.1.2 引脚和GPIO
上面说了,STM32F103C8T6这款芯片又48个引脚,但是它的可用GPIO只有GPIOA_0-15和GPIOB_0-15,以及GPIOC_13、GPIOC_14、GPIOC_15,PD0和PD1。总共37个IO口,比48个少了11个?
其实不是的,这里说的IO口和引脚或者叫管脚可不是一回事。可以这样说:IO是引脚,但是引脚不一定能做IO口。有多个引脚是用于芯片的供电、复位等。
其中有些IO口还不能直接作为输入/输出口使用,比如PD0和PD1的主功能是用来连接外部高速晶振的,下图 1.3所示。PB2用来做BOOT1引脚,设置启动模式。
下图 1.4是B站江科大的STM32课程中整理的STM32F103C8T6这款芯片的引脚功能分布。
1.1.3 通用、复用功能和重映射
首先是通用功能,这个很好理解,GPIO的默认功能就是通用的输入输出,如点亮LED、蜂鸣器等。但是显然是是不够用的,上面提到,STM32F103C8T6共有48个引脚,可用的GPIO才30个左右,显然没办法“负担”图 1.1的所有资源,所以就要有GPIO口“身兼数职”。
这就是GPIO的复用功能,比如PB8和PB9的默认复用功能就是TIM4_CH3和TIM4_CH4。注意,STM32所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。
在STM32中,每个内置外设都有若干个输入输出复用引脚,一般这些引脚的输出端口都是固定不变的,为了更好地安排引脚的走向和功能,在STM32中引入了外设引脚“重映射”的概念,即一个外设的引脚除了具有默认的IO口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。
重映射分为部分重映射和完全重映射。具体可以查看参考手册对于重映射的规定。
1.2 GPIO的工作模式
每种状态或者功能下,SM32的GPIO口的状态是不同,因此设计了8中GPIO的工作模式,需要根据特定使用场景确定GPIO的模式。
根据《STM32F10xxx参考手册》GPIO模块的基本结构如下图 1.5所示,每个GPIO内部都有这样的一个电路结构。
在上图中,红框标记的即为芯片的引脚。
其中IO引脚上下的两个二极管分别用于防止引脚外部过高、过低的电压输入。比如,当引脚电压高于VDD(以3.3V为例)时,上方的二极管导通,防止高电压进入芯片内部,破坏芯片;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片,汲取电流,影响正常工作。
但是即使有这个保护措施,还是不能直接外接大功率器件(如电机、蜂鸣器等),须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。
GPIO共有8中可软件编程配置的模式,即通过配置相应的寄存器即可配置不同的模式,实现对应的功能。
如下表1.1所示。支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。同时,GPIO还支持三种最大翻转速度(2MHz、10MHz、50MHz),即高低电平的翻转快慢。
那么,这些模式有什么用呢?以及如何使用呢?下面仔细分析。
1.2.1 模式总结
下表 1.1总结了GPIO的8种工作模式名称和特征等信息。
下面分别介绍每种模式的含义。
1.2.2 上拉、下拉和浮空输入
先简单了解这几个概念:上拉电阻、下拉电阻、强拉和弱拉、灌电流、拉电流。
-
上拉(Pull Up)或下拉(Pull Down)电阻,都可以称为“拉电阻”(为什么叫拉电阻?这说的是这个电阻起的作用,拉高或低电平)。拉电阻是把一个信号通过一个电阻接到电源Vcc,下拉电阻是一个信号通过一个电阻接到地GND。它们最基本的作用是:将状态不确定的信号线通过一个电阻将其箝位至高电平(上拉)或低电平(下拉),也就是说接了拉电阻的引脚,其“默认电平”由上拉或者下拉电阻决定,如果是上拉则为高电平,下拉则低电平。
-
强拉和弱拉;强拉、弱拉的强弱只是拉电阻的阻值不同,强拉对应的是低电阻值,高电流,强驱动能力,弱拉反之,它们并没有什么严格区分。例如:50电阻上拉,一般成为强上拉;100k电阻上拉则称为弱上拉。下拉也是一样的。强拉电阻的极端就是0值电阻,即将信号线直接与电源VCC或地GND相连。
-
灌电流和拉电流:输出电路的下拉电阻的电流常常是由负载电路流入,所以称为灌电流。输出电路的上拉电阻的电流常常是由输出端流入负载电路,所以称为拉电流或源电流。
下图 1.6为输入模式的框图。
其中,GPIO的输出是断开的,也就是说在输入时,不能同时有输出。“上拉输入”模式即将上拉电阻接通,此时引脚的默认电平被拉至高电平,当有高电平输入时,输入高电平,当有低电平输入时,输出低电平。经过上拉电阻到施密特触发器,它的主要作用是滤波,使端口输入稳定的高低电平到输入数据寄存器。
“下拉输入”同理。而在“浮空输入”模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。一般用在定时器输入捕获模式、USART和IIC。
1.2.3 模拟输入
显然这个模式是给STM32的ADC外设使用,在此模式下,端口的模拟信号(连续的电信号)直接进入片上ADC外设,如图 1.7所示,而不经过施密特触发器进入输入数据寄存器,弱上拉和下拉电阻被禁止,就是说只有。
需要注意的是:使用ADC时,一般会使用电阻分压后再接入ADC,电压不能超过最大电压!否则将烧毁芯片。
1.2.4 通用/复用推挽输出
这个是相对于输入模式较难理解的。通用开漏/推挽输出结构框图如图 1.8所示。
通过框图,可以大概知道一下信息:
上面的输入的信号通道依然可用,也就是读取输入数据寄存器依然可以得到IO口的状态。但是上拉和下拉电阻被禁止了,同时施密特触发器也是可用的。
下面的输出通道接入两个MOS管,所谓的“推挽”和“开漏”就是以这两个MOS管的工作方式来命名。完整的信号输出流程是:写入输出数据寄存器,经过MOS管,输出不同的信号。
先看**“推挽输出”**模式。
推挽模式的内部等效电路如下图 1.9所示。在推挽输出模式下P-MOS管和N-MOS管均可工作,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。
推挽结构也可以由两个三极管实现,同样的,两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。
详细分析上述结构的输出电平情况,如下图 1.10所示。
- 首先,MOS的导通和截至条件为:栅极电压大于源几点呀则源极和漏极导通,若二者相等,则认为MOS管截至,即S和D不通。
- 其次是电平变化情况,当输出控制器输入高电平时,经过反向后,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;而在输出控制器输入低电平时,经过反向后,N-MOS管导通,P-MOS关闭,对外输出低电平。
- 最后,关于“推”和“挽/拉”的解释,输出高电平时,电流输出到负载,叫灌电流,可以理解成推,输出低电平时,负载电流流向芯片,叫拉电流,即挽;
推挽输出的特点是:
-
P-MOS和N-MOS相互工作,电平切换速度快;
-
-输出高低电平与电源电压基本没有压差,MOS管的内阻很小;因为没有压差,所以它的高低电平驱动能力较强,一般数字芯片推挽输出IO口驱动电流最大可到20mA。
-
-主要不足是:不支持线与(即输出不能接在一起)。
关于**“复用推挽输出”**,结构如下图 1.11所示。它的原理和通用是一样的。只不过如前文所说,这里的“复用”是指STM32的其它片上外设对GPIO引脚进行控制,此时GPIO引脚用作该外设功能的一部分,算是第二用途。如从TIM定时器外设引出来的“复用功能输出信号”上述说的结构相连。
1.2.5 通用/复用开漏输出
在开漏(Open Drain)输出模式下,其电路结构如下图 1.12所示。上方的P-MOS管完全不工作。
分析上述结构的输出电平情况,如下图 1.13所示。
-
当输出控制器输入低电平时,经过反向后,下方的N-MOS管导通,对外输出低电平;
-
输出控制器输入高电平时,此时N-MOS管关闭,由于没有P-MOS,它无法直接输出高电平,则P-MOS管和N-MOS管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态(相当于断开)。
-
为正常使用时必须外部接上拉电阻,如下图 1.13所示。
开漏输出的特点是:
-
可实现电平转换,输出高电平需要上拉电阻电源。
-
最主要的是能够可以实现IO口的“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平。
-
推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。
-
开漏输出一般应用在I2C、SMBUS通讯等需要“线与”功能的总线电路中。
-
在STM32的应用中,除了必须用开漏模式的场合,习惯使用推挽输出模式。
-
开漏输出不足:高电平驱动能力差,取决于外部上拉电阻,电平切换速率取决于外部上拉电阻,电阻越小速度越快。
1.2.6 开漏和推挽模式总结
根据《STM32F10xxx参考手册》对外设GPIO配置模式做了推荐,如下图 1.14所示。如TIM的输入捕获功能为“浮空”输入,而输出比较功能则为“复用推挽”输出,等等。
根据使用习惯,可以总结以下模式配置方式:
- 模拟输入:应用ADC模拟输入,或者低功耗下省电
- 开漏输出:上面说了,开漏模式下,IO口无法直接输出高电平输出0接GND,需要借助外接上拉电阻,在输入的时候将引脚置高电平。这样可以实现“STM32的GPIO既输入又输出的状态”,这在软件模拟IIC总线通信中常用。总结:引脚配置成开漏输出+外部需要上拉,同时在输入的时候,要引脚置高。
- 复用功能的推挽输出:片内外设功能(I2C的SCL、SDA);
- 复用功能的开漏输出:片内外设功能(SPI的MOSI、MISO、SCK、CS);
如何配置这些模式呢?
答:直接读写寄存器,或者使用库函数(推荐)。