其他分享
首页 > 其他分享> > 1-GPIO操作

1-GPIO操作

作者:互联网

本笔记是根据STM32F429单片机的,其他STM32单片机与此类似,基本上都一样的,会一款,其他的基本上没啥问题。本人也是刚学,有不足之处请下方评论。

目录

笔记1 GPIO操作

1.1 读-修改-写操作

1.2 GPIO结构原理

1.3 GPIO 输出配置

GPIO典型应用步骤

1.4 GPIO 常用函数

1、读取电平函数:

2、读取输出电平数

3、设置输出电平

函数

4、反转引脚状态

5、复用功能设置函数


笔记1 GPIO操作

1.1 读-修改-写操作

常用操作:

位与,&:可实现目标字段的清零,而不影响其他字段。

一般格式:操作对象&=屏蔽字。

屏蔽字的目标字段设置为0,其他设置为1.

例如:将GPIOA端口的3号、10号引脚输出低电平,使用位与操作将GPIOA的ODR的3位和10位清零实现。

GPIOA->ODR&=~(1<<3 |1<<10);

其中,~(1<<3 |1<<10)是操作需要的屏蔽字,将1左移3位和1左移10位合并在一起,然后取反得到。

 

位或,|:可实现目标字段的置位,而不影响其他字段。

一般格式:操作对象 | =屏蔽字。

屏蔽字的目标字段设置为1,其他设置为0。

例如:将GPIOA端口的2号、8号引脚输出高电平,使用位或操作将GPIOA的ODR的2位和8位置位实现。

GPIOA->ODR|=(1<<2 |1<<8);

其中,(1<<2 |1<<8)是操作需要的屏蔽字,将1左移2位和1左移8位合并在一起得到。

 

异或,^:可实现目标字段的取反,而不影响其他字段。

一般格式:操作对象^=屏蔽字。

屏蔽字的目标字段设置为1,其他设置为0.

例如:将GPIOA端口的1号、11号和13号引脚的电平反转,使用异或操作将GPIOA的ODR的1位、11位和13位取反实现。

GPIOA->ODR^=(1<<1)| (1<<11) | (1<<13);

其中,(1<<1)| (1<<11) | (1<<13);是操作需要的屏蔽字,将1左移1位、1左移11位和1左移13位合并在一起得到。

1.2 GPIO结构原理

GPIO引脚的内部构造图如图所示,每个GPIO相互独立,包括输入驱动器、输出驱动器、上拉/下拉控制电路和5V耐压保护电路

 

每个通用 I/O 端口包括以下寄存器 :

  1. 4 个 32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPERGPIOx_OSPEEDR GPIOx_PUPDR
  2. 2 个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)
  3. 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、
  4. 1 个 32 位锁定寄存器 (GPIOx_LCKR)
  5. 2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)

每个GPIO有16个引脚,每个引脚都可以单独配置。

GPIO功能描述

根据应用需求,可通过软件将通用 I/O (GPIO) 端口对应的各个引脚位分别配置为多种模式:

● 输入浮空-上电默认模式

● 输入上拉

● 输入下拉

● 模拟功能

● 具有上拉或下拉功能的开漏输出

● 具有上拉或下拉功能的推挽输出

● 具有上拉或下拉功能的复用功能推挽

● 具有上拉或下拉功能的复用功能开漏

                                                                                                                                       GPIO 结构图

 

 

1.3 GPIO 输出配置

对 I/O 端口进行编程作为输出时:

●输出缓冲器被打开: 开漏模式和推挽模式

● 施密特触发器输入被打开

● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻

● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

● 对输入数据寄存器的读访问可获取 I/O 状态

● 对输出数据寄存器的读访问可获取最后的写入值

 

推挽输出:

可以直接输出高电平和低电平。 

开漏输出:

默认只可以输出低电平

输出高电平需要加上拉电阻拉高。

GPIO 复用功能配置

● 可将输出缓冲器配置为开漏或推挽

● 输出缓冲器由来自外设的信号驱 动(发送器使能和数据)

● 施密特触发器输入被打开

● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻

● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

● 对输入数据寄存器的读访问可获取 I/O 状态

GPIO模拟配置

● 输出缓冲器被禁止。

● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被 强制处理为恒定值 (0)。

● 弱上拉和下拉电阻被关闭。

● 对输入数据寄存器的读访问值为“0”。

注意:在模拟配置中,I/O 引脚不能为 5 V 容忍。

GPIO典型应用步骤

使用库函数实现GPIO的应用,一般需要以下几步:

(1)使能GPIO的时钟(非常重要),涉及以下文件:

头文件:stm32f4xx_rcc.h

源文件:stm32f4xx_rcc.c

使用的主要函数:

RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)

RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState)

RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

例如:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE)

(2)设置对应于片上外设使用的GPIO工作模式。

确定GPIO输入模式

如果是输出要确定是推挽还是开漏输出

配置输出速度模式

输出时,内部上拉/下拉电阻要不要开

(3)如果使用复用功能,需要单独设置每一个GPIO引脚的复用功能。

(4)在应用程序中读取引脚状态、控制引脚输出状态或使用复用功能完成特定功能

                                              

1.4 GPIO 常用函数

1、读取电平函数:

1)、uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

参数1:GPIO操作对象,

参数2:操作引脚。

作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。该函数每次只能获取一个引脚状态。

例如:

GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平

2)、 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。该函数获取GPIO的IO口状态

例如:

GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有IO口输入电平

2、读取输出电平数

1)、uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器。

例如:

    GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平

2)、uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

作用:读取某组GPIO的输出电平。实际操作的是GPIO_ODR寄存器。

例如:

GPIO_ReadOutputData(GPIOA);//读取GPIOA组中所有io口输出电平

3、设置输出电平

函数

1)、void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出为高电平(1实际操作BSRRL寄存器。该函数可同时设置多个引脚。

例如:

GPIO_SetBits(GPIOA, GPIO_Pin_5);//设置GPIOA.5输出高电平

2)、void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出为低电平(0)。实际操作的BSRRH寄存器。该函数可同时设置多个引脚。

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

作用:设置某个GPIO为特定电平,实际操作的是置位/复位寄存器。

例如:设置GPIOA 2号引脚为高电平。

GPIO_ WriteBit(GPIOA,GPIO_Pin_2,Bit_SET);

GPIOA  5号引脚为高电平。

GPIO_ WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);

该函数只能设置一个引脚状态。

4)、void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

作用:设置某个GPIO所有引脚为特定电平,实际操作的输出数据寄存器。

参数2:16位的无符号数据,此数据每一位队形控制一个引脚的输出状态,0代表低电平,1代表高电平。

例如:设置GPIOA所有引脚为高电平

GPIO_Write(GPIOA,0xffff)

这两个函数不常用,也是用来设置IO口输出电平。

4、反转引脚状态

1)void GPIO _ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:将GPIO引脚状态反转。使用位异或操作输出数据寄存器。

例如:设置GPIOA的3、5号引脚状态反转。

GPIO _ToggleBits(GPIOA,GPIO_Pin_3| GPIO_Pin_5)

5、复用功能设置函数

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);

作用:将GPIO的某个引脚设置为特定的复用功能。操作的是复用功能低位寄存器或复用功能高位寄存器。

标签:输出,引脚,GPIOx,寄存器,GPIOA,操作,GPIO
来源: https://blog.csdn.net/qq_38575895/article/details/115339010