​5- GPIO操作

news/2024/7/5 2:43:15

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

目录

笔记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_OTYPER、GPIOx_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) 端口对应的各个引脚位分别配置为多种模式:

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

● 输入上拉

● 输入下拉

● 模拟功能

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

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

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

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




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、反转引脚状态

1void 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的某个引脚设置为特定的复用功能。操作的是复用功能低位寄存器或复用功能高位寄存器。


http://lihuaxi.xjx100.cn/news/101269.html

相关文章

JUC - 多线程之JMM;volatile(七)

一、JMM Java Memory Model&#xff08;JMM&#xff09;Java内存模型&#xff0c;区别与java内存结构。JMM定义了一套在多线程读写共享数据&#xff08;变量、数组&#xff09;时&#xff0c;对数据的可见性、有序性和原子性的规则和保障 &#xff08;一&#xff09;JMM结构规…

Java中List集合详解

目录 一&#xff1a;Connection接口: 二&#xff1a;Map接口 三&#xff1a;Iterator迭代器&#xff0c;增强for List , Set, Map都是接口&#xff0c;前两个继承至Collection接口&#xff0c;Map为独立接口Iterator接口也是Java集合中的一员&#xff0c;但它与Collection、…

C++复习第二天:类与对象

1. 什么是面向过程&#xff1f;什么是面向对象&#xff1f; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出解题过程的步骤&#xff0c;调用函数来实现。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事物划分成不同的对象&#xff0c;通过不…

【车间调度】基于全球邻域和爬坡来优化模糊柔性作业车间调度问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

python数学建模--线性规划问题案例及求解

目录数学问题&#xff1a;线性规划问题程序设计结果分析实际应用1&#xff1a;加工厂的生产计划设置未知数建立数学模型程序设计结果分析实际应用2&#xff1a;油料加工厂的采购和加工计划设置未知数建立数学模型程序设计结果分析遗留的问题钢管加工用料问题分析scipy.optimize…

全网最全学习攻略【尚硅谷电影推荐系统】附视频代码链接

简述 因为设计任务是开发一款图书推荐系统&#xff0c;但是没有现成的系统开发讲解&#xff0c;于是从网上找到了尚硅谷电影推荐系统的开发教程。 从配置虚拟机到开发各种推荐功能共耗时一个月左右&#xff0c;小破站里的视频教程很多但是有的是武老师少录了&#xff0c;有的是…

拓端tecdat|R语言实现 Copula 算法建模相依性案例分析报告

原文链接&#xff1a;http://tecdat.cn/?p6193 原文出处&#xff1a;拓端数据部落公众号 copula是将多变量分布函数与其边缘分布函数耦合的函数&#xff0c;通常称为边缘。Copula是建模和模拟相关随机变量的绝佳工具。Copula的主要吸引力在于&#xff0c;通过使用它们&#x…

计算机网络——4.1

作业4.1 题量: 38 满分: 138 作答时间:10-18 16:51至10-24 23:55 智能分析 127分 一. 单选题&#xff08;共26题&#xff0c;78分&#xff09; 1. (单选题, 3分)下列IP地址中作为环回地址用于本地软件环回测试的是&#xff08;&#xff09; A. 128.0.0.0B. 192.0.0.0C. 12…