【STM32】GPIO和AFIO标准库使用框架

news2024/9/29 13:28:05

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发

目录

GPIO简介

GPIO时钟使能

GPIO初始化

工作模式

选择引脚

输出速度

函数应用

GPIO初始化框架

8个电平读写函数

写端口电平

 读端口电平

GPIO框架汇总

AFIO简介

AFIO时钟使能

函数应用 

1.引脚重映射

AFIO引脚重映射框架

2.中断引脚选择

AFIO中断配置框架


GPIO简介

GPIO(General Purpose Input Output),通用输入输出口

引脚电平:0V~3.3V,部分引脚可容忍5V

输出模式下可控制端口输出高低电平,可以模拟通信协议输出时序等

输入模式下可读取端口的高低电平,可以模拟通信协议接收数据等

GPIO时钟使能

已知所有GPIO都在APB2总线(如图)

再由RCC时钟树,需要使能APB2外设的GPIO时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

第一个参数选择  RCC_APB2Periph_GPIOX(X为A,B,C...)

第二个参数 为 ENABLE

在每一次复位以后,所有除SRAM和 FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟。

RCC时钟开启后就开始初始化GPIO了

GPIO初始化

工作模式

复位后,I/O端口被配置成浮空输入模式

GPIO有8种工作模式

输入模式

输入模式标准库枚举定义
浮空输入GPIO_Mode_IN_FLOATING

上拉输入

GPIO_Mode_IPU
下拉输入GPIO_Mode_IPD
模拟输入GPIO_Mode_AIN

输出模式 

输出模式标准库枚举定义
推挽输出 GPIO_Mode_Out_PP
开漏输出 GPIO_Mode_Out_OD
复用推挽输出 GPIO_Mode_AF_PP
复用开漏输出GPIO_Mode_AF_OD

推挽输出默认输出低电平

1.如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。

2.如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定

3.外设可以读取输入模式下GPIO值,例如定时器输入捕获和编码器模式等

GPIO中每一位的具体电路结构:

图片来源:STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

选择引脚

选择你需要的引脚:GPIO_Pin_X     X为0,1,2 ...

输出速度

GPIO的输出速度可以限制输出引脚的最大翻转速度(为了低功耗和稳定性)

有三个选择:

最大输出速度为2MHz

最大输出速度为10MHz

最大输出速度为50MHz

(输出速度,输入模式下无作用)

函数应用

GPIO初始化框架

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

8个电平读写函数

实际是读写寄存器

写端口电平

即写输出模式下输出的电平

设置高电平

通过    可以设置多个端口

GPIO_SetBits(GPIOA, GPIO_Pin_13 | GPIO_Pin_1);

设置低电平 

通过   |  可以设置多个端口

GPIO_ResetBits(GPIOA, GPIO_Pin_13);

一位写入 

GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
//GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);也可

十六位整体写入

GPIO_Write(GPIOA, ~0x0001);

 读端口电平

读取一位输入端口电平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取十六位输入端口电平

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

 读取一位输出端口电平

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

 读取十六位输出端口电平

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

GPIO框架汇总

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

//8个读写函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

 默认复用功能不需要AFIO,设置复用输出模式即可

AFIO简介

AFIO(Alternate Function I/O),复用IO口。即一个IO口用在多个外设上,以节省IO资源,提高IO利用率。

作用:复用功能引脚重映射;中断引脚选择

AFIO时钟使能

同GPIO一样,AFIO在APB2总线。

再由RCC时钟树,需要使能APB2外设的AFIO时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

函数应用 

1.引脚重映射

调用一个函数即可,该函数将默认复用功能改为引脚定义表指定的复用功能

示例代码不与上示图片对应,图片只是举个例子

GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);

 部分引脚复位后有已经开启默认复用功能(如:调试端口),需要先解除复用变为普通的GPIO,再使用 引脚重映射函数。例如:

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);

复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式

来自:参考手册

AFIO引脚重映射框架

//选择重映射的IO口为普通GPIO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);

//选择重映射的IO口不是普通GPIO口
//需要解除复用功能,变为普通GPIO口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);

2.中断引脚选择

事件控制寄存器(AFIO_EVCR)

 将Cortex的EVENTOUT连接到指定IO口,中断能得到响应,内核及时处理

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);

AFIO中断配置框架

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度,输入无用
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1980360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Material-UI】深入理解useAutocomplete Hook:自定义与高级用法

文章目录 一、什么是useAutocomplete?导入useAutocomplete 二、基本用法代码解析 三、高级定制1. 自定义选项渲染2. 分组和排序3. 自定义输入框行为4. 与其他组件集成 四、注意事项1. 类型安全2. 性能优化 五、总结 Material-UI提供了强大的Autocomplete组件&#x…

Stable Diffusion绘画 | 图生图-基础使用介绍—重绘幅度与缩放模式

重绘幅度 重绘幅度越大,出图与原图差异越大。 重绘幅度0.7 重绘幅度0.3 缩放模式 目前有以下四种缩放模式: 原图的宽高是1080x1440,当修改宽高,与原图不一致时,可选择其中一种缩放模式来处理图片。 仅调整大小 缩放…

C++入门基础(上篇)

C入门基础(上篇) hello everybody!经历了C语言和初阶数据结构的头脑风暴,相信大家对于编程的学习更加开心,所以说接下来我们将迎来C的学习与探索,话不多说让我们开始吧 namespace的价值 在C/C中,变量、函…

计算机毕业设计选题推荐-自习室座位预约系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

GD32 MCU硬件I2C不可靠不如软件I2C?

在一个评论中,看到网友对硬件I2C的讨论,硬件I2C Busy找不到原因、软件I2C稳得一批。 那么为什么会出现I2C BUSY?硬件I2C真的不如软件I2C吗?怎么让硬件I2C也稳得一批,让我们来一探究竟。 首先我们从I2C时序分析下I2C总…

基于pytorch的steam游戏评分的线性回归问题分析

前言 相信已经暑假一个月的大家肯定并不陌生上面这个学习软件(),面对琳琅满目的游戏总是让人不知道挑选什么,这时候一个游戏的评分往往便成为了一个玩家选择下载的原因,那么今天我们就来研究研究,steam上一个游戏的种种数据&…

Celery注册装饰器@app.task和@shared_task

注册装饰器 app.task和shared_task是Celery中用于定义任务的两种不同装饰器, 它们之间存在明显的区别.from celery import Celery app Celery(my_app, brokeramqp://guestlocalhost//) app.task def my_task(): # 任务逻辑 passfrom celery import shared_task shared…

数据结构——双链表详解(超详细)

前言: 小编在之前已经写过单链表的创建了,接下来要开始双链表的讲解了,双链表比单链表要复杂一些,不过确实要比单链表更好进行实现!下面紧跟小编的步伐,开启今天的双链表之旅! 目录 1.概念和结构…

Pixart LED调变开发笔记

Pixart提供基础的鼠标和键盘代码, 开发者可以基于此快速的建置自己的firmware, application, 以下介绍代码中用来控制LED的API函式. 常亮模式 (Always on) 常亮模式, 调用API "pwm_led_set_always_on" 及 channel 来设置对应LED常亮. 闪烁模式 (Flash mode) 闪烁模…

华为OD机试 - 字符串编码校验(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华…

Unity3D 物体圆周运动

Unity3D 实现一个 2D 物体沿着圆周进行运动。 物体圆周运动 前段时间在开发一个小游戏时,需要实现火箭沿着一个圆形轨道进行圆周运动。 以前面试的时候也被问到过这类问题(如何让一个 2D 物体做圆周运动),所以还是记录一下实现…

ICML 2024 | 矛与盾的较量!北大提出提示无关数据防御保护算法PID

文章链接:https://arxiv.org/pdf/2406.15305 代码地址:https://github.com/PKU-ML/Diffusion-PID-Protection 亮点直击 本文在实证观察中发现,保护阶段和利用阶段之间的提示不匹配可能会削弱当前数据保护算法的有效性。本文深入探讨了利用LDM…

【机器学习第7章——贝叶斯分类器】

机器学习第7章——贝叶斯分类器 7.贝叶斯分类器7.1贝叶斯决策论7.2 朴素贝叶斯分类器条件概率的m估计 7.3 极大似然估计优点基本原理 7.4 贝叶斯网络7.5 半朴素贝叶斯分类器7.6 EM算法7.7 EM算法实现 7.贝叶斯分类器 7.1贝叶斯决策论 一个医疗判断问题 有两个可选的假设&#…

从日常到专业,2024年必备在线翻译神器

现在全球交流越发的简单、频繁,很多时候外语成为了我们汲取新鲜知识的绊脚石。这时候我们就可以借助一些翻译在线的工具来解决这个问题。这次我们一起探索几款我搜集到的翻译工具。 1.福晰在线翻译 链接直通:https://fanyi.pdf365.cn/doc 这个工具支…

本地部署启动PmHub

文章目录 相关配置版本关系拉取代码使用Git clone下载源码 MYSQL配置Nacos配置Windows本地下载也可以Docker部署Nacos持久化配置启动Nacos访问Nacos Redis配置RocketMQ配置新建相应目录rocketmq, 然后在里面新建broker文件夹, 放broker.conf在 rocketmq 新建 data 文件夹&#…

MRAM FRAM在医疗设备场景的应用

便携式超声波扫描仪是一种检测从物体反射的声波并将其转换为实时图像的设备。通常使用配置存储器和图像/报告存储器两种类型的存储器。配置存储器存储来自外部硬件的标识和配置信息,图像/报告存储器存储图像和相应的报告数据。这些存储器即使在突然断电的情况下&…

MySQL介绍和安装与配置

文章目录 MySQL介绍什么是数据库什么是关系型数据库什么是非关系型数据库MySQL概述和历史 MySQL安装和配置在线安装方式MySQL5.7的安裝1.下载yum Repository2.安装yum Repository3.安装mysql5.7的服务3.后续命令 离线安装方式1、卸载已有的MySQL文件2、安装mysql3、后续命令 修…

详细分析Python生成项目依赖包的工具

目录 前言1. pipreqs2. pip freeze3. poetry4. conda5. 总结 前言 在Python项目开发中,管理依赖包是确保项目正常运行的关键步骤 本博客将详细分析几种流行的依赖管理工具,包括 pipreqs、pip freeze、poetry 和 conda,以及它们的使用场景和…

智能硬件创新实训平台-嵌入式、物联网、移动互联网、人工智能实验实训教学平台

智能硬件是继智能手机之后的一个科技概念,通过软硬件结合的方式,对传统设备进行改造,进而让其拥有智能化的功能。智能化之后,硬件具备连接的能力,实现互联网服务的加载,形成“云端”的典型架构,…