GPIO的8种模式及配置(STM32F103)

下面主要介绍GPIO的8种模式以及相关寄存器的介绍和配置

一、I/O断口位的基本结构

当I/O端口配置为输入时,施密特触发输入被激活,输出缓冲器被禁止,根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接,I/O口上的数据在每个APB2时钟会被采样到输入数据寄存器,读取输入数据寄存器可以得到I/O口的状态。

当I/O端口被配置为输出时,输出缓冲器被激活,开漏模式下,输出数据寄存器上的’0’激活N-MOS,而输出数据寄存器上的’1’将端口置于高阻状态(PMOS从不被激活),开漏模式允许通过外接上拉电阻连接到不同电压的电源,从而实现与不同电压等级的设备进行接口,它还常用于I²C等总线协议,从安全的角度来看,在高电平时 GPIO 引脚处于高阻态,不会主动输出电流,从而在发生短路的情况下(比如误连线)能够避免过大电流,具有一定的保护作用。

二、配置GPIO的8种模式

在配置GPIO前需要了解相关的寄存器:

1、GPIO_CRL和GPIO_CRH(这两个寄存器主要用于配置工作模式)
2、GPIO_IDR(这个寄存器存储了引脚的状态,获得引脚的高低电平状态就是通过读取该寄存器)
3、GPIO_ODR(输出模式下,控制引脚输出电平;输入模式下,控制上拉下拉的选择)
4、GPIO_BSRR(控制相应引脚的高低电平)
5、GPIO_BRR(控制相应引脚为低电平)

GPIO_CRL(端口配置低寄存器):

每4位为一组,每一组包括了CNFy和MODEy(y= 0~7),一共有八组,

分别对应了GPIOx(x=A、B、C...)低8位的I/O口(即GPIOx_PIN_0~GPIOx_PIN_7)。

MODEy[1:0] ,00:输入模式,要配置为输出模式,则这两位要>00, =00为输入模式

                        01:输出模式,最大速度10MHz

                        10:输出模式,最大速度2MHz

                        11:输出模式,最大速度50MHz

CNFy[1:0],在输入模式(MODE[1:0]=00)下:

                        00:模拟输入模式

                        01:浮空输入模式(复位后的状态)

                        10:上拉/下拉输入模式

                        11:保留

GPIO_CRH(端口配置高寄存器):

和GPIO_CRL一样,区别在于该寄存器配置的是GPIOx高八位的引脚(即GPIOx_PIN_8~GPIOx_PIN15)

GPIO_IDR(输入数据寄存器):

该寄存器是只读的,存储了引脚的状态,要获得引脚电平状态可读取该寄存器里的数据,标准库中的读取函数就是通过读取的该寄存器的数据实现的。

高16位保留,低16位分别对应了0到15的I/O口(GPIOx_PIN_0~GPIOx_PIN_15)

GPIO_ODR(输出数据寄存器):

该寄存器可读可写,读取其数据得到的是输出的状态,高16位保留,低16位控制了GPIOx的16个引脚(GPIOx_PIN_0~GPIOx_PIN_15)

推挽输出模式下,对应位为1,激活P-MOS,输出高电平;对应位为0,激活N-MOS,输出低电平。

开漏输出模式下,对应位为1,端口置为高阻态;对应位为0,激活N-MOS,输出低电平。

在输入模式下,对应位为1,则选择上拉;对应位为0,则选择下拉。

GPIO_BSRR(置位/清除寄存器):

该寄存器可写不可读,高16位用于清除,低16位用于置位。

高16位中,BRx(x=0~15),1表示把对应位置为0(输出低电平),0则表示不产生影响,

低16位中,BSx(x=0~15),1表示把对应位置为1(推挽模式下输出高电平,开漏模式下呈高阻态),0则表示不产生影响。

GPIO_BRR(清除寄存器):

该寄存器可写不可读,高16位保留,低16位对应了GPIOx的16个端口,作用和GPIO_BSRR的高16位一样。

1、上拉输入和下拉输入

 当外部没有信号输入时,GPIO 引脚会被拉至高电平,避免由于悬空而导致误读或者不稳定信号。

首先设置GPIO设置为输入模式,GPIO_CRL/GPIO_CRH中的MODEy=00,

选择上拉或下拉输入模式,CNFy=10,

选择上拉,GPIO_ODR对应位置为1,选择下拉,则为0

/**************以PB5为例****************************/
//上拉输入配置	
RCC->APB2ENR=0X00000008;//开启GPIOB时钟
GPIOB->CRL=0XCC8CCCCC;//PB5 上拉或下拉输入
GPIOB->ODR=0X00000020;//选择上拉


//下拉输入配置	
RCC->APB2ENR=0X00000008;//开启GPIOB时钟
GPIOB->CRL=0XCC8CCCCC;//PB5 上拉或下拉输入
GPIOB->ODR=0X00000000;//选择下拉

2、浮空输入模式

引脚配置为输入状态但不启用内部的上拉或下拉电阻。这意味着在浮空输入模式下,GPIO 引脚处于高阻态,其电平完全由外部电路决定。如果外部没有通过硬件连接为引脚提供稳定的高低电平状态,那么该引脚可能会因浮动而不稳定,产生不确定的电平状态(通常称为 "悬空")。

MODE[1:0] = 00:将引脚配置为输入模式。

CNF[1:0] = 01:将引脚配置为浮空输入模式。

/**************************以PB5为例***********************/
RCC->APB2ENR=0X00000008;//开启GPIOB时钟
GPIOB->CRL=0XCC4CCCCC;//PB5 浮空输入

3、模拟输入模式

GPIO 引脚配置为模拟输入时,内部会断开所有数字电路的连接,使得引脚直接连接到模拟信号,不会受到干扰,主要用于将引脚连接到片内的模数转换器(ADC),从而采集模拟信号。模拟输入模式通常用于处理传感器输出、电压信号等模拟量的采集。

MODE[1:0] = 00:设置引脚为输入模式。

CNF[1:0] = 00:设置引脚为模拟输入模式。

/**************************以PB5为例***********************/
RCC->APB2ENR=0X00000008;//开启GPIOB时钟
GPIOB->CRL=0XCC0CCCCC;//PB5 模拟输入

4、推挽输出模式

引脚可以输出高电平(VCC)或低电平(GND),当输出高或低电平时,输出阻抗较低,能够驱动一定电流的负载适用于驱动 LED、继电器、逻辑电路、低功耗设备等。

MODE[1:0]:设置输出速度(10MHz、2MHz 或 50MHz)。

CNF[1:0]:设置为 00,表示推挽输出模式。

/**************************以PB5为例***********************/
RCC->APB2ENR=0X00000008;//开启GPIOB时钟
GPIOB->CRL=0XCC3CCCCC;//PB5 推挽输出 50MHz
GPIOB->BSRR=0X00000020;//PB5输出高电平

5、开漏输出

当引脚输出低电平时,开关管导通,GPIO 引脚被拉低,连接到地(GND)。

当引脚输出高电平时,开关管关闭,引脚处于浮空状态(高阻态),此时需要通过外部的上拉电阻提供高电平。

常用于与多设备共用总线的场景,如 I²C 通信协议,也用于需要外部电路上拉电阻才能拉高电平的场合

MODE[1:0]:设置输出速度(10MHz、2MHz 或 50MHz)。

CNF[1:0] = 01:设置为开漏输出模式。

/**************************以PB5为例***********************/
RCC->APB2ENR=0X00000008;//开启GPIOB时钟
GPIOB->CRL=0XCC7CCCCC;//PB5 开漏输出 50MHz
GPIOB->BSRR=0X00000000;//PB5输出低电平

6、复用推挽输出

允许一个 GPIO 引脚通过不同的功能选择来输出数字信号,并且能够以推挽输出的方式进行操作。复用功能可以使单个引脚根据应用需求在不同的功能之间切换,比如作为普通 GPIO、外部中断、定时器输出、通信接口等。同一个 GPIO 引脚可以根据不同的配置充当多种功能,节省了引脚资源,提升了系统的灵活性。

MODE[1:0]:设置输出速度(10MHz、2MHz 或 50MHz)。

CNF[1:0] = 10:设置为复用推挽输出模式。

/************************以PB5为例**************************/
	RCC->APB2ENR=0X00000008;//开启GPIOB时钟
	GPIOB->CRL=0XCCBCCCCC;//PB5 复用推挽输出 50MHz

7、复用开漏输出

允许 GPIO 引脚根据不同的配置选择输出模式,并且能够以开漏方式进行操作。这种模式在需要多个设备共享同一条信号线或通过外部上拉电阻控制信号电平的应用场景中非常有用。

同一个 GPIO 引脚可以根据应用需求在不同功能之间切换(如普通 GPIO、外部中断、定时器输出等.

MODE[1:0]:设置输出速度(10MHz、2MHz 或 50MHz)。

CNF[1:0] = 11:设置为复用开漏输出模式。

	/************************以PB5为例**************************/
    RCC->APB2ENR=0X00000008;//开启GPIOB时钟
	GPIOB->CRL=0XCCFCCCCC;//PB5 复用开漏输出 50MHz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小F

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值