基于标准库的STM32的外部中断EXTI

        毕设已经告一段落了,接下来准备开始整理一下毕设中用到的知识与技术细节,今天整理的是STM32从编码器获取数据的方式-----外部中断(EXTI):

外部中断分为四个硬件相关外设,GPIO/AFIO/EXTI/NVIC(EXTI/NVIC不需要开启时钟)

1.RCC开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//GPIOB为APB2的外设RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2.配置GPIO

方式如我之前写的《STM32标准库编译流程》http://t.csdnimg.cn/0UkGa所示,代码如下:

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;//查阅手册可知外部中断为上拉模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
3.配置AFIO

进入GPIO库函数,找到void GPIO_AFIODeInit(void)函数,该函数负责将AFIO复位;

GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
GPIO_EventOutputCmd(FunctionalState NewState);用以配置AFIO事件输出功能。

GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);用以配置AFIO的数据选择器,用来选择想要的中断引脚。

那么配置中断的方法如下:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource14);

大概的目的就是选择一个引脚GPIOE1用来接收中断信号,这样GPIOE1上的电平中断信号就可以通过AFIO传入EXTI中了,接下来配置EXTI:

4.配置EXTI

进入EXTI库函数,EXTI相关的库函数如下:

158行的作用是复位,159是根据参数配置外设(这就是所需的函数),160将参数中的结构体变为默认值,161软件触发外部中断,164的作用是判断中断类型,165作用是清除中断标志位。

则初始化代码如下:

EXTI_InitTypeDef EXTI_InitStruct;//配置结构体参数
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//分为event和interrupt,中断,所以选择
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//触发方式
EXTI_InitStruct.EXTI_Line=EXTI_Line14;//配置中断线,引脚为GPIOE14所以选择14
EXTI_InitStruct.EXTI_LineCmd=ENABLE;//中断线的状态,分为ENABLE/DISABLE
void EXTI_Init(& EXTI_InitStruct);
5.配置NVIC

其为内部外设,所以他的库函数在misc文件中,找到196行,具体函数如下:

196的作用是指定中断的分组,197的作用是初始化,其他的暂不作了解

则配置方式如下:

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);//抢占与相应的比例,具体见下图:
NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//使用优先级NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(& NVIC_InitStruct);

值得注意的是,NVIC_InitStruct.NVIC_IRQChannel这个参数若引脚为10-15才为上述参数,若不是,则选择EXTIX_IRQn(X为引脚编号)

6.中断响应后执行的函数

该函数名为固定的,查找方法如下:

1.找到中断通道,本文中的是EXTI15_10_IRQn。

2.找到启动文件,即start中的startup_stm32f10x_md.s

3.找到中断向量表(大概在119行),在找到对应的函数名即可。

void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)==SET)//判断是否是自己想要的中断,使用前文提到的函数
{//写函数的功能
EXTI_ClearITPendingBit(EXTI_Line14)//清除中断标志位,否则退出后又会返回到该函数
}
}

编写完成后,若E14引脚出现电平下降,则会中断其他函数,来执行EXTI15_10_IRQHandler函数

注:主函数中只需初始化外部中断即可,因为EXTI15_10_IRQHandler函数是库中自带的只需要声明即可。

初始化函数整体如下:

int EXIT_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//GPIOB为APB2的外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;//查阅手册可知外部中断为上拉模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource14);EXTI_InitTypeDef EXTI_InitStruct;//配置结构体参数
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//分为event和interrupt,中断,所以选择
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//触发方式
EXTI_InitStruct.EXTI_Line=EXTI_Line14;//配置中断线,引脚为GPIOE14所以选择14
EXTI_InitStruct.EXTI_LineCmd=ENABLE;//中断线的状态,分为ENABLE/DISABLE
EXTI_Init(&EXTI_InitStruct);NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);//抢占与相应的比例,具体见下图:
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//使用优先级
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}

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

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

相关文章

jQuery前端开发入门图片:探索图片操作的奥秘与技巧

jQuery前端开发入门图片:探索图片操作的奥秘与技巧 在前端开发中,图片的处理与展示往往占据着举足轻重的地位。jQuery,作为一款流行的JavaScript库,为我们提供了丰富的图片操作方法和技巧。本文将通过四个方面、五个方面、六个方…

戴尔向“数”而行,以“质”致远,做新质生产力的躬耕者

【全球存储观察 | 热点关注】 自1984年戴尔成立,一路走来,戴尔科技集团40年长期持续的技术创新,一直引领全球科技行业的技术趋势。 到如今,AIGC风行一时,在重塑千行百业的同时,也加速了科技行业…

选择算法之冒泡排序【图文详解】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …

题目:求0—7所能组成的奇数个数。

题目:求0—7所能组成的奇数个数。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should…

[大师C语言(第十七篇)]C语言链表背后技术详解

引言 链表是一种常见的数据结构,用于存储线性数据集合。在C语言中,链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。本文将深入探讨C语言链表背后的技术原理,并通过丰富的代码示例来讲解其应用。 第一部分&#…

北斗应急救援终端如何做好汛期重点行业安全防控?

【安全提示】 汛期各地高温多雨、极端天气增多 防汛和安全生产形势严峻复杂如何做好汛期重点行业企业安全生产风险防控? 顶坚北斗短报文终端V1单北斗定位终端 北斗应急救援终端在汛期重点行业安全防控中扮演着关键角色,其高可靠性、稳定性和丰富的功能扩…

达摩院AI早癌筛查技术闪耀联合国,癌症早治时代来临?

全文预计1200字左右,预计阅读需要6分钟。 5月30日,在日内瓦举行的联合国AI大会上,各国的代表性企业拿出最优秀的AI成果进行分享。其中代表中国的是阿里巴巴集团的下属机构-达摩院,其在现场播放的一段影像,让在场的所有…

uniApp子组件监听数据的变化的方法之一

props:{//用来接收外界传递过来的数据swiperList:{type:Array,default:[]}}, swiperList:是父组件传递过来的值 通过 watch 监听(在父组件中也同样可以使用,跟VUE的监听数据变化同理) watch:{//监听组件中的数据变化swiperList(ol…

Diffusion Facial Forgery (DiFF) ——一个新的大规模人脸伪造检测数据集

1. 概述 近年来,条件扩散模型(CDM)在图像生成领域备受关注。它能够通过简单的输入(如自然语言提示)生成令人惊讶的忠实图像。然而,这一进步也引发了新的安全和隐私问题。例如,怀有恶意的个人现…

【笔记】使用XtraBackup进行热备份

备份环境: 具备dockermysql8(5.7及以下版本更换xtrabackup版本即可,具体版本号查看官网)将云盘挂载到服务器上,可以使用s3协议 #!/bin/bash# 目录配置部分 HOST_BACKUP_DIR"/root/docker/mysql8/backup/full" # 宿主机备份目录 H…

结构体(C保姆级讲解)

前言: 为什么会有结构体,结构体可以用来面熟一个复杂对象,我们知道C语言中有哪些数据类型,有整型,有浮点型,有字符型,但是在生活中,我们需要描述一些比较复杂的东西,比如…

如何理解央行买卖国债?

浙商证券覃汉认为,央行对长债的风险持续关注,30年国债收益率较难突破2.5%,区间底部已经多次印证,在学习效应影响下,长端利率预计继续以震荡调整为主。 1、央行买卖国债的政策要求、历史经验、优势 2023年中央金融工作…

语音助手拦截,拦截小秘书

呼叫中心业务场景下会遇到很多的语音助手和语音小秘书,还有一些漏话提醒、语音信箱等;大部分原因是由于主叫号码标记问题导致的局端和终端拦截策略,电话没有真实有效的触达并产生了通信费,这让很多业务场景下通信成本上涨据不完全…

常用中间件各版本下载

常用中间件下载地址 前言分布式中间件负载均衡中间件缓存中间件数据库中间件其他中间件1、Maven下载地址2、Git下载地址2、JDK下载地址3、MySQL下载地址4、Redis下载地址5、Nacos下载地址6、Tomcat下载地址7、Nginx下载地址8、RocketMQ下载地址8、RabbitMQ下载地址8、Erlang下载…

【Redis】常见的 Redis 集群方案

Redis 集群用于在多个 Redis 节点之间分布数据,以提高可用性和扩展性。常见的 Redis 集群方案有以下几种: 1. 哨兵 (Sentinel) Sentinel 是一种高可用解决方案,用于监控 Redis 主从复制的实例并在主节点发生故障时进行自动故障转移。 优点…

Amazon云计算AWS(三)

目录 五、关系数据库服务RDS(一)RDS的基本原理(二)RDS的使用 六、简单队列服务SQS(一)SQS的基本模型(二)SQS的消息 七、内容推送服务CloudFront(一)CDN&#…

【硬件工程师话家常】新人硬件工程师,工作中遇到的问题list

新人硬件工程师能够通过面试,已经证明是能够胜任硬件工程师职责,当然胜任的时间会延迟,而不是当下,为什么呢?因为学校学习和公司做产品,两者之间有差异,会需要适应期。今天来看看新人硬件工程师…

Python之Mammoth库的详解和使用

Mammoth 旨在转换 .docx 文档(例如由 Microsoft Word、Google Docs 和 LibreOffice 创建的文档)并将其转换为 HTML。Mammoth 旨在通过使用文档中的语义信息并忽略其他细节来生成简单干净的 HTML。例如,Mammoth 将任何具有样式的段落转换Headi…

Vue3-路由详解

文章目录 路由对路由的理解安装 Vue Router基本切换效果两个注意点路由器工作模式to的两种写法命名路由嵌套路由路由传参query参数params参数 路由的props配置replace属性编程式导航重定向 更多相关内容可查看 路由 附git地址:https://gitee.com/its-a-little-bad/…

C前端与Web前端:深入解析二者之间的区别

C前端与Web前端:深入解析二者之间的区别 在编程领域中,C前端与Web前端常常被提及,但这两者之间究竟有何不同?本文将通过四个方面、五个方面、六个方面和七个方面,深入剖析C前端与Web前端之间的区别,帮助读…