stm32学习笔记---GPIO输入(理论部分)

目录

GPIO输入模式下的硬件和电路

按键原理

传感器原理

什么是上下拉电阻?

运算放大器当做比较器

按键的硬件电路

传感器的硬件电路

STM32用到的C语言知识

STM32中的C语言数据类型

C语言中的宏定义

typedef和define的区别是什么?

C语言的枚举


声明:本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记,我之所以记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以配套本专栏食用,如有问题可以QQ交流群:963138186

本节我们来学习GPIO的输入部分。

GPIO输入模式下的硬件和电路

我们先来看一下GPIO输入模式下的硬件和电路。

按键原理

首先是按键,这个按键是最常见的输入设备了。按键里面的电路逻辑和按键抖动现象之前的51单片机专栏有详细解释过,这里不再赘述。

下面这个图就是我们套件里的按键实物图,上面白色的是按钮,下面有两个引脚。

传感器原理

接着我们再来看一下传感器模块的介绍:

我们套件里提供了四种传感器模块,分别是光敏电阻传感器、热敏电阻传感器、对射式红外传感器,反射式红外传感器。

传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,比如光线越强,光敏电阻的阻值就越小,温度越高,热敏电阻的阻值就越小。红外光线越强,红外接收管的阻值就越小,但是电阻的变化不容易直接被观察,所以我们通常将传感器件与定值电阻进行串联分压这样就可以得到模拟电压的输出了,对电路来说,检测电压就非常容易了。另外这个模块还可以通过电压比较器进行二值化即可得到数字电压输出

它们的电路结构和工作原理都差不多,我们来具体看一下传感器模块的电路:

我们先看这部分:

N1就是传感器元件所代表的可变电阻,它的阻值可以根据环境的光线温度等模拟量进行变化。

上面的R1是和N1进行分压的定值电阻,R1和N1串联,一端接在VCC正极一端接在GND负极,这就构成了基本的分压电路。

左边这个C2是一个滤波电容,它是为了给中间的电压输出进行滤波的,用来滤除一些干扰,保证输出电压波形的平滑。

一般我们在电路里遇到这种一端接在电路中另一端接地的电容都可以考虑一下这个是不是滤波电容的作用。如果是滤波电容的作用,这个电容就是用来保证电路稳定的,并不是电路的主要框架。这时候我们在分析电路的时候,就可以先把这个电容给抹掉。这样就可以使我们的电路分析更加简单。

我们把这个电容抹掉,整个电路的主要框架,就是定值电阻和传感器电阻的分压电路了。

在这里可以用分压定理来分析一下传感器电阻的阻值变化,对输出电压的影响。当然我们还可以用上下拉电阻的思维来分析。当这个N1阻值变小时,下拉作用就会增强,中间的AO端的电压就会拉低,极端情况下,N1阻值为零,AO输出被完全下拉输出0V。

当N1阻值变大下拉作用就会减弱,中间的引脚,由于R1的上拉作用,电压就会升高,极端情况下,N1阻值无穷大,相当于断路输出。电压被R1拉高至VCC。

这是用上下拉电阻来分析电路的。

什么是上下拉电阻?

上下拉电阻的工作逻辑

我们可以举个例子来说明上下拉电阻的工作逻辑:

AO这个输出端可以把它想象成一个放在屋里的水平杆子R1上拉电阻相当于栓在屋顶的弹簧,将杆子往上拉。N1下拉电阻相当于拴在地面的弹簧,将杆子往下拉,这个电阻的阻值越小,弹簧的拉力就越强。这个杆子的高度就相当于电路中的电压。如果只有上拉弹簧或者下拉弹簧,杆子肯定被拉到了屋顶,或者地面,在电路中就相当于中间点的电压为VCC或者GND。

当两个弹簧相互拉扯的时候,中间的输出端就会向拉力强的一端偏移。至于偏移多少,就取决于两个弹簧的弹力之差了。如果上下拉弹簧的弹力一致,则杆子会处于居中的位置,也就是电路输出VCC/2的电压。如果上面的阻值小拉力强,输出电压就会变高。反之,下面的阻值小输出电压就会变低。如果阻值为零,在电路中就是短接的状态,就相当于拉力无穷大了。

如果上下拉电阻的阻值都为0,就是两个无穷大的力在对抗,在电路中呈现的状态就是电源短路。所以这种情况应该避免。这个上拉电阻和下拉电阻在单片机电路中会经常出现。比如弱上拉,弱下拉强,上拉强下拉等,这里强和弱就指电阻阻值的大小也就是这个弹簧弹力的大小。上拉和下拉就指接到VCC还是GND,也就是这个杆子是拉向屋顶还是拉向地面。最终的输出电压就是在弹簧拉扯下最终杆子的高低。

大家以后再遇到上拉电阻和下拉电阻的分析就可以尝试一下用这个杆子和弹簧的模型来分析一下。

我们回到这个电路继续来看,在这两个电阻的分压下,AO就是我们想要的模拟电压输出了。

所以这里可以看到这个AO电压,就直接通过这个排针输出了。

这就是AO电压的由来仅需两个电阻,分压即可得到。

这个模块还支持有数字输出,这个数字输出就是对AO进行二值化的输出。这里二值化是通过这个芯片LM393来完成的。

这个LM393是一个电压比较器芯片,里面有两个独立的电压比较器电路,

然后剩下的是VCC和GND供电

我们VCC就接到电路的VCC,GND也接到了电路的GND。

这里有个电容是一个电源供电的滤波电容。

这个电压比较器其实就是一个运算放大器,有关运算放大器的知识。我在51单片机专栏已经详细讲过,大家不会的可以去看一下。

单片机学习笔记---AD/DA工作原理(含运算放大器的工作原理)_简述da和ad转换的原理-CSDN博客

运算放大器当做比较器

这里讲一下运算放大器当做比较器的情况:

当这个同向输入端的电压大于反向输入端的电压时,输出就会瞬间升为最大值,也就是输出接VCC。

反之,当同向输入端的电压小于反向输入端的电压时,输出就会瞬间降为最小值,也就是输出接GND

这样就可以对一个模拟电压进行二极化了。

实际的应用中,这里同相输入端IN+接到了AO这里,就是模拟电压端,

IN-接了一个电位器

这个定位器的接法也是分压电阻的原理。拧动电位器IN-就会生成一个可调的阈值电压,

两个电压进行比较,最终输出结果就是DO数字电压输出。

DO最终就接到了引脚的输出端,

这就是数字电压的由来。

然后右边这里还有两个指示灯,电路左边的是电源指示灯,通电就亮。

右边的是DO输出指示灯,它可以指示DO的输出电平,低电平点亮高电平熄灭

右边DO这里还多了个R5上拉电阻,这个是为了保证默认输出为高电平的。

然后就是P1的排针,分别是VCC、GND、DO和AO。

对于光敏电阻传感器来说,

这个N1就是光敏电阻

对于热敏电阻传感器来说,

这个N1就是热敏电阻,

对于这个红外传感器来说,

这个N1就是一个红外接收管。

当然对应还会多一个点亮红外发射管的电路在这里。发射管发射红外光,接收管接收红外光,模拟电压就表示的是接收光的强度。

这个模块的这里

电位器是直接换成了两个电阻进行分压。这样数字输出就是固定阈值的二极化了。这个模块通常用来检测通断。所以阈值也不需要过多的调整。

最后一个模块也是一个红外发射管和接收管。

只不过它是向下发射红外光,然后检测反射光的,这个可以用来做寻迹小车。

按键的硬件电路

接下来我们就来看一下按键和传感器模块的硬件电路。

按键这里给了4种接法,上面两个是下接按键的方式,

下面两个是上接按键的方式

一般来说我们的按键都是用上两种方式也就是下接的方式。这个原因跟LED的接法类似,是电路设计的习惯和规范。

我们先来看一下第一个图,这种接法是按键的最常用的接法。

在这里随便选取一个GPIO口,比如PA0,然后通过K1接到地

当按键按下时,PA0被直接下拉到GND,此时读取PA0口的电压就是低电平。

当按键松手时,PA0被悬空,悬空会出现引脚的电压不确定,所以在这种接法下,必须要求PA0是上拉输入的模式,否则就会出现引脚电压不确定的错误现象。

如果PA0是上拉输入的模式,引脚再悬空PA0就是高电平。所以这种方式下,按下按键引脚为低电平,松手引脚为高电平。

接着再看一下第二个图,相比较第一个图在这里外部接了一个上拉电阻,

大家可以把它想象成一个弹簧,把这个端口往屋顶上拉,当按键松手时,引脚由于上拉作用自然保持为高电平。当按键按下时,引脚直接接到GND,也就是一股无穷大的力,把这个引脚往下拉,弹簧肯定对抗不了无穷大的力,所以引脚就为低电平。

这种电路连接的情况下引脚不会出现悬空状态,所以此时PA0引脚可以配置为浮空输入或者上拉输入。如果是上拉输入,就是内外两个上拉电阻共同作用。

这时高电平就会更强一些,对应高电平就更加稳定,当然这样的话,当引脚被强行拉到低时,损耗也就会大一些。

接着第三个图PA0通过按键接到3.3V,这样要求PA0必须要配置成下拉输入的模式。当按键按下时,引脚为高电平。

松手时,引脚回到默认值低电平。

这要求单片机的引脚可以配置为下拉输入的模式,一般单片机可能不一定有下拉输入的模式,所以最好还是用第一张图的接法。这种接法大家了解一下即可。

最后一种接法就是在刚才的这种接法下面再外接一个下达电阻,这个接法PA0需要配置为下拉输入模式或者浮空输入模式。

总结一下,就是上面这两种接法,按键按下时引脚是低电平,松手是高电平。

下面这两种接法按键按下时是高电平,松手是低电平。

左边两种接法必须要求引脚是上拉或者下拉输入的模式。

右边两种接法可以允许引脚是浮空输入的模式,因为已经外置了上拉电阻和下拉电阻。

一般我们都用上面两种接法,下面两种接法用的比较少,到这里按键的硬件电路就介绍完了。

传感器的硬件电路

再看一下右边的传感器模块的电路:

因为是使用模块的方案,所以电路还是非常简单的。VCC接3.3V,GND接GND用于供电。

DO数字输出,随便接一个端口,比如PA0,用于读取数字量。

AO模拟输出,我们之后学ADC模数转换器的时候再讲,现在不用接。

STM32用到的C语言知识

C语言的基础知识这里就不再赘述,今后我们在STM32的学习过程中将会结构体、枚举等相关知识,不懂的可以去一下我在“嵌入式全栈开发”专栏中写的C语言知识

嵌入式全栈开发学习笔记---C语言笔试复习大全索引-CSDN博客

接下来这里还是提一点要注意的C语言相关知识

STM32中的C语言数据类型

了解一下STM32中的C语言数据类型

注意51单片机中int是占16而在stm32中int是占32如果要用16位的数据要用short来表示。这是和51单片机的不同之处不要混淆了。

然后下面还有long和unsigned long占用的也是32跟int是一样的。如果想用64位的,需要用到long long和unsigned long long,不过这个数据类型实在是太大了,我们用的比较少。

float和double都是带符号的数,没有无符号的float和double。

然后我们看一下右边这两列:

这两列写的是C语言stdint.h文件和ST对这些变量的重命名,因为左边这些名字比较长,而且这个int的位数根据系统的不同,还有可能不一样。还有个就是这些名字有时候会名不对题。比如这个char本意是字符型数据的意思按名字来说它就应该存放字符的但是我们单片机通常用它来存放整数而不是字符。

所以综上各种原因,C语言和ST就给这些变量换了个名字。C语言提供的有stdint这个头文件,使用了新的名字,比如int8_t就是char的新名字,表示的意思就是八位整形数据,右边加个_t表示这是用typedef重新命名的变量类型。我们通过名字就知道意思了。

我们以后在写程序的时候,就会按照他的推荐使用这些新的名字。

另外还有ST定义的名字,这是ST库函数以前用的名字。在新版库函数这里已经换成了这些

不过这个新版本库函数仍然支持旧的写法。

推荐大家使用新的数据类型定义

C语言中的宏定义

接下来我们再来看一下C语言中的宏定义

在单片机开发程序中的第一个用途是:

我们经常用一个字符串代替一个数字,便于理解,防止出错。比如我们在程序中1代表上拉输入,2代表下拉输入,3代表浮空输入等等,这时直接用数字来表示,就非常麻烦了,我们就可以用宏定义将数据参数映射到一个字符串上。这样就比较好理解。

然后第二个用途是提取程序中经常出现的参数便于快速修改。比如我们程序里面出现了10个GPIO_Pin_0,这个Pin_0是需要经常修改的,如果一个个修改就太不方便了,这时我们就可以用一个字符串来代替GPIO_Pin_0,然后需要修改的时候,只需要修改一下定义即可。

宏定义的时候是将后面的重命名成前面的,比如#define ABC 12345,即将12345重命名为ABC。

这些就是库函数中宏定义的用法,当然宏定义还有其他的很多用法以后遇到再说。

typedef和define一样可以重定义名字

typedef和define的区别是什么?

区别就是宏定义的新名字在左边,typedef的新名字在右边,然后是宏定义不需要分号,typedef后面必须加分号。

宏定义任何名字都可以换,而typedef只能专门给变量类型换名字。所以,宏定义的改名范围要更宽一些,只不过对于变量类型重命名而言使用typedef更加安全。

注:重命名后旧名字在在程序中也还是可以用的。

C语言的枚举

接下来复习一下C语言的枚举

枚举用途:定义一个取值受限制的整型变量,用于限制变量取值范围;(关于枚举的定义我在我的嵌入式全栈开发专栏中写过,不懂的可以去看看):

嵌入式全栈开发学习笔记---C语言笔试复习大全23-CSDN博客

这里补充一下枚举的引用:

比如:

typedef  enum{

MONDAY=1,

TUESDAY,

WEDSDAY,

}Week_t; //定义枚举并重命名

Week_t week; //定义枚举变量名

week=MONDAY; //引用枚举,将1赋值给week

这个赋值只能按枚举中的定义来。如果你写week=8,编译器就会报警告说枚举中混入了其他变量。如果你写week=1,编译器也会报警告,这种情况要做一下强制类型转换成枚举类型:比如week=(Week_t)1;

另外,这个枚举值也不是必须赋值给枚举变量的,我们可以随意定一个变量,把枚举值赋给它都行。

比如我这里写int a=MONDAY;

如果到现在还对C语言的一些语法和关键字还不熟悉的话,可以去看看我的’“嵌入式全栈开发”专栏中的C语言复习部分:嵌入式全栈开发学习笔记---C语言笔试复习大全索引-CSDN博客

在我们之后的stm32编程中也会不断的和他们打交道。

本节就到这里,我们下一小节继续来学习GPIO输入的代码部分。

QQ交流群:963138186

本篇就到这里,下篇继续!欢迎点击下方订阅本专栏↓↓↓

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算期末综合测试题

云计算综合测试题 单选题填空题判断题简答题 单选题 这里选择题,直接以填空题展示,并给出解析 Bigtable是(Google)开发的分布式存储系统 解析:分布式结构化数据表Bigtable是Google基于GFS和Chubby开发的分布式存储系统…

FlowUs2024重磅革新预告:RAG技术赋能『问问AI』,笔记变现新纪元等你开启!

🎉 在FlowUs的广阔天地间,知识的边界被无限拓展,引领着一场场创新与收获的庆典!🚀 随着一年间不断的精进与革新,FlowUs与众多用户并肩前行,在追求极致体验的道路上迈出坚实步伐。步入2024年&am…

STM32CubeIDE提示找不到头文件(No such file or directory)的解决办法

0 前言 最近在使用STM32CubeIDE时,发现为工程添加了头文件路径,但编译的时候还是报错,提示找不到头文件: 1 解决办法 1.1 为工程添加头文件路径 右键我们的工程,然后添加头文件路径(最好是相对路径&am…

【开发】内网穿透ztncui搭建私有节点

文章目录 写在前面一键部署ztnuci记录后续 写在前面 前面搭建moon节点转发的确会降低延迟,但是总有出现moon节点解析不成功的例子,于是疯狂寻找答案是为什么?终于在知乎上找到这样一个答案。 一键部署ztnuci 参考这篇很完善的教程和贴心的…

Temu(拼多多跨境电商) API接口:获取商品详情

核心功能介绍——获取商品详情 在竞争激烈的电商市场中,快速、准确地获取商品数据详情对于电商业务的成功至关重要。此Temu接口的核心功能在于其能够实时、全面地获取平台上的商品数据详情。商家通过接入Temu接口,可以轻松获取商品的标题、价格、库存、…

【已解决】在IDEA中使用Git拉取代码时提示:Can‘t update / master has no tracked branch

文章目录 问题描述原因分析解决方案 问题描述 在IDEA中使用Git拉取代码,尝试更新本地项目代码,提示 " Cant update / master has no tracked branch ",如下图所示: 原因分析 出现上述问题意味着本地名为master的分支&…

如何降低MCU系统功耗?

大家在做MCU系统开发的时候,是否也碰到过降低MCU系统功耗的需求? MCU系统整板功耗是个综合的数据,包括MCU功耗以及外部器件功耗,在此我们主要介绍如何降低MCU的功耗: 可以在满足应用的前提下,降低MCU的运…

仿饿了么加入购物车旋转控件 - 自带闪转腾挪动画 的按钮

, mWidth - mCircleWidth, mHeight - mCircleWidth); canvas.drawRoundRect(rectF, mHintBgRoundValue, mHintBgRoundValue, mHintPaint); //前景文字 mHintPaint.setColor(mHintFgColor); // 计算Baseline绘制的起点X轴坐标 int baseX (int) (mWidth / 2 - mHintPaint.m…

数据结构与算法引入(Python)

华子目录 引入第一次尝试第二次尝试 算法的概念算法的五大特性 算法效率衡量执行时间单靠时间值绝对可信吗? 时间复杂度与 "大O记法"如何理解 “大O记法” 最坏时间复杂度时间复杂度的几条基本计算规则 算法分析常见的时间复杂度常见时间复杂度之间的关系…

【进阶篇-Day5:JAVA常用API的使用(Math、BigDecimal、Object、包装类等)】

目录 1、API的概念2、Object类2.1 Object类的介绍2.2 Object的toString()方法2.3 Object的equals()方法2.4 Objects概述 3、Math类4、System类5、BigDecimal类6、包装类6.1 包装类的概念6.2 几种包装类(1)手动转换包装类:(2&#…

前端Web开发HTML5+CSS3+移动web视频教程 Day1

链接 HTML 介绍 写代码的位置:VSCode 看效果的位置:谷歌浏览器 安装插件 open in browser: 接下来要保证每次用 open in browser 打开的是谷歌浏览器。只需要将谷歌浏览器变为默认的浏览器就可以了。 首先进入控制面板,找到默…

实时语音翻译软件哪个好?多语言实时沟通无负担

众所周知,英语是国际交流的共同语言。无论是跨国商务洽谈还是学术研讨,英语的流畅使用至关重要。 然而,语言的障碍依然存在,这时一款高效的英语语音翻译软件就显得尤为关键。它们能够即时转换语言,让我们的对话无国界…

Java模拟马尔可夫链类问题的验证

马尔可夫链(Markov Chain, MC)是概率论和数理统计中具有马尔可夫性质(Markov property)且存在于离散的指数集(index set)和状态空间(state space)内的随机过程(stochasti…

“Jedis与Redis整合指南:实现高效的Java应用与Redis交互“

目录 #. 概念 1. 导入jedis依赖 2. 写一个类(ping通redis) 3. String字符串使用 3.1 set,get方法使用(设值,取值) 3.2 mset,mget方法使用(设置多个值,取多个值&…

没有主题只是一些想法

自己随感,杂乱无章。 AI: 生命减熵过程中的关键进化策略及其对企业和个人的启示 生命的减熵过程,即生命体对抗自然熵增趋势,维持自身有序性和复杂性的过程,体现了生命体在演化中的高度适应性和创新性。从学术化的角度来看&…

基于nsight_compute进行kernel性能分析

当利用nsight进行性能分析时,当涉及到内核级别的性能分析时,nvidia提供了系统级别(nsight system),和内核级别的性能分析工具(nsight compute)。 其中,内核级别的性能分析,可以检查kernel实现的…

自动更新阿里云CDN SSL证书

deploy-certificate-to-aliyun 随着各大CA机构开始收割用户,云厂商们提供的免费SSL证书也由之前的12个月变成现在的3个月。笔者一直使用阿里云的OSS作为图床,说实话在如果继续在阿里云上三个月免费一换也太频繁了 笔者在这里使用github action来每隔两个…

CentOS系统查看版本的各个命令

cat /etc/centos-release 查看CentOS版本 uname -a 命令的结果分别代表:当前系统的内核名称、主机名、内核发型版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称 cat /proc/version 命令用于查看Linux内核的版本信息。执行该命令后&#xf…

练手代码之使用Python实现合并PDF文件

如果你有合并PDF的需要,你会怎么办 我们无所不能的程序员会选择写一个Python代码来实现(谁会这么无聊?是我),如果真的有PDF操作需要,我推荐你使用PDF Expert这个软件哈~ 话不多说直接上代码: …

高通安卓12-OTA 升级

1.OTA介绍 OTA 英文全称是 Over-the-Air Technology,即空间下载技术的意思。 OTA 升级是 Android 系统提供的标准软件升级方式。它功能强大,可以无损失升级系统,主 要通过网络[例如 WIFI、3G]自动下载 OTA 升级包、自动升级,但…