江科大老师教程:STM32 GPIO位结构基础学习

一、GPIO内部结构 

1、GPIO外设名称是由GPIOA、GPIOB、GPIOC等命名,共有16个引脚

2、每个GPIO模块内,主要包含了寄存器驱动器这些东西

3、寄存器写1,对应的端口就是高电平。写0,对应的端口就是低电平

4、寄存器只负责存储数据


这是GPIO结构图,总体来说上半部分是输入部分,下半部分是输出部分

 这是部分是寄存器

寄存器介绍

想要单独控制某一端口而不影响其他端口,需要一些特殊的方式

第一种方式:通过按位与和按位或的方式更改某一位,最后再将数据写回去,C语言中就是 &= 和 |= 的操作      (麻烦、效率低)

第二种方式(主用):设置位设置位清除寄存器,如果需要设置,那么就在位设置寄存器某一位写1。如果需要清除,那么就在位清除寄存器写0。这样内部电路就会帮我们处理

第三种方式:通过寻址的方式,暂时不会用到


Mos管介绍

1、上面是P-MOS,下面是N-MOS。MOS管就是一种电子开关

2、我们的信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS

在这里可以选择推挽、开漏或关闭三种输出方式

1、推挽输出模式下,P-MOS和N-MOS都有效。

(1)数据寄存器位1时,上管导通下管断开,输出直接接到VDD,输出高电平

(2)数据寄存器位0时,上管断开下管导通,输出直接接到VSS,输出低电平

总结:这种模式高低电平都有较强驱动能力,STM32对IO口具有绝对的控制权,高低电平都由STM32说了算

2、开漏输出模式下,P-MOS失效,只有N-MOS工作。

(1)数据寄存器位1时,下管断开,这时输出相当于断开,等于高阻模式

(2)数据寄存器位0时,下管导通,输出直接到VSS,也就是输出低电平

总结:这种模式下只有低电平有驱动能力,高电平没有驱动能力

作用:(i)、可以作为通信协议的驱动方式(比如I2C通信的引脚就是使用开漏模式),在多机通信的情况下,这个模式可以避免各个设备的相互干扰

(ii)、可以用于输出5V的电平信号,比如在IO口外接一个上拉电阻到5V的电源

        当输出低电平时,由内部的N-MOS直接接VSS

        当输出高电平时,由外部的上拉电阻拉高至5V

这样就可以输出5V的电平信号,用于兼容一些5V电平的设备

3、关闭输出模式下

(1)端口的电平由外部信号来控制


这部分是驱动器

一、上拉电阻和下拉电阻

1、VDD和VSS这里对应的是上拉电阻和下拉电阻,开关可以通过程序进行配置

2、如果VDD导通而VSS断开就是上拉模式,反之就是下拉模式。

3、如果都断开那就是浮空模式

4、加这个主要是为了避免引脚悬空导致输入数据不确定,我们就需要在这里加上上拉或者下拉电阻。当引脚悬空,上拉电阻保证引脚高电平,同理下拉保证低电平。

二、肖特基触发器(也可以叫做施密特触发器)

1、对输入电压进行整形,如果输入电压小于某一阈值,输出就会瞬间降为低电平。反之升为高电平

(举例,如图所示)红色为输入电压,绿色为阈值范围,当低于最低阈值则输出低电平,高于最高阈值则输入高电平

这样可以有效的避免因为信号波动造成的输出抖动现象

2、接下来经过肖特基触发器整形的波形就可以直接写入输入数据寄存器了,我们再用程序读入输入数据寄存器对应某一位数据就可以知道端口的输入电平了

1、最后上面还有两路线路(模拟输入和复用功能输入),用来连接到片上外设的一些端口

2、模拟输入是连接到ADC上的,因为ADC需要接收模拟量,所以接到施密特触发器前面

3、复用功能输入,这个是连接到其他需要读取端口的外设上的。比如串口的输入引脚等,这根线接收的是数字量,所以接到了施密特触发器后面

总结:施密特前是模拟量 ,施密特后是01组成的数字量


这部分是IO引脚

1、上方VDD接3.3V,下方VSS接0V。

2、如果输入电压大于3.3V,那么电流就会流入VDD而不会流入内部电路(避免过高电压对电路产生伤害)。

3、如果输入电压小于0V,那么电流会从VSS直接流出去而不会从内部电路吸取电流。

 二、GPIO的八种工作模式

 数字输入


模拟输入

1、这种情况其他全部失效,直接接到了片上外设,这种就是ADC。所以当我们使用ADC的时候,将引脚配置为模拟输入就可以了


数字输入

1、开漏输出和推挽输出

2、复用开漏输出和复用推挽输出

1、与上边基本相同,但是复用的输出引脚电平是由片上外设控制的

总结:一个端口只能由一个输出,但可以有多个输入。所以当配置成输出模式的时候,内部可以顺便输入一下

物联沃分享整理
物联沃-IOTWORD物联网 » 江科大老师教程:STM32 GPIO位结构基础学习

发表评论