基于标准库的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.rhkb.cn/news/337595.html

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

相关文章

11.3 指针和函数

11.3 指针和函数 本节必须掌握的知识点: 指针作为函数的参数 数组作为函数的参数 指针作为函数的返回值 在C语言中,指针的一个重要作用就是作为函数参数使用,本节将介绍这一重要作用。 11.3.1 指针作为函数的参数 实验一百一十三&#xff…

USART串口数据包

USART串口数据包 先来看两张图,本次程序是串口收发HEX数据包,第二种是串口收发文本数据包,之后两个图,展示的就是接收数据包的思路。 在PB1这里接了一个按键,用于控制。在串口助手,在发送模式和接收模式都…

【错题集-编程题】小红的子串(前置和 + 双指针)

牛客对应题目链接:小红的子串 (nowcoder.com) 一、分析题目 利用前缀和的思想,求种类个数在 [l, r] 区间内子串的个数,等于求 [1, r] 区间内个数 - [1, l - 1] 区间内个数。 求种类个数在 [1, count] 区间内子串的个数,可以用滑动…

(深度学习记录)第TR3周:Transformer 算法详解

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文本的输入处理中,transformer会将输入文本序列的每个词转化为一个词向量,我们通常会选择一个合适的长度作为输入…

Linux系统监控

文章目录 一、系统监控基本介绍二、内存监控2.1、内存监控字段解析2.2、windows下查看内存2.2.1、通过cmd中命令查看内存条信息:2.2.2、通过cmd中命令查看物理内存信息:2.2.3、使用任务管理器查看内存2.2.4、使用资源监视器查看内存2.2.5、使用系统信息工…

Stable Diffusion Webui--安装与使用

最近进行的课程汇报,学习了2023年的CVPR文章《DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation》,因此尝试使用了几种方法对这篇文章的工作进行了一定的复现。本文主要介绍Stable Diffusion Web UI(webui)的安装…

锅炉智能制造工厂工业物联数字孪生平台,推进制造业数字化转型

在制造业快速发展的今天,数字化转型已经成为企业提升竞争力的关键途径。锅炉智能制造工厂工业物联数字孪生平台,作为一种创新的技术解决方案,正以其独特的优势,为制造业的数字化转型提供强大动力。锅炉智能制造工厂工业物联数字孪…

Git基本配置,使用Gitee(一)

1、设置Giter的user name和email 设置提交用户的信息 git config --global user.name "username" git config --global user.email "Your e-mail"查看配置 git config --list2、生成 SSH 公钥 通过命令 ssh-keygen 生成 SSH Key -t key 类型 -C 注释 ssh-…

Stable Diffusion生成图片的参数查看与抹除方法

前几天分享了几张Stable Diffusion生成的艺术二维码,有同学反映不知道怎么查看图片的参数信息,还有的同学问怎么保护自己的图片生成参数不会泄露,这篇文章就来专门分享如何查看和抹除图片的参数。 查看图片的生成参数 1、打开Stable Diffus…

Vxe UI vxe-upload 上传组件,显示进度条的方法

vxe-upload 上传组件 查看官网 https://vxeui.com 显示进度条很简单,需要后台支持进度就可以了,后台实现逻辑具体可以百度,这里只介绍前端逻辑。 上传附件 相关参数说明,具体可以看文档: multiple 是否允许多选 li…

解锁 JavaScript ES6:函数与对象的高级扩展功能

个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! ES5、ES6介绍 文章目录 💯ES6函数扩展🍓1 默认参数&#x1f35…

【每日刷题】Day53

【每日刷题】Day53 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 1019. 链表中的下一个更大节点 - 力扣(LeetCode) 2. 116. 填充每个节点的下一…

[有监督学习]2.详细图解正则化

正则化 正则化是防止过拟合的一种方法,与线性回归等算法配合使用。通过向损失函数增加惩罚项的方式对模型施加制约,有望提高模型的泛化能力。 概述 正则化是防止过拟合的方法,用于机器学习模型的训练阶段。过拟合是模型在验证数据上产生的误…

DL/ML/RL/TL/FL机器学习框架总结

前言 本文总结了DL/深度学习、ML/机器学习、DML/分布式机器学习、AutoML/自动化机器学习、RL/强化学习、MLaaS/机器学习及服务、SR/语音识别领域的机器学习框架,可作为学习、研究、研发的参考资料。 1.DL/深度学习框架 PyTorch PyTorch是一个开源的Python机器学…

面试题:计算机网络中的七四五是什么?

面试题:计算机网络中的七四五是什么? 计算机网络中说的七四五是指:OSI 七层模型、TCP/IP 四层模型、OSI 与 TCP/IP 的综合五层模型 OSI 七层模型 OSI 将计算机网络分为了七层,每一层抽象底层的内容,并遵守一定的规则…

逆天工具一键修复图片,视频去码。本地部署超详细!!

上一篇文章:逆天工具一键修复图片,视频去码。简直不要太好用!-CSDN博客 根据上一篇文章展示的效果,本文章主要讲如何部署本地github开源项目。博主走了无数弯路,最后精化下来的步骤,超级详细!&a…

godot4.2 + GDextension c++在 vs code 中断点调试配置

游戏开发中如果做不到自己编写的代码做断点调试,无不是瞎子摸象,特别是C这么底层的语言。这2天开始在VS studio中折腾,一直折腾不出结果,几次想要放弃GODOT。最终今天在VS code中搞定了这断点调试C代码。 在上一篇文章我已经做好了…

LabVIEW调用外部DLL(动态链接库)

LabVIEW调用外部DLL(动态链接库) LabVIEW调用外部DLL(动态链接库)可以扩展其功能,使用外部库实现复杂计算、硬件控制等任务。通过调用节点(Call Library Function Node)配置DLL路径、函数名称和…

【机器学习】集成语音与大型语音模型等安全边界探索

探索集成语音与大型语言模型(SLMs)的安全边界 一、引言二、SLMs的潜在安全风险三、对抗性攻击与越狱实验四、提高SLMs安全性的对策五、总结与展望 一、引言 近年来,随着人工智能技术的飞速发展,集成语音与大型语言模型&#xff08…