四、GPIO功能描述

GPIO功能描述

在STM32中,所有的GPIO都是挂载到APB2外设总线上的。
在这里插入图片描述
GPIO外设的名称按照GPIOA、GPIOB、GPIOC等等这样来命名的。每个GPIO外设总共有16个引脚,编号0到15(如:PA0,PA1,PA2……PA15)

每个GPIO模块内主要包含寄存器和驱动器。

寄存器是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,以此完成输出电平和读取电平的功能。
寄存器的每一位对应一个引脚。输出寄存器写1,对应的引脚就会输出高电平;写0,就会输出低电平。输入寄存器读取为1,证明对应端口目前是高电平,读取为0,就是低电平。
STM32是32位的单片机,内部寄存器是32位的,但端口只有16位,所以寄存器只有低16位有对应的端口,高16位没有用到。
驱动器是用来增强信号的驱动能力的。寄存器只负责存储数据,若要进行点灯操作,需要驱动器负责增大驱动能力。

模块化编程:

外围硬件多,将每个硬件的驱动函数单独提取出来,封装在.c和.h文件里,有利于简化主函数的逻辑,也有利于程序的移植,文件中函数的注释写清楚

一、GPIO位结构的电路图

在这里插入图片描述
左侧三个寄存器,中间驱动器,右边是某一个IO口的引脚
在这里插入图片描述
上下分为两个部分,上面为输入部分,下面为输出部分。

1.输入部分

在这里插入图片描述
左侧有一个IO引脚,两个保护二极管对输入电压进行限幅。
上面的二极管接VDD,3.3V;下面的接VSS,0V。
如果输入电压高于3.3V,上面的二极管导通,输入电压产生的电流直接流入VDD而不会流入内部电流,避免过高的电压对内部电路产生伤害;
如果输入电压低于0V,下面的二极管就会导通,电流会从VSS直接流出去,而不会从内部电路汲取电流,也是保护内部电流的。
如果输入电压在0~3.3V之间,两个二极管均不会导通,二极管对电路无影响。
在这里插入图片描述
左上方连接了一个上拉电阻(至VDD)和一个下拉电阻(至VSS)。此开关可以通过程序进行配置。
上面导通,下面断开,是上拉输入模式;
下面导通,下面断开,是下拉输入模式;
上下都断开,是浮空输入模式。
这里的上拉下拉是为了给输入提供一个默认的输入电平,对于一个数字的端口,输入不是高电平就是低电平,若输入引脚什么都不接,无法确定是高电平还是低电平(如果输入什么都不接,输入会处于浮空的状态,引脚的输入电平易受到外界干扰而改变)加入上拉或下拉电阻,可以避免这种情况。
如果接入上拉电阻,当引脚悬空,上拉电阻可以保证引脚的高电平。因此上拉输入又可以称作默认高电平的输入模式。
同理,下拉是默认为低电平的输入的方式。

施密特触发器

施密特触发器对输入电压进行整形,其执行逻辑如下:
若输入电压大于某一阈值,输出就会瞬间升为高电平;
若输入电压小于某一阈值,输出就会瞬间降为低电平
在这里插入图片描述在这里插入图片描述
使用两个阈值进行判断,中间留有一定的变化范围,避免因信号波动造成的输出抖动现象
经过施密特触发器整形的波形可以直接写入输入数据寄存器。
在这里插入图片描述
用程序读取输入寄存器对应某一位的数据,就可以知道端口的输入电平了。
在这里插入图片描述

模拟输入和复用功能

输入两路线路,是连接到片上外设的一些端口。
模拟输入:连到ADC上,因为ADC需要接受模拟量,故模拟输入的线接到施密特触发器前面。
复用功能输入:连到其他需要读取端口的外设上(如串口的输入引脚),接受数字量,故接到施密特触发器后面。

2.输出部分

在这里插入图片描述
数字部分可以由数据寄存器或片上外设控制,两种控制方式通过数据选择器接到了输出控制部分。
若选择通过输出寄存器进行控制,就是普通的IO口输出,写输出数据寄存器的某一位就可以操作对应的某个端口了

位设置\清除寄存器

:可以单独操作输出数据寄存器的某一位,而不影响其他位,
因为输出数据寄存器同时控制16个端口,且又只能整体读写,故想单独操作输出数据寄存器的某一端口而不影响其他端口,就需要一些特殊的操作方式。
在这里插入图片描述
通过设置位设置和位清除寄存器:
若要对某一位进行置1的操作,在位设置寄存器的对应位写1,剩下不需要操作的位写0,这样其内部就会有电路自动将数据输出寄存器中对应位置为1,而剩下写0的对应位保持不变。这样就保证了只操作一位而不影响其他位,操作一步到位。
若想对某一位进行清零,就在位清除寄存器的对应位写1即可,这样其内部就将这一位进行清零。

两个MOS管(P-MOS N-MOS)

在这里插入图片描述
MOS管就是一种电子开关,信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS
有三种输出方式:推挽,开漏,关闭。
推挽输出:P-MOS和N-MOS均有效。这种模式下,高低电平都有较强的驱动能力,故也叫做强推输出模式。这种模式下,STM32对IO口具有绝对的控制权,高低电平都由STM32决定。
输出数据寄存器为1时,P-MOS导通,N-MOS断开,输出接到VDD,输出高电平。
输出数据寄存器为0时,P-MOS断开,N-MOS导通,输出接到VSS,输出低电平。
开漏输出:P-MOS无效,N-MOS有效。这种模式下,只有低电平有驱动能力,高电平无驱动能力。
输出数据寄存器为1时, N-MOS断开,输出相当于断开,也就是高阻模式。
输出数据寄存器为0时, N-MOS导通,输出接到VSS,输出低电平。
在这里插入图片描述
开漏输出用途:
可以作为通信协议的驱动方式(如I2C通信的引脚)。在多机通信的情况下,这换个模式可以避免各个设备的相互干扰。
还可以用于输出5V的电平信号,如图。在IO口外接一个上拉电阻到5V的电源,当输出低电平时,由内部N-MOS直接接VSS;当输出高电平时,由外部的上拉电阻拉高至5V,可以输出5V的电平信号,用于兼容一些5V电平的设备)
关闭输出:当引脚配置为输入模式时,两个MOS管都无效,输出关闭,端口的电平由外部信号来控制。

二、GPIO的八种工作模式

通过配置GPIO的端口配置寄存器,位结构电路根据配置改变,端口可以配置成以下8种模式:
在这里插入图片描述

输入模式

在输入模式下,输出驱动器断开,端口只能输入不能输出。在这里插入图片描述
在模拟输入模式下,关闭数字的输入功能(其他7个模式所有输入都是有效的),且施密特触发器以及输出驱动器都是无效的。从引脚直接接入片上外设(ADC),故使用ADC时,将引脚模式配置为模拟输入。在这里插入图片描述

输出模式

在输出模式下,输入模式有效。但输入模式下,输出无效。因为一个端口只能有一个输出,但可以有多个输入,故在输出模式下,内部有输入是没有影响的。在这里插入图片描述
复用输出和普通输出对比,复用输出的引脚电平是由片上外设控制的。
通用输出没连接,引脚由片上外设控制,输入部分片上外设可以读取引脚电平,普通输入也有效,顺便接受电平信号。在这里插入图片描述

三、GPIO的寄存器

GPIO配置寄存器:每个端口的模式由4位进行配置,16个端口就需要64位,(STM32的单片机内部寄存器只有32位)故需要两个配置寄存器:端口配置低寄存器和端口配置高寄存器。具体的配置(输出模式,输出速度(限制输出引脚的最大翻转速度,为了低功耗和稳定性,一般配置成50MHz))可以参考手册介绍
在这里插入图片描述
端口输入数据寄存器:低16位对应16个引脚,高16位没有使用
端口输出数据寄存器:同样,低16位对应16个引脚,高16位没有使用
端口位设置\清除寄存器:低16位进行位设置,高16位进行位清除。写1就是设置或者清除,写0就是不产生影响。
端口位清除寄存器:其低16位进行位清除。
为了方便操作,若只想进行单一的进行位设置和位清除,位设置用端口位设置\清除寄存器,位清除用端口位清除寄存器,都使用低16位的数据;;若对多个端口进行位设置和位清除,就只使用端口位设置\清除寄存器,这样可以保证位设置和位清除的同步性。(若对信号同步性要求不高,可以先位设置再位清除)
端口配置锁定寄存器:可以对端口配置进行锁定,防止意外更改。

GPIO函数的用法

读取函数:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
读取GPIO 口
GPIO_ReadInputDataBit 读取输入数据寄存器某一位的值
GPIO_ReadInputData 读取整个输入数据寄存器的值
看输出模式下输出了什么
GPIO_ReadOutputDataBit读取输出数据寄存器某一位的值
GPIO_ReadOutputData读取整个输出数据寄存器的值

输出函数:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//将指定的端口设置成高电平//参数1:GPIOx 参数2:GPIO_Pin_x,端口输出低电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//将指定的端口设置成低电平//参数1:GPIOx 参数2:GPIO_Pin_x,端口输出低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//根据第三个参数的值设置指定的端口//前两个参数和上面两个参数相同,第三个参数是枚举类型的,指定写入的参数值,Bit_SET设置端口值,置高电平,Bit_RESET清楚端口值,置低电平
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//这个函数可以同时对16个端口进行写入操作 //参数1:GPIOx 参数2:PortValue,

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值