0502STM32EXTI中断项目代码实现

STM32EXTI中断函数代码实现

  • 对射式红外传感器&旋转编码器计次
    • 配置外部中断的步骤:
    • AFIO相关函数&GPIO的一个函数
    • EXTI相关函数
    • 代码
    • NVIC中断函数
    • 启动文件里的中断函数名字
    • 中断编程的建议:

对射式红外传感器&旋转编码器计次

一般一个模块要写的第一个就是初始化函数,把模块要用的资源配置好

配置外部中断的步骤:

1.配置RCC,把我们涉及到的外设的时钟都打开
2.配置GPIO,选择端口为输入模式
3.配置AFIO,选择我们用的这一路GPIO,连接到后面的EXTI
4.配置EXTI,选择中断或事件响应
5.配置NVIC,给中断选择一个合适的优先级
最后,通过NVIC,外部中断信号就能进入CPU了
CPU收到中断信号,跳转到中断函数里执行中断函数

EXTI是一个独立外设,按理需要开启时钟,但是寄存器里面却没有EXTI时钟的控制位,(论推测可能是和EXTI唤醒有关,或者其他的一些电路设计上的考虑)
另外NVIC也不需要开启时钟,因为NVIC是内核的外设,内核外设都不需要开启时钟,和CPU一起的,在内核。

而RCC管的都是内核外的外设,

AFIO相关函数&GPIO的一个函数

AFIO没有专门分配库函数文件,是和GPIO在一个文件里面

在这里插入图片描述

GPIO_ADIODeInit()复位AFIO外设,调用此函数,AFIO外设的配置就会全部清除
GPIO_PinLockConfig 锁定GPIO配置,调用此函数,参数指定某个引脚,引脚配置就锁定,防止意外更改

GPIO_EventOutputConfig、GPIO_EventOutputCmd是用来配置AFIO的事件输出功能的,用的不多

GPIO_PinRemapConfig 可以用来进行引脚重映射,第一个参数可以选择要重映射的方式,第二个参数是新的状态
GPIO_EXTILineConfig 本节需要用到的,可以配置AFIO的数据选择器,来选择我们想要的中断引脚
GPIO_ETH_MediaInterfaceConfig 和以太网相关,这个芯片没有以太网外设,用不到

EXTI相关函数

在这里插入图片描述
EXTI_DeInit 可以把EXTI的配置都清除,恢复成上电默认的状态
EXTI_Init 可以根据结构体里的参数配置EXTI外设,初始化主要用的这个函数,使用方法和GPIO_Init是一样的,
EXTI_StructInit 可以把参数传递的结构体变量赋一个默认值
这三个函数,基本所有的外设都有,就像是库函数的模板函数一样,基本每个外设都需要这些类型的函数,会用一个之后,再见到这种函数,就很容易上手。为什么要用结构体来初始化模块,还得定义结构体,结构体赋值,然后再传递结构体的地址,是因为其他外设也都一样,一个套路,而且结构体可以看到参数的名字,参数也都可以复制粘贴,根本不用查看寄存器,随便选参数就配置好了。

EXTI_GenerateSWInterrupt 用来软件触发外部中断,调用这个函数,参数给一个指定的中断线,就能软件触发一次外部中断,如果程序中需要用到这个功能,可以使用这个函数,如果程序中只需要外部引脚触发中断,那就不需要用这个函数了。

FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
这四个函数也是库函数的模板函数,很多模块都有着四个函数,因为外设运行过程中,会产生一些状态标志位,比如外部中断来了,会有一个挂起寄存器置了一个标志位,对于串口收到数据,会置标志位,定时器时间到,也会置标志位。这些标志位都是放在状态寄存器,当程序想要看这些标志位时,可以用到这4个函数

GetFlagStatus可以获取指定的标志位是否被置1了
ClearFlag可以对置1的标志位进行清除

对于标志位,有的比较紧急,在置标志位后会触发中断,在中断函数里,如果想查看标志位和清除标志位,那用下面两个函数,
GetITStatus 获取中断标志位是否被置1了、
ClearITPendingBit 清除中断挂起中断位

总结:如果想再主程序里面查看和清除标志位,就用上面两个函数
如果想在中断函数里查看和清除标志位,就用下面两个函数。
本质上,四个函数都是对状态寄存器的读写,只不过下面的两个函数只能读写与中断有关的标志位,并且对中断是否允许做出了判断,而上面的连个函数只是一般的读写标志位,没有额外的处理,能不能触发中断的标志位都能读取。
库函数对这两种场景,区分了两类读写函数,实在随便用也问题不大。

代码

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
此处注释写错了,所以才有有很多的版本来修订

NVIC中断函数

在这里插入图片描述

1.用来中断分组的,参数是中断分组的方式
2.根据结构体里指定的参数初始化NVIC

3.设置中断向量表
4.系统低功耗配置
3.4函数用的不多,可以先不看

在这里插入图片描述
For the complete STM32 Devices IRQ Channels list, please refer to stm32f10x.h file
对于完成的STM32中断通道列表,请参考stm32f10x.h文件,这个意思是IRQn_Type的定义不在这个文件,要到stm32f10x.h里去找。

在这里插入图片描述
可以看到这里有很多的中断通道,因为这个库函数可以兼容所有的F1系列芯片,但是不同的芯片中断列表是不一样的,所以有很多条件编译,用来选择所使用芯片的中断通道列表。

启动文件里的中断函数名字

在STM32中,中断函数的名字都是固定的,每个中断通道都对应一个中断函数,中断函数的名字可以参考启动文件。

在这里插入图片描述
可以看到定义了中断向量表,这里面以IRQ结尾的字符串就是中断函数的名字,EXTI15_10_IRQHandler就是EXTI15_10的中断函数
在这里插入图片描述

中断函数都无参无返回值。在中断函数里,一般都是先进行一个中断标志位的判断,确保使我们想要的中断源触发的这个函数,因为这个函数EXTI10-15都能进来,所以要先判断是不是想要的EXTI14进来了

中断编程的建议:

1.在中断函数里,最好不要执行耗时过长的代码,中断函数要简短快速,别刚进中断就执行一个Delay多少毫秒这样的代码,因为中断是处理一个突发的事情,如果为了一个突发的事情待在中断里出不来了,那主程序就会收到严重的阻塞
2.不要在中断函数和主函数调用相同的函数或者操作同一硬件,尤其是硬件相关函数,比如OLED显示函数,如果既在主函数里调用LED,又在中断调用OLED,OLED就会显示错误。因为可能在主程序中,OLED刚显示一半,进入中断后,还是OLED显示函数,那OLED就可能挪到其他地方显示了,当中断结束之后,需要继续原来的显示就出问题了。因为硬件的显示位置被挪到其他地方了,所以再回来时,继续显示的内容就会跟着跑到其他地方去。
虽然在中断进入和退出时,会有保护现场和恢复现场,但这只能保证CPU程序能正常返回不出问题,对于外部硬件的话,并没有在进入中断时进行现场保护。为了避免这样可能存在的问题,就最好不要在主程序和中断程序里,操作可能产生冲突的硬件。

可以在中断里操作变量或者标志位,当中断返回时,再对这个变量进行显示和操作,这样既能保证中断函数的简短快捷,又能保证不产生冲突的硬件操作。这就是中断程序设计的注意事项。

其他地方也可以多用变量或者标志位,来减少代码之间的耦合性,让各部分代码相互独立,仅使用变量、标志位或者函数作为接口,这样让程序更加清晰、代码更加强健。

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

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

相关文章

SpringBoot:SpringBoot中如何实现对Http接口进行监控

一、前言 Spring Boot Actuator是Spring Boot提供的一个模块,用于监控和管理Spring Boot应用程序的运行时信息。它提供了一组监控端点(endpoints),用于获取应用程序的健康状态、性能指标、配置信息等,并支持通过 HTTP …

windows下使用编译opencv在qt中使用

记录一下:在windows下qt使用opencv 1、涉及需要下载的软件 CMake 下载地址opecnv下载地址mingw(需要配置环境变量) 这个在下载qt的时候可以直接安装一般在qt的安装路径下的tool里比如我的安装路径 (C:\zz\ProgramFiles\QT5.12\Tools\mingw730_64) 2、在安装好CMake…

ChatGPT对话:Scratch编程中一个单词,如balloon,每个字母行为一致,如何优化编程

【编者按】balloon 7个字母具有相同的行为,根据ChatGPT提供的方法,优化了代码,方便代码维护与复用。初学者可以使用7个字母精灵,复制代码到不同精灵,也能完成这个功能,但不是优化方法,也没有提高…

ENSP软件中DHCP的相关配置以及终端通过域名访问服务器

新建拓扑 配置路由器网关IP 设备配置命令&#xff1a;<Huawei> Huawei部分为设备名 <>代表当下所在的模式&#xff0c;不同模式下具有不同的配置权限<Huawei> 第一级模式&#xff0c;最低级模式 查看所有参数<Huawei>system-view 键入系统视图…

Python中的null是什么?

在知乎上遇到一个问题&#xff0c;说&#xff1a;计算机中的「null」怎么读&#xff1f; null正确的发音是/n^l/&#xff0c;有点类似四声‘纳儿’&#xff0c;在计算机中null是一种类型&#xff0c;代表空字符&#xff0c;没有与任何一个值绑定并且存储空间也没有存储值。 P…

STM32的独立看门狗详解

目录 1.独立看门狗是什么&#xff1f; 2.独立看门狗的作用 3.独立看门狗的实现原理 4.独立看门狗用到的寄存器 4.1 IWDG_KR &#xff08;关键字计时器&#xff09; 4.2 IWDG_PR&#xff08;预分频寄存器&#xff09; 4.3 IWDG_RLR&#xff08;重装载寄存器&#xff09…

程序的控制结构——if-else语句(双分支结构)【互三互三】

目录 &#x1f341; 引言 &#x1f341;if-else语句&#xff08;双分支结构&#xff09; &#x1f449;格式1&#xff1a; &#x1f449;功能&#xff1a; &#x1f449;程序设计风格提示&#xff1a; &#x1f449;例题 &#x1f449;格式2&#xff1a; &#x1f449;…

ENSP防火墙综合配置

综合拓扑&#xff1a; 实验要求&#xff1a; 要求一 生产区的安全策略配置 办公区的安全策略 要求二 生产区的安全策略 游客和办公区的安全策略 因为ISP返回的数据包会被防火墙最后的默认安全策略给拒绝&#xff0c;所以&#xff0c;把要ISP返回的数据给允许通过 要求三 增加…

《基于 Kafka + Flink + ES 实现危急值处理措施推荐和范围校准》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;欢迎多多交流。&am…

location匹配的优先级和重定向

nginx的重定向&#xff08;rewrite&#xff09; location 匹配 location匹配的就是后面的uri /wordpress 192.168.233.10/wordpress location匹配的分类和优先级 1.精确匹配 location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配 ^-前缀级别&#xff…

【MYSQL】如何解决 bin log 与 redo log 的一致性问题

该问题问的其实就是redo log 的两阶段提交 为什么说redo log 具有崩溃恢复的能力 MySQL Server 层拥有的 bin log 只能用于归档&#xff0c;不足以实现崩溃恢复&#xff08;crash-safe&#xff09;&#xff0c;需要借助 InnoDB 引擎的 redo log 才能拥有崩溃恢复的能力。所谓崩…

Java毕业设计 基于SSM vue电影订票系统小程序 微信小程序

Java毕业设计 基于SSM vue电影订票系统小程序 微信小程序 SSM 电影订票系统小程序 功能介绍 用户 登录 注册 忘记密码 首页 图片轮播 电影信息 电影详情 评论 收藏 预订 电影资讯 资讯详情 用户信息修改 电影评价 我的收藏管理 用户充值 在线客服 我的订单 管理员 登录 个人…

sqlite 数据库 介绍

文章目录 前言一、什么是 SQLite &#xff1f;二、语法三、SQLite 场景四、磁盘文件 前言 下载 目前已经出到了&#xff0c; Version 3.46.0 SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是…

STM32-OC输出比较和PWM

本内容基于江协科技STM32视频内容&#xff0c;整理而得。 文章目录 1. OC输出比较和PWM1.1 OC输出比较1.2 PWM&#xff08;脉冲宽度调制&#xff09;1.3 输出比较通道&#xff08;高级&#xff09;1.4 输出比较通道&#xff08;通用&#xff09;1.5 输出比较模式1.6 PWM基本结…

批量制作word表格

问题背景 将excel表中的成绩内容制作为成绩单&#xff0c;每页对应一个学员的成绩&#xff0c;方便打印 代码实现 ## 导入包 import pandas as pd from docx import Document from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_LINE_SPACING# 读取 Excel 内容 df pd.read_e…

docker基础知识以及windows上的docker desktop 安装

记录以供备忘 基础概念&#xff1a; 什么是docker 将程序和环境一起打包&#xff0c;以在不同操作系统上运行的工具软件 什么是基础镜像 选一个基础操作系统和语言后&#xff0c;将对应的文件系统、依赖库、配置等打包为一个类似压缩包的文件&#xff0c;就是基础镜像 什么是…

基于FPGA的数字信号处理(15)--定点数的舍入模式(6)向0取整fix

前言 在之前的文章介绍了定点数为什么需要舍入和几种常见的舍入模式。今天我们再来看看另外一种舍入模式&#xff1a;向上取整fix。 10进制数的fix fix&#xff1a;也叫 向0取整。它的舍入方式是数据往0的方向&#xff0c;舍入到最近的整数&#xff0c;比如1.75 fix到2&#xf…

【SQL】如何用SQL写透视表

【背景】 报表中有一大需求是透视表,目前有很多分析类应用也搭载了此类功能,那么我们能不能直接用SQL做透视表呢? 【分析】 BI类软件将透视表功能做在了前端,但是数据本身还是存储在数据库中,所以必然有方法可以用SQL直接实现透视表。 【心法】 透视表是任意选取一个…

LVS集群及其它的NAT模式

1.lvs集群作用&#xff1a;是linux的内核层面实现负载均衡的软件&#xff1b;将多个后端服务器组成一个高可用、高性能的服务器的集群&#xff0c;通过负载均衡的算法将客户端的请求分发到后端的服务器上&#xff0c;通过这种方式实现高可用和负载均衡。 2.集群和分布式&#…

开源项目的认识理解

目录 开源项目有哪些机遇与挑战&#xff1f; 1.开源项目的发展趋势 2.开源的经验分享&#xff08;向大佬请教与上网查询&#xff09; 3.开源项目的挑战 开源项目有哪些机遇与挑战&#xff1f; 1.开源项目的发展趋势 1. 持续增长与普及 - 开源项目将继续增长&#xff0c…