江协STM32:对射式红外传感器计次和旋转编码器计次

对射式红外传感器计次

还是复制粘贴之前的文件

创建外部中断文件

然后写初始化函数

外部中断函数创建

这里写外部中断函数

看着这个图来配置

具体步骤就是:

第一步,配置RCC,把我们这里涉及的外设的时钟都打开,不打开时钟,外设是没法工作的

第二步,配置GPIO,选择我们的端口位输入模式

第三步,配置AFIO,选择我们用的这一路GPIO,连接到后面的EXTI

第四步,配置EXTI,选择边缘触发方式,比如上升沿,下降沿或者双边沿,还有选择触发响应方式,可以选择中断响应和事件响应,一般都是中断响应

第五步,配置NVIC,给我们这个中断一个合适的优先级

最后,通过,NVIC,外部中断信号就能进入CPU了,这CPU才能收到中断信号,才能跳转到中断函数里执行中断程序

这几步就是外部中断的配置流程

开始编写程序

第一步开启时钟

开启GPIO时钟

这里解释一下为什么开GPIOB的时钟,时钟相当于人的大脑,寄存器是基于触发器,而触发器的赋值是一定需要时钟的,也就是说有时钟cup才能向寄存器写入值。一般用什么外设就要开该外设的时钟。我们这里用的是GPIOB这个外设,所以要开启GPIOB的时钟

开启GPIOB的时钟,这里注意一下,GPIOB是APB2的外设,这里参数是APB2_GPIOB的这个,函数也要用APB2的这个开启时钟函数,注意函数和参数的这个APB2,APB1和AHB要对应起来

第二步开启AFIO的时钟

AFIO也是APB2的外设

如果不确定哪个外设接在哪个总线上,可以转到这个函数的定义,看一看参数表

第三步EXTI,这个外设的时钟是一直打开的,不需要我们再开启时钟了

第四步NVIC,这个外设的时钟是一直打开的,不需要我们再开启时钟了,这个是因为,NVIC是内核的外设,内核的外设都是不需要开启时钟的

第二步配置GPIO

第一个GPIO_Mode,对应外部中断来说,要选择浮空输入,上拉输入,或者下拉输入,这其中的一个模式

像这种其他外设使用GPIO的情况,如果你不清楚该配置为什么模式,可以看手册,GPIO这一章,有一个外设的GPIO配置表,里面优先每个外设的各个引脚都需要配置为什么模式

所以这里就给上拉输入,默认高电平的输入方式

第二个GPIO_Pin,我们用的PB14号口,所以就写GPIO_Pin_14

第三个GPIO_Speed还是GPIO_Speed_50MHz

最后调用GPIO_Init函数,初始化一下GPIO的外设

这样GPIO部分我们就配置好了

第三步,配置AFIO

这个AFIO外设,ST公司并没有给它分配专门的库函数文件,它的库函数是和GPIO再一个文件里的

GPIO_AFIODenlnit这个函数是用来复位AFIO外设的,调用这个函数AFIO外设的配置就会全部清除

GPIO_PinLocConfig这个函数是用来锁定GPIO配置的,调用这个函数,参数你指定某个引脚,那这个引脚的配置就会被锁定,防止意外更改,这个函数用到不多,了解即可

这两个函数是用来配置AFIO的时间输出功能的,用的也不多

这两个函数比较重要了

GPIO_PinRemapConfig可以用来进行引脚重映射

第一个参数可以选择你要重映射的方式,第二个参数是新的状态,目前用不上

GPIO_EXTILineConfig,就是我们这次外部中断所需要用的函数

调用这个函数,就可以配置AFIO的数据选择器,来选择我们想要的中断引脚

GPIO_ETH_MedialnterfaceConfig这个函数跟以太网有关,这个芯片没有以太网外设,所以也用不到

现在继续

现在要配置AFIO外部中断引脚选择,直接复制GPIO_EXTILineConfig这个函数,然后跳转到定义看一下

所以这个函数实际上是AFIO的函数

然后看第二个参数,第二个参数是GPIO_PinSource,指定要配置的外部中断线,这个参数可以是GPIO_PinSourcex,其中x可以是0到15

x改成14,代表连接PB14号口的第14个中断线路

到这里AFIO外部中断已经选择配置就完成了,就这一个函数就行了

当执行完这个函数后,AFIO的第14个数据选择器就拨好了,其中输入端被拨到了GPIOB的外设上,对应的就是PB14号引脚,输出端固定连接的是EXTI的第14个中断线路,这样,PB14号引脚的电平信号就可以顺利通过AFIO,进入到后级EXTI电路了

第四步配置EXTI

先看看EXTI的库函数

这些就是EXTI的所有库函数了

第一个EXTI_Delnit,调用它,就可以把EXTI的配置都清除,恢复成上电默认的状态

第二个EXTI_Init调用这个函数,就可以根据这个结构体里的参数配置EXTI外设,我们初始化EXTI主要用的就是这个函数,使用方法和GPIO_Init也是一样的

第三个EXTI_StructInit调用这个函数,可以把参数传递的结构体变量赋一个默认值

像前面这三个函数,基本的所有外设都有,就像是库哈斯你的模板函数一样,基本每个外设都需要这些类型的函数,这些模板函数使用方法和意思也是一样的

第四个EXTI_GenerateSWInterrupt这个函数是用来软件触发外部中断的,调用这个函数,参数给一个指定的中断线,就能软件触发一次这个外部中断,如果你只需要外部已经触发中断,那就不需要这个函数了

剩下的这个四个函数,也是库函数的模板函数,很多模块都有这个函数 ,因为再外设运行的过程中,会产生一些状态标志位,比如外部中断来了,是不是会有一个挂起寄存器置了一个标志位,对于其他外设,比如串口收到数据,会置标志位,定时器实际到,也会置标志位这些标志位都是放状态寄存器的,当程序想要看这些标志位时,就可以用到这四个函数

162行函数,可以获取指定的标志位是否被置1了

163行函数,可以对置1的标志位进行清除

那对于这些标志位,有的比较紧急,在置标志位后会触发中断,在中断函数里,如果你想查看标志位和清除标志位,那就要164行和165行这两个函数

164行获取中断标志位是否被置1了,

165行,清除中断挂起标志位

总结一下:

如果你想在主程序查看和清除标志位,就用162和163,如果你想在中断函数里查看清除标志位,就用164和165,其实本质上,这四个函数都是对状态寄存器的读写,162,163,和164,165两个类似的功能,都是读写状态寄存器,只不过164和165只能读写与中断有关的标志位,并且对中断是否允许做出了判断,而162,163这两个函数知识一般的读写标志位,没有额外的出来,能不能触发中断的标志位都能读取,所以建议在主程序里用162和163,中断程序里用164和165

到这里,这个EXTI的库函数都看完了

对于EXTI的初始化配置,用EXTI_Init函数就行了

里面只有一个参数就是EXTI初始化的结构体,因为EXTI只有一个,所以不需要像GPIO那样

看一下说明,第一个参数是EXTI_InitSyruct,它是一个EXTI_InitTyoeDef类型的结构体指针,包含了对于EXTI外设的是配置信息

起个变量名叫,EXTI_InitStructure

第一个参数,EXTI_Line,这个是指定我们要配置的中断线

这些就是这个参数的取值,我们需要用PB14所在的第14个线路

所以选择EXTI_Line14

第二个参数,EXTI_LINECmd,指定选择的中短线的新状态,这个参数可以是ENABLE和DISABLE,因为要开启中断,所以选择ENABLE

第二个参数就ok了

第三个参数,EXTI_Mode,指定外部中断线的模式,这个参数可以是EXTIMode_TypeDef里面的一个值

跳转页面

52是中断模式,53是事件模式,我们需要的是中断模式

第三个参数也就ok了

第四个参数,EXTI_Trigger,指定触发信号的有效边沿

这个参数可以是这个定义里的一个值,这里写错了应该是EXTITrigger_TypeDef

64行上升沿触发,65下降沿触发,66上升沿和下降沿都触发,这个选择跟你的实际需求来,这里选择下降沿触发

这样我们的外部中断配置完成了

当前的配置将EXTI的第14个线路配置位中断模式,下降沿触发,然后开启中断,这样PB14的电平信号就能通过EXTI通向下一级NVIC了

现在来执行第五步,配置NVIC

还是先看一下库文件里的函数

196行函数这个函数是用来中断分组的,参数是中断分组的方式

197行函数,这个是根据结构体里面指定的参数初始化NVIC

198行函数,这个是设置中断向量表

199行函数,这个是系统低功耗配置

198和19用的不多先看看就行

我们就用196和197行函数

在配置中断之前,先指定一些中断的分组,然后使用NVIC_Init初始化NVIC就行了

这样分组就完成了,另外注意以,这个分组方式整个芯片只能用一种,所以按理说这个分组代码整个工程只需要执行一次就行了

指定中断通道来开启或关闭

因为是用的GPIOB_Pin14,在10-15的范围内,所以要用这个

然后是IRQChannelCmd,参数可以是ENABLE或者DISABLE,选择ENABLE

这两个参数,是指定所选通道的场站优先级和响应优先级,跳转看看

这个是抢占优先级,这个值可以是0到15

具体可以可以参照这个表,Ctrl+F,搜索一下

可以改一下这里

旋转编码计次

因为对于这个编码器而言

只不过这样在操作上有一写小瑕疵

把14改成0

复制粘贴一下

然后复制一下这个函数

改成1

最后返回Temp,然后就完成了

中断编程的建议:

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

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

相关文章

深入浅出 -- 系统架构之微服务中OpenFeign最佳实践

前面我们讲了一下 Ribbon 和 RestTemplate 实现服务端通信的方法,Ribbon 提供了客户端负载均衡,而 RestTemplate 则对 http 进行封装,简化了发送请求的流程,两者互相配合,构建了服务间的高可用通信。 但在使用后也会发…

c++的学习之路:12、vector(1)

这章主要是根据cplusplus中的文档进行使用Vector,文章末附上测试代码。 目录 一、什么是vector 二、vector的简单使用 三、代码 一、什么是vector 下图是cplusplus的简介,上面一共有六点,如下: 1、vector是表示可变大小数组…

Leetcode 216.组合总和III

题目 思路 题目说只使用数字1-9,是k个数的和 树的宽度是1-9,树的深度是k 1.确定递归函数的返回值及参数: 返回值是void,参数这里还是先设定两个全局变量。一个是path存放符合条件单一结果。如:(1,2&…

VSCODE EIDE使用debug记录

用上vscode之后就感觉之前的keil不太爽了,找什么东西搜索都很麻烦,之前有写过eide的文章,想着能不能在eide里面就把debug也做了,发现真的可以,下面记录一下,主要是参考这个大佬的文章,非常感谢。…

微电网优化:基于肝癌算法(Liver Cancer algorithm, LCA)的微电网优化(提供MATLAB代码)

一、微电网优化模型 微电网是一个相对独立的本地化电力单元,用户现场的分布式发电可以支持用电需求。为此,您的微电网将接入、监控、预测和控制您本地的分布式能源系统,同时强化供电系统的弹性,保障您的用电更经济。您可以在连接…

离线数仓(十)【ADS 层开发】

前言 剩下的 ADS 层主要就是写 SQL 了,就像我们之前练习的 HQL 题一样,不同的是这里的数据从哪张表读取(DWD 还是 ADS 甚至个别表需要从 DIM 层读取)需要我们自己来分析。 ADS 的建表语句和 MySQL 是对应的,我们到时候…

网络协议——HTTP协议

目录 ​编辑 一,HTTP协议基本认识 二,认识URL 三,http协议的格式 1,发送格式 2,回应格式 四,服务端代码 五,http报文细节 1,Post与Get方法 2,Content_lenth 3&…

OpenCV-python安装教程

先安装opencv-contrib-python pip install opencv-contrib-python 再换源安装opencv-python pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 如果出现 使用这个,3.6环境下不能安装opencv的最新版本 pip install opencv-python4.5.5.62…

ST表(Segment Tree)

目录 1.概述 2.引入 3.ST表对引入的优化 1.概述 ST表是一种基于树形结构的数据结构,用于处理区间查询和更新操作。它通过预处理的方式将原始数据存储在树状结构中,以支持高效的区间查询。ST表的构建时间复杂度为O(nlogn),其中n为原始数据…

算法——分治(快速排序)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享分治算法关于快速排序的专题 对于快速排序在我个人主页专栏 <排序> 有详细的介绍,此专题对快排进行了优化操作,并介绍了优化后的快排的几种运用 如果有不足的或者错误的请…

数组方法汇总

数组和链表类似&#xff0c;都是用双指针&#xff0c;但数组不需要额外的指针&#xff0c;可以使用索引来当作指针。&#xff08;链表的时候要注意&#xff0c;什么时候是移动的指针&#xff0c;什么时候是改变的节点&#xff09;删除有序数组中的重复项 注意&#xff0c;本题中…

【数据结构】--- 探索栈和队列的奥秘

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა &#x1f4a1;个人主页&#xff1a;9ilk &#x1f4a1;专栏&#xff1a;数据结构之旅 上回我们学习了顺序表和链表&#xff0c;今天博主来讲解两个新的数据结构 — 栈和队列 &#xff0c; 请放心食用 文章目录 &#x1f3e0; 栈&#x1…

红黑树内部结点数量分析

红黑树内部结点数量分析 一、红黑树的性质二、黑高与内部结点数量2.1最大内部结点数量2.2最小内部结点数量 三、伪代码实现四、C语言代码实现五、结论 红黑树是一种自平衡的二叉搜索树&#xff0c;它通过一系列复杂的性质和操作来维持平衡&#xff0c;从而确保各种动态集合操作…

来get属于你的达坦科技令人心动的offer吧!

我们是谁 达坦科技始终致力于打造高性能Al Cloud 基础设施平台DatenLord&#xff0c;积极推动AI应用的落地。DatenLord通过软硬件深度融合的方式&#xff0c;提供高性能存储和高性能网络。为AI 应用提供弹性、便利、经济的基础设施服务&#xff0c;以此满足不同行业客户对AICl…

【Unity每日一记】如何让Sprite精灵图集的背景图层变成透明,方便切割

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

CSS基础:4种简单选择器的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 261篇原创内容-公众号 后台回复“前端工具”可获取开发工具&#xff0c;持续更新中 后台回复“前端基础…

Axure案例分享—垂直手风琴(附下载地址)

今天分享的案例是Axure8(兼容9和10)制作的垂直手风琴 一、功能介绍 折叠或展开多个面板内容&#xff0c;默认为展开一项内容&#xff0c;点击任一收起的选项&#xff0c;展开面板&#xff0c;其他面板收起二、制作过程 原型是由矩形组件以及动态面板构成&#xff0c; 拖入一…

面向C++程序员的Rust教程(二)

先序文章请看&#xff1a; 面向C程序员的Rust教程&#xff08;一&#xff09; 所有权与移动语义 要说Rust语言跟其他语言最大的区别&#xff0c;那笔者觉得非数这个所有权和移动语义莫属。 深浅复制 对于绝大多数语言来说&#xff0c;变量/对象之间的赋值通常都是复制语义。…

python标准数据类型--元组常用方法

在Python中&#xff0c;元组&#xff08;Tuple&#xff09;是一种不可变的有序集合&#xff0c;它与列表类似&#xff0c;但是元组中的元素不能被修改。元组通常用于存储不可变的数据集合&#xff0c;例如一组常量或者一组固定的值。本篇博客将介绍一些Python中元组的常用方法&…

软考高级架构师:人工智能芯片概念和例题

一、AI 讲解 人工智能芯片是专门设计来处理与人工智能&#xff08;AI&#xff09;相关的任务的集成电路。这些芯片针对AI应用的高计算需求进行了优化&#xff0c;以提升处理速度和效率&#xff0c;同时降低能耗。它们在AI领域&#xff0c;如深度学习、机器学习和数据分析中发挥…