STM32F4 GPIO(一)

GPIO工作模式

4种输入模式

(1)GPIO_Mode_IN_FLOATING 浮空输入
(2)GPIO_Mode_IPU 上拉输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_AIN 模拟输入

4种输出模式

(5)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
(6)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)
(7)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)
(8)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)

浮空输入模式

浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。MCU直接读取I/O口电平,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。 (接用电压表测量其引脚电压为1点几伏,这是个不确定值) 以用来做KEY识别

上拉输入模式

IO内部接上拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为高电平 如果I/O口输入低电平,那么引脚就为低电平,MCU读取到的就是低电平
STM32的内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。

下拉输入模式

IO内部接下拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为低电平 如果I/O口输入高电平,那么引脚就为高电平,MCU读取到的就是高电平

模拟输入模式

当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块,并且输入数据寄存器为空 ,CPU不能在输入数据寄存器上读到引脚状态
当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出
除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置

复用功能模式,

开漏输出模式(带上拉或者下拉)
在开漏输出模式时,只有N-MOS管工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时I/O端口的电平就不会由输出的高电平决定,而是由I/O端口外部的上拉或者下拉决定 如果没有上拉或者下拉 IO口就处于悬空状态并且此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。,I/O口的电平不一定是输出的电平

推挽输出模式(带上拉或者下拉)

在推挽输出模式时,N-MOS管和P-MOS管都工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平, 外部上拉和下拉的作用是控制在没有输出时IO口电平
此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。I/O口的电平一定是输出的电平

STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 比如说串口 就是GPIO复用为串口

复用开漏输出(带上拉或者下拉)

GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同
复用推挽输出(带上拉或者下拉)
GPIO复用为其他外设(如 I2C),输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同

开漏输出和推挽输出的区别:

推挽输出:

可以输出强高低电平,连接数字器件 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.

开漏输出:

可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平 合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);
在STM32中选用IO模式:
上拉输入、下拉输入可以用来检测外部信号;例如,按键等;
模拟输入 ——应用ADC模拟输入,或者低功耗下省电
开漏输出一般应用在I2C、SMBUS通讯等需要"线与"功能的总线电路中。
推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。
复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)

GPIO配置步骤

1. 定义GPIO结构体

GPIO_InitTypeDef GPIO_InitStructure;

2. 开启GPIO时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /开启 AHB1时钟/

3. 选择GPIO引脚

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /选择Pin9引脚/

4. 设置GPIO工作模式

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /设定为输出模式/
工作模式:
GPIO_Mode_IN //输入模式
GPIO_Mode_OUT //输出模式
GPIO_Mode_AF //复用模式
GPIO_Mode_AN //模拟模式

5. 设置引脚输出类型

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /设置引脚的输出类型为推挽输出/
类型:
GPIO_OType_PP; //推挽
GPIO_OType_OD;//开漏

6. 设置所选管脚速度

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//设定速度为100MHz 高速模式
速度:
GPIO_Speed_100MHz;
GPIO_Speed_50MHz;
GPIO_Speed_25MHz;
GPIO_Speed_2MHz;

7. 设置管脚上拉与下拉与浮空

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; /设置引脚为上拉模式/
模式:
GPIO_PuPd_UP; //上拉
GPIO_PuPd_UP; //下拉
GPIO_PuPd_UP; //浮空

8. 初始化GPIO

 GPIO_Init(GPIOB, &GPIO_InitStructure);    //初始化所设置的引脚

GPIO使用

读取GPIO状态

读取某一个引脚电平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平

读取一组GPIO引脚状态

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平

位操作输入

Int a = PXin(引脚)

读取某个GPIO的输出电平

uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器。
例如:
GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平

读取某组GPIO的输出电平

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输出电平。实际操作的是GPIO_ODR寄存器。
例如:
GPIO_ReadOutputData(GPIOA);//读取GPIOA组中所有io口输出电平

设置GPIO输出

将某个GPIO引脚置1

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:设置某个IO口输出为高电平(1)。实际操作BSRRL寄存器

将某个GPIO引脚口置0

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:设置某个IO口输出为低电平(0)。实际操作的BSRRH寄存器。

设置某一个GPIO引脚的状态

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

设置某一组GPIO引脚的状态

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

位操作

X为GPIO组:A,B,C,D~~~

位操作设置输出电平

PXout(引脚) = 电平

位操作读取输入电平

PXin(引脚)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值