单片机学习
目录
文章目录
一、GPIO简介
二、GPIO基本结构
三、GPIO位结构
3.1 GPIO结构
3.2 输入输出部分
3.3 I/O引脚
3.4 上拉电阻和下拉电阻
3.5 触发器
3.6 输入控制
3.7 MOS管
四、GPIO模式
4.1 浮空输入、上拉输入和下拉输入
4.2 模拟输入
4.3 开漏输出和推挽输出
4.4 复用开漏输出和复用推挽输出
总结
- GPIO(General Purpose Input Output)通用输入输出口
- 可配置为8种输入输出模式
- 引脚电平:0V~3.3V,部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
图中有左边三个寄存器,中间有驱动器,右边是一个I/O口引脚。
图可以分为两个部分,上面是输入部分,下面是输出部分。
最右端的I/O引脚,接了两个保护二极管,对输入电压进行限幅。
上方二极管接VDD为3.3V,下方二极管接VSS为0V。
I/O引脚向内部上方,连接了一个上拉电阻和一个下拉电阻,上拉电阻至VDD,下拉电阻至VSS,这两个开关是可以通过程序进行配置的。
上拉和下拉是为了给输入提供一个默认的输入电平。如果什么都不接,输入就会处于一种浮空的状态,引脚的输入电平极易受外界干扰而改变。
中间的触发器用于输入电压的整形。它的执行逻辑是:如果输入电压大于某一阈值,输出就会瞬间升为高电平。如果输入电压小于某一阈值,输出就会瞬间降为低电平。
经过触发器整形的波形就可以直接写入输入数据寄存器了,用输入数据寄存器可以知道端口的输入电平。
输入数据寄存器上方两路接至片上外设,
下方输入部分可以由输出数据寄存器和片上外设控制,两种控制方式通过数据选择器连接到输出控制部分。
如果选择通过输出数据寄存器进行控制,就是普通IO口输出,写输出数据寄存器的某一位就可以操作对应的某个端口了。
位设置/清除寄存器可以用来单独操作输出数据寄存器的某一位,而不影响其它位。
因为输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写。要单独控制其中某一个端口而不影响其他端口,有几种操作方式:
1.直接操作寄存器
先读出这个寄存器,然后用按位与和按位或的方式更改某一位,最后再将更改后的数据写回去。
在C语言中就是 &= 和 |= 的操作。此方法较麻烦,效率低,对于IO口的操作而言不太合适。
2.通过设置位设置和位清除寄存器。
如果想对某一位进行置1的操作,在位设置寄存器的对应位写1即可,而剩下不需要操作的位写0。这样它内部就会有电路自动将输出数据寄存器中对应位置为1,而剩下写0的位则保持不变。
如果想对某一位进行清0的操作,在位清除寄存器的对应位写1即可。这样内部电路就会把这一位清0了。
这种方式保证了只操作某一位而不影响其它位,并且这是一步到位的操作。由位设置和位清除寄存器发挥作用。
3.读写STM32中的位带区域。
输出控制之后就接到了两个MOS管,上面是P-MOS,下面是N-MOS。
这个MOS管就是一种电子开关,信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS。这里可以选择推挽、开漏或者关闭三种输出方式。
1.推挽输出模式,P-MOS和N-MOS均有效。
- 数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平;
- 数据寄存器为0时,上管断开,下管导通,输出直接接到VSS,就是输出低电平。
这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也可以叫强推输出模式。在推挽输出模式下,STM32对IO口具有绝对的控制权,高低电平都由STM32决定。
2.开漏输出模式,P-MOS是无效的,只有N-MOS在工作。
- 数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式;
- 数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平。
这种模式下只有低电平有驱动能力,高电平是没有驱动能力的。
开漏模式可以作为通信协议的驱动方式,如 I2C 通信的引脚使用开漏模式;多机通信的情况下,这个模式可以避免各个设备的相互干扰;
开漏模式还可以用于输出5V的电平信号,可在IO口外接一个上拉电阻到5V的电源。
- 当输出低电平时,由内部的N-MOS直接接VSS;
- 当输出高电平时,由外部的上拉电阻拉高至5V,这样就可以输出5V的电平信号,用于兼容一些5V电平的设备。
3.关闭状态,当引脚配置为输入模式的时候,两个MOS管都无效。
也就是输出关闭,端口的电平由外部信号来控制。
通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式
前三个模式:浮空输入、上拉输入和下拉输入。这三个模拟的电路结构基本是一样的,区别是上拉电阻和下拉电阻的连接。它们都属于数字的输入口,特征是都可以读取端口的高低电平。当引脚悬空时,上拉输入默认是高电平,下拉输入默认是低电平,而浮空输入的电平是不确定的。所以在使用浮空输入时,端口一定要接上一个连续的驱动源,不能出现悬空的状态。
三种模式的电路结构下图所示:
在输入模式下,输出驱动器是断开的,端口只能输入而不能输出。上面两个电阻可以选择为上拉工作、下拉工作或者都不工作,对应的就是上拉输入、下拉输入和浮空输入。然后输入通过施密特触发器进行波形整形后,连接到输入数据寄存器。
模拟输入特征是GPIO无效,引脚直接接入内部ADC,模拟输入可以说是ADC数模转换器的专属配置了。
模拟输入电路结构:
输出断开,输入的施密特触发器也是关闭的无效状态,所以整个GPIO的红色框起来部分都是没用的,只剩下从引脚直接接入片上外设,也就是ADC的这条线有用。所以使用ADC的时候,将引脚配置为模拟输入就行了。
开漏输出和推挽输出的电路结构基本一样,都是数字输出端口,可以用于输出高低电平。区别就是开漏输出的高电平呈现的是高阻态,没有驱动能力;而推挽输出的高低电平都是具有驱动能力的。
开漏输出和推挽输出的电路结构图:
输出是由输出数据寄存器控制的,若P-MOS无效,就是开漏输出,若P-MOS和N-MOS都有效,就是推挽输出。在输出模式下,输入模式也是有效的。
前面的电路图中,在输入模式下,输出都是无效的,是因为一个端口只能有一个输出,但可以有多个输入,所以当配置成输出模式的时候,内部也可以输入。
复用开漏输出和复用推挽输出两个模式和普通的开漏输出和推挽输出差不多。只是复用的输出,引脚电平是由片上外设控制的。
复用开漏输出和复用推挽输出的电路结构图:
通用的输出在输出数据寄存器这里是没有连接的,引脚的控制权转移到了片上外设,由片上外设来控制。在输入部分,片上外设也可以读取引脚的电平,同时普通的输入也是有效的,顺便接受一下电平信号。
在GPIO的8种模式中,除了模拟输入这个模式会关闭数字电路的输入功能,在其他的7个模式中,所有的输入都是有效的。
以上就是今天要讲的内容,本文简单介绍了STM32中的GPIO结构和8种模式。