【STM32进阶笔记】GPIO端口

  前段时间由于其他原因,专栏暂停更新了较长一段时间,现在恢复更新,争取继续为大家创造有价值的内容,期待大家的订阅关注,欢迎互相学习交流。

STM32速成笔记系列专栏中其实已经对GPIO的一些必要知识进行了介绍,但是如果我们想要深入了解GPIO的一些寄存器知识和各种输入输出模式,还需要继续深入学习,本文就让我们一起来深入学习GPIO的相关内容。

文章封面

PS:笔者能力有限,文章如有错漏之处,还请各位不吝赐教,感谢大家的支持!

文章目录

  • 一、GPIO简介
  • 二、GPIO寄存器
    • 2.1 端口配置寄存器低/高
    • 2.2 端口输出寄存器
    • 2.3 端口设置/清除寄存器
    • 2.4 端口清除寄存器
  • 三、硬件分析
    • 3.1 推挽输出
    • 3.2 开漏输出
  • 四、程序分析

一、GPIO简介

每个GPI/O端口有两个32位配置寄存器(GPIOX CRL,GPIOx CRH),两个32位数据寄存器(GPIOX IDR和GPIOx ODR),一个32位置位1复位寄存器(GPIOx BSRR),一个16位复位寄存器(GPIOx BRR)和一个32位锁定寄存器(GPIOx LCKR)。根据数据手册中列出的每个!/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成多种模式。

每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOX BSRR和GPIOX BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问:这样,在读和更改访问之间产生IRQ时不会发生危险。

上面一段文字是STM32中文参考手册中对于GPIO功能的描述,这有一个关键就是I/O寄存器必须按照32位来操作,我们在看一些程序工程时可能会看到如下的宏定义

// SDA方向
#define MPU_SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

这里也是严格按照32位来操作了GPIO,关于上面两句具体是什么作用,是怎么实现的,我们下面随着学习的深入会一步一步来分析。

我们知道I/O有多种输入输出模式,在STM32中文参考手册的GPIO功能描述部分给出了各种模式的配置方法

输入输出配置方法

复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式,复位后JTAG引脚会被配置成对应的输入输出模式。

在使用时需要注意们尽量不要使用这些引脚,具体是哪些引脚以及如果必须使用这几个引脚改怎么办,在STM32速成笔记专栏中有介绍,这里就不再赘述了。

当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚,输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。

二、GPIO寄存器

我们这里介绍几个关键的GPIO寄存器

2.1 端口配置寄存器低/高

每一个GPIOx都有16个引脚0~15,每一个GPIO引脚的输入输出配置需要4bit,一个寄存器是32bit,所以想要能配置16个引脚的输入输出模式需要两个GPIO配置寄存器,所以在STM32参考手册中有高低之分,低控制0到7,高控制8到15,我们只附一个GPIO配置寄存器低的图,高的是类似的。
GPIO配置寄存器低

我们看到这里介绍的时候只给出了“上拉/下拉式输入模式”并没有说明怎么配置是上拉输入,怎么配置是下拉输入,这时我们可以结合上面的表格17来参考。

另外笔者在看的时候注意到“输入模式”后面写着“复位后的状态”,导致笔者以为如果想从输出模式配置成输入模式需要复位操作,后来明白这里的意思应该是引脚复位后的默认状态应该是浮空输入模式。

2.2 端口输出寄存器

结合GPIO配置寄存器和上面的表格,加入我们想要配置一个GPIO的某各引脚为上拉输入模式,我们需要配置它的CNFy[1:0]为10,配置它的MODEy[1:0]为00,还需要再配置ODR寄存器来确定是上拉输入模式而不是下拉,我们来看一下端口数据输出寄存器(GPIOx_ODR寄存器)的描述。

端口数据输出寄存器

2.3 端口设置/清除寄存器

我们想要配置成上拉输入模式,需要将GPIOx_ODR对应位设置成1,从上面对于ODR寄存器描述来看,我们可以借助GPIOx_BSRR寄存器来单独操作ODR寄存器的值,STM32参考手册中对于段端口位设置/清除寄存器(GPIOx_BSRR)的描述如下。

端口位设置/清除寄存器
根据寄存器描述,我们只需要将对应端口的BS位设置成1即可完成上拉输入模式的配置。

2.4 端口清除寄存器

除了可以通过上面的GPIOx_BSRR来清除对应的ODR位之外,还提供了一个端口清楚寄存器(GPIOx_BRR)来单独清除,和上面的GPIOx_BSRR的清除方法是一样的,这里就不再做赘述了。

此外还有一个端口配置锁定寄存器(GPIOx_LCKR)这里也不做介绍了。

三、硬件分析

下面我们来简单分析一下端口配置成不同模式时的硬件电路,从而更深的理解他们的区别,这里之分析推挽式输出与开漏输出。在STM32中文参考手册中给出了输出的配置图并且针对推挽式输出和开漏输出给出了一些描述

输出配置

  • 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
  • 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。

如果只是从表面上来理解的话,推挽式输出是具有实际输出能力的,也就是说推挽式输出的高电平可以真正的驱动负载,而开漏输出无法输出真正的高电平,也就是说开漏输出的高电平是无法驱动负载的。

针对其中的细节电路已经有很多博主作了介绍,由于笔者对于硬件不擅长,所以就不露怯了,指从表面上来分析一下推挽输出与开漏输出的区别。

我们单独把上图的输出驱动器部分摘出来看一下

输出驱动器

3.1 推挽输出

我们先分析一下推挽式输出

  • 当P-MOS打开,N-MOS关闭时,输出高电平,电流会流出去,这就叫“推”
    推
  • 当P-MOS关闭,N-MMOS打开时,输出低电平,电流会流进来,这就叫“挽”
    挽

3.2 开漏输出

下面我们再来看一下开漏输出,端口配置为开漏输出时,P-MOS一直处于关闭状态,当N-MOS打开时,输出高电平,当N-MOS关闭时,处于一个高阻态/浮空。我们既然已经有了推挽输出,而且开漏输出还需要一个上拉电阻才能输出高电平,那为什么还需要开漏输出呢?下面我们就介绍一下开漏输出的用处。

首先第一个,根据STM32中文参考手册中的描述,在开漏模式时,对输入数据寄存器的读访问可得到I/O状态,也就是说,如果我们把引脚初始化为开漏输出模式,我们需要读取引脚输入时就不需要再把引脚配置成输入模式了。但是在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值,所以如果引脚配置的是推挽输出,那么需要读取引脚数据时需要重新初始化成输入模式。开漏输出的这个特点对于在进行IIC通信或者其他共用数据线的总线通信中十分友好,不需要重新初始化SDA引脚为输入模式也可以读取引脚数据。

第二个,开漏输出可以用来匹配电平,比如我们有一个单片机的引脚输出是5V,但是我们的目标器件电压是3.3V,此时我们可以初始化引脚为开漏输出,外部接一个3.3V上拉电阻,这样的话当我们的GPIO处于高阻态时输出端就会被上拉电阻拉到3.3V,同理反过来也是一样的,也就是说STM32的引脚配置成开漏输出外部接一个5V上拉电阻就能实现5V输出,STM官方社区也给出了这个说明,但是笔者没有尝试过,所以大家请谨慎尝试。

第三呢就是可以支持几个设备同时挂接到同一条线上,比如我们使用IIC通信,有多个主设备时如果我们设置成推挽输出,可能会导致主设备之间产生短路。

最后就是开漏输出能够实现线与操作,什么是线与?线与简单理解就是当一根总线上的设备输出全部为高电平时,总线处于高电平状态,一旦有一个设备的输出是低电平,总线处于低电平状态。比如在IIC总线的仲裁机制就是通过线与逻辑实现的,我们知道当主机要开启IIC通信时需要先发送一个起始信号,也就是在SCL为高时,将SDA拉高,再拉低,但是当IIC总线上有多个主设备时,就需要有一个仲裁机制来判断谁先占用总线,谁后占用总线。当主设备将SDA拉高后,需要检查SDA的电平如果此时SDA电平为高,说明主设备可以占用总线,如果此时SDA电平为低,说明总线已经被其他设备占用。

四、程序分析

最后我们说回来最开始介绍的两行代码

// SDA方向
#define MPU_SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

对照上面的表格与寄存器我们可以知道,第一行是将SDA配置成了下拉输入模式,第二行是将SDA配置成了通用推挽输出模式,对应的引脚是PB7。

我们从这个配置来说,可以推测他在初始化IIC引脚是配置的是推挽输出模式,所以需要不断地切换SDA引脚的输入输出状态,不是很友好,而且当总线上需要有多个主设备时会造成短路,所以建议后续IIC引脚还是初始化成开漏输出模式。

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

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

相关文章

GPT4O给Qwen2生成的高考作文打分56分,从“小白”进阶技术大神的开发者基于国产GPU推理模型效果可还行?

OpenI启智社区上线的【芯动开源】首场活动-天数智芯挑战专场即将迎来最后一周的冲刺阶段&#xff0c;自2024年5月27日上线以来&#xff0c;这期间&#xff0c;我们见证了天数智芯通用GPU加速卡在适配AI模型方面的无限可能与开发者们开源精神的璀璨光辉。 在短短的两周时间里&a…

代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、 108.将有序数组转换为二叉搜索树、 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接&#xff1a;669. 修剪二叉搜索树 文档讲解&#xff1a;代码随想录 状态&#xff1a;还可以 思路&#xff1a; 如果节点的值在[low, high]之间&#xff0c;则递归修剪它的左子树和右子树。 节点值小于low&#xff1a;如果节点的值小于low&#xff…

智慧工厂自动装车解决方案:H13三维轮廓扫描激光雷达

激光雷达在智慧工厂自动装车的应用场景在智慧工厂的自动装车场景中&#xff0c;激光雷达的应用显得尤为关键。这种技术以其精确的测量和定位能力&#xff0c;助力自动化装车的每一个环节&#xff0c;大大提高了装车的效率和准确性。 首先&#xff0c;激光雷达在车辆定位方面发挥…

[next.js] svgr/webpack

nextjs如何配置svg文件&#xff0c;使其像react组件一样导入? 当前next.js 开发环境我使用了--turbo 来开启turbopack加速文件构建&#xff0c;所以之前的一些webpack loader之类的无法正常工作。通过搜索发现一般都是使用svgr/webpack来处理svg&#xff0c;打开svgr官网发现…

vscode 连接 GitHub

文章目录 连接 GitHub一、通过 SSH 连接 github二、通过 HTTPS 连接 github 连接 GitHub 在 vscode 中首次使用 git push 命令时会要求输入 github 账户的 username 和 password&#xff0c;这种基本身份验证在 2021.8.13 以前还是可以的&#xff0c;之后的话&#xff0c;就会…

Luma AI 推出梦幻机:据说吊打Sora和快手可灵(KLING)|TodayAI

近日&#xff0c;美国初创公司 Luma AI 宣布推出其最新的文本生成视频工具——梦幻机&#xff08;Dream Machine&#xff09;。这一消息发布的时间正好在中国科技公司快手推出其文本生成视频模型可灵&#xff08;KLING&#xff09;几天之后&#xff0c;标志着视频生成领域的又一…

Android Compose 十一:常用组件列表 compose自己个的 下拉刷新

列表下拉刷新 material3 还没有下拉刷新功能material:1.3.0 之后 swiperefresh 被弃用 被PullRefresh替代使用PullRefresh 需要添加依赖 implementation ‘androidx.compose.material:material:1.6.8’ 先上代码 var refreshing by remember {mutableStateOf(false)} val…

线性代数|机器学习-P12Ax=b条件下x最小值问题

文章目录 1. Axb下的最值问题-图形转换2. Gram-Schmidt 标准形3. 迭代法-Krylov子空间法 1. Axb下的最值问题-图形转换 假设我们有一个直线方程如下&#xff1a; 3 x 1 4 x 2 1 \begin{equation} 3x_14x_21 \end{equation} 3x1​4x2​1​​ 在二维平面上&#xff0c;各个范…

集成学习 #数据挖掘 #Python

集成学习是一种机器学习方法&#xff0c;它通过结合多个模型的预测结果来提高整体性能和稳定性。这种方法的主要思想是“集合智慧”&#xff0c;通过将多个模型&#xff08;比如决策树、随机森林、梯度提升机等&#xff09;的预测集成起来&#xff0c;可以减少单个模型的过拟合…

C# WPF入门学习主线篇(三十一)—— MVVM模式简介

C# WPF入门学习主线篇&#xff08;三十一&#xff09;—— MVVM模式简介 MVVM&#xff08;Model-View-ViewModel&#xff09;模式是WPF开发中的一种重要架构模式。它通过将用户界面&#xff08;View&#xff09;与业务逻辑和数据&#xff08;Model&#xff09;分离&#xff0c;…

【文献阅读】一种多波束阵列重构导航抗干扰算法

引言 针对导航信号在近地表的信号十分微弱、抗干扰能力差的问题&#xff0c;文章提出了自适应波束形成技术。 自适应波束形成技术可以分为调零抗干扰算法和多波束抗干扰算法。 调零抗干扰算法主要应用功率倒置技术&#xff0c;充分利用导航信号功率低于环境噪声功率的特点&…

三个pdf工具和浏览软件(pdftk,muppdf,epdfview)

安装pdftk pdftk是一款功能强大的PDF处理工具&#xff0c;主要用于对PDF文件进行各种操作。它提供了丰富的功能&#xff0c;包括但不限于合并、拆分、旋转、加密、解密、添加水印、从PDF文档中解出附件等。pdftk分为图形界面版本和命令行版本&#xff0c;适用于不同的用户需求…

使用ant-design/cssinjs向plasmo浏览器插件的内容脚本content中注入antd的ui组件样式

之前写过一篇文章用来向content内容脚本注入antd的ui&#xff1a;https://xiaoshen.blog.csdn.net/article/details/136418199&#xff0c;但是方法就是比较繁琐&#xff0c;需要将antd的样式拷贝出来&#xff0c;然后贴到一个单独的css样式文件中&#xff0c;然后引入到内容脚…

活动会议发布平台,让你我的距离再近点

随着科技、经济的不断发展&#xff0c;生活水平的不断提高&#xff0c;人们不仅在工作中追求快捷高效的工作工具&#xff0c;生活中对参加各项活动的热情也不断提升。活动会议发布平台以其便捷、高效的使用方式被越来越多人采用。 一&#xff0e; 活动会议发布平台的用户画像 …

博物馆藏品管理的重要性

博物馆是人们了解历史文化、传承文明的重要场所。而博物馆的藏品管理是博物馆的核心工作之一&#xff0c;对于展现博物馆的魅力、吸引观众的眼球有着至关重要的影响。并且博物馆藏品管理是一项复杂且专业的工作&#xff0c;它涉及到多个方面&#xff0c;包括但不限于藏品的收集…

租房项目之并发缺失数据问题

前奏&#xff1a;本项目是一个基于django的租房信息获取项目。本次博客牵扯到两个版本&#xff0c;集中式分布以及分布式部署&#xff08;两个版本的ui不同&#xff0c;集中式用的是老版ui&#xff0c;分布式使用的是新版ui&#xff09;&#xff1b; 项目链接&#xff1a;http…

Linux2-系统自有服务防火墙与计划任务

一、什么是防火墙 防火墙主要用于防范网络攻击&#xff0c;防火墙一般分为软件防火墙、硬件防火墙 1、Windows中的防护墙设置 2、防火墙的作用 3、Linux中的防火墙分类 Centos6、Centos6>防火墙>iptables防火墙 防火墙系统管理工具 Centos7>防火墙>firewalld防火…

基于STM32的简易智能家居设计(嘉立创支持)

一、项目功能概述 1、OLED显示温湿度、空气质量&#xff0c;并可以设置报警阈值 2、设置4个继电器开关&#xff0c;分别控制灯、空调、开关、风扇 3、设计一个离线语音识别系统&#xff0c;可以语音控制打开指定开关、并且可以显示识别命令词到OLED屏上 4、OLED实时显示&#…

Github 2024-06-14 开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量JavaScript项目2Python项目2非开发语言项目2TypeScript项目1Dart项目1Rust项目1Lua项目1Java项目1Jupyter Notebook项目1从零开始构建你喜爱的技…

大模型Prompt-Tuning技术入门

Prompt-Tuning方法 1 NLP任务四种范式 目前学术界一般将NLP任务的发展分为四个阶段&#xff0c;即NLP四范式&#xff1a; 第一范式&#xff1a;基于「传统机器学习模型」的范式&#xff0c;如TF-IDF特征朴素贝叶斯等机器算法&#xff1b;第二范式&#xff1a;基于「深度学习模…