ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1-GPIO操作

2021-03-31 00:00:43  阅读:1029  来源: 互联网

标签:输出 引脚 GPIOx 寄存器 GPIOA 操作 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有