stm32的GPIO端口模式的枚举结构定义的每个模式的高四位是啥意思,是用来干啥的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32的GPIO端口模式的枚举结构定义的每个模式的高四位是啥意思,是用来干啥的?相关的知识,希望对你有一定的参考价值。

根据手册配置分为两个部分
上下拉输入模式配置,CRL或CRH相应的4bit配置位应该配置为 1000
ODR配置,配置该输入端口是上拉还是下拉,根据手册应该是上拉,ODR的相应bit为1,下拉ODR的相应bit为0。
但是库文件给出的GPIO模式枚举结构中,将上下来的高位分别定义为0100/0010这是为什么?
还有输出模式也是的高位都定义为1,也不知道是何用意?
深刻求解释????

在GPIO枚举结构中 给出的结构体
typedef enum
GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
GPIOMode_TypeDef;
这里的只是一个标示,并不能代表它对寄存器是怎么设置的,你可以看下面他的库函数里怎么设置的,另外此处枚举还很好的区分输入输出,输出模式的第4位为1,可以通过此判断你的模式是输入还是输出。

/* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

GPIOx->BRR = (((u32)0x01) << pinpos);

else

/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

GPIOx->BSRR = (((u32)0x01) << pinpos);


他会判断你配置的模式是什么,然后根据pinpos来设置对应的端口
参考技术A


摘自霸道103手册,侵删

华为云技术分享STM32 GPIO的原理特性选型和配置

基本结构

STM32 GPIO是通用输入/输出端口的英文简称,其可实现输入、输出、驱动、通信等功能,STM32的I/O 端口有8种模式(4种输入模式和4种输出模式),每个 I/O 端口位支持3种最大翻转速度(2MHz、10MHz、50MHz),均可自由编程,但I/O 端口寄存器必须按 32 位字、半字(16位)或字节(8位)进行访问,具体模式如下所示:

浮空输入
上拉输入
下拉输入
模拟输入
开漏输出
推挽输出
复用功能推挽输出
复用功能开漏输出

以STM32L011为例(其他STM32处理器大同小异),GPIO基本结构如下所示:
技术图片

关键器件解析:

1、保护二极管:防止I/O引脚外部过高、过低的电压输入,当引脚电压高于VDDIOx时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。

2、开关:开关为TTL肖特基触发器,将模拟信号转化为0和1的数字信号,但当GPIO作为ADC采集电压通道时,此时信号不再经过触发器进行TTL电平转换。

3、P-MOS、N-MOS:单元电路使得GPIO具有“推挽输出”和“开漏输出”的功能。

4种输入模式

STM32具有浮空输入、上拉输入、下拉输入和模拟输入4种输入模式。

浮空输入模式,I/O端口的电平信号由外部输入决定,电平状态不确定,最终直接进入输入数据寄存器。浮空输入通常用于配置USART的RX引脚,如下图所示:

技术图片

上拉输入模式,I/O端口悬空(在无信号输入)的情况下,电平状态保持在高电平,当输入低电平时,电平状态是低电平,最终直接进入输入数据寄存器,如下图所示:

技术图片下拉输入模式,I/O端口悬空(在无信号输入)的情况下,电平状态保持在低电平,当输入高电平时,电平状态是高电平,最终直接进入输入数据寄存器,如下图所示:

技术图片

模拟输入模式,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等。模拟输入通常应用于ADC模拟输入,或者低功耗下省电等情景,如下图所示:

技术图片

4种输出模式

STM32有开漏输出、推挽输出、复用功能开漏输出和复用功能推挽输出4种输出模式(本文STM32L011的上、下拉电阻为公共区域,所以输出模式具有上拉或下拉功能)。

开漏输出模式,通过配置置位/复位寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。开漏输出只可以输出强低电平,高电平得靠外部电阻拉高,输出端相当于三极管的集电极,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内),如下图所示:

需要注意N-MOS管的特性,当设置输出的电平状态为高电平时,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口内部或者外部的上拉或者下拉决定;当设置输出的电平状态为低电平时,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。

技术图片

推挽输出模式,通过配置置位/复位寄存器或者输出数据寄存器的值,P-MOS管和N-MOS管,最终输出到I/O端口。推挽输出可以输出强高、低电平,连接数字器件,如下图所示:

需要注意P-MOS管和N-MOS管的特性,当设置输出的电平状态为高电平时,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;当设置输出的电平状态为低电平时,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。

技术图片

复用功能开漏输出模式、复用功能推挽输出模式的原理和开漏输出模式、推挽输出模式原理基本一致,只不过输出的高低电平,不是由MCU配置置位/复位寄存器或者输出数据寄存器的值,而是利用片上外设模块的复用功能输出来决定的(通信接口(SPI,UART,I 2 C,USB,CAN,LCD等)、定时器、调试接口等复用)。复用功能开漏输出通常用于TX1、MOSI、MISO等引脚的配置,复用功能推挽输出通常用于I2C的SCL、SDA。以复用功能推挽输出模式为例,实现原理如下图所示:

技术图片

GPIO选型和配置

如何选择适合其应用开发的GPIO模式和配置呢?请参考下图所示。

技术图片

技术图片

作者:华为云特约供稿开发者 不脱发的程序猿

 

技术图片

以上是关于stm32的GPIO端口模式的枚举结构定义的每个模式的高四位是啥意思,是用来干啥的?的主要内容,如果未能解决你的问题,请参考以下文章

第13章 GPIO输入—按键检测

stm32中如何将某个端口设置为复用模式

STM32的GPIO定义的时候一般都选定了端口GPIOA,GPIOB这种,没有定义端口的是啥情况

STM32 task3学习记录

STM32GPIO配置为输出和输入捕获怎么配置(HAL库)?

STM32入门-GPIO端口的八种工作模式