基于STM32的多组外部中断(EXTI)的优化策略与应用

在某些嵌入式应用中,可能需要同时处理多个外部中断事件。STM32系列微控制器提供了多组外部中断线(EXTI Line),可以同时配置和使用多个GPIO引脚作为外部中断触发器。为了有效管理和处理多组外部中断,我们可以采取一些优化策略和技术。

以下是基于STM32的多组外部中断的优化策略和应用的概述,并提供了一些关键代码示例:

策略1:GPIO和优先级管理

在使用多组外部中断时,首先需要合理规划和管理GPIO引脚的分配。可以使用不同的GPIO组或端口用于不同的外部中断,以避免冲突和干扰。

其次,需要合理配置中断优先级,确保较高优先级的中断能够快速响应和处理。优先级的配置涉及到中断控制器(NVIC)以及中断优先级分组的设置。

示例代码:

```c
// 配置GPIO引脚用于外部中断1
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 选择引脚A0作为外部中断触发器1
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);

// 配置GPIO引脚用于外部中断2
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; // 选择引脚B5作为外部中断触发器2
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);

...

// 配置并使能外部中断1
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // 外部中断1映射到GPIOA.0
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);

// 配置并使能外部中断2
EXTI_InitTypeDef EXTI_InitStruct2;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource5); // 外部中断2映射到GPIOB.5
EXTI_InitStruct2.EXTI_Line = EXTI_Line5;
EXTI_InitStruct2.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct2.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct2.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct2);

...

// 配置中断优先级和使能
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct1;
NVIC_InitStruct1.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct1.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct1.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct1.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct1);

NVIC_InitTypeDef NVIC_InitStruct2;
NVIC_InitStruct2.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStruct2.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct2.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct2.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct2);
```

策略2:共享资源和并发处理

当使用多组外部中断时,可能会涉及到共享资源和并发处理的情况。例如,可能同时需要访问共享的外设寄存器或数据结构。在这种情况下,需要合理处理共享资源的控制和同步,以避免竞争条件和数据不一致。

常见的做法是使用互斥锁/信号量或其他同步机制来保护共享资源。在中断服务函数中,尽量减少对共享资源的直接访问,可以通过将中断事件信息传递给任务(通过队列或标志等方式),在任务中处理共享资源。

策略3:中断服务函数的优化

在处理多组外部中断时,中断服务函数的优化也非常重要。中断服务函数应尽可能地简洁、高效,并尽量避免长时间占用中断线。

示例代码:

```c
void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        // 处理外部中断1事件
        // ...

        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

void EXTI9_5_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line5) != RESET)
    {
        // 处理外部中断2事件
        // ...

        EXTI_ClearITPendingBit(EXTI_Line5);
    }
}
```

总结:

在基于STM32的多组外部中断的应用中,需要合理管理GPIO和中断优先级,以充分利用多组外部中断线。同时,需要处理共享资源的同步和并发访问,以避免竞争条件和数据不一致。另外,编写高效的中断服务函数也是关键,要尽量减少中断响应时间和中断占用时间。

嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击这里,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦。 

​ 点击链接扫码进入嵌入式交流群 ​https://fss.mpay8.cn/article/dmrjinh2C6fjejm

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

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

相关文章

Linux非阻塞等待示例

Linux非阻塞等待实例 非阻塞等待的意义:简单的多进程编程示例代码解释 非阻塞等待的意义: 非阻塞等待在多进程编程中的意义主要体现在提高系统的响应性、实现异步任务执行、动态任务管理和多任务协同工作等方面。它允许父进程在等待子进程退出的同时&…

优化|优化求解器自动调参

原文信息:MindOpt Tuner: Boost the Performance of Numerical Software by Automatic Parameter Tuning 作者:王孟昌 (达摩院决策智能实验室MindOpt团队成员) 一个算法开发者,可能会幻想进入这样的境界:算…

C++题目练习第二十天__有效的完全平方数

题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目: 给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。 完全平方数 是一个可以写成某个整数的平方的整数。…

Android 弹出自定义对话框

Android在任意Activity界面弹出一个自定义的对话框,效果如下图所示: 准备一张小图片,右上角的小X图标64*64,close_icon.png,随便找个小图片代替; 第一步:样式添加,注意:默认在value…

2023年中职“网络安全“—Web 渗透测试②

2023年中职“网络安全“—Web 渗透测试② Web 渗透测试任务环境说明:1.访问http://靶机IP/web1/,获取flag值,Flag格式为flag{xxx};2.访问http://靶机IP/web2/,获取flag值,Flag格式为flag{xxx};3.访问http://靶机IP/web…

git拉取普通idea Java项目module没有build的问题

在不断完成一个项目的时候,会有不断新加的module,我们用git拉取时会发生没有识别新module的情况。 解决方法是右键项目名称,然后点击Open Module Settings 接下来,点击Module,加号,新建Module的名字就是在g…

深度学习乳腺癌分类 计算机竞赛

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

sqli-labs关卡18(基于http头部报错盲注)通关思路

文章目录 前言一、靶场通关需要了解的知识点1、什么是http请求头2、为什么http头部可以进行注入 二、靶场第十八关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识,禁止用于做…

若依框架数据源切换为pg库

一 切换数据源 在ruoyi-admin项目里引入pg数据库驱动 <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version> </dependency>修改配置文件里的数据源为pg spring:d…

测不准原理

测不准原理 算符的对易关系 commutation relation 测不准原理的矢量推导 Schwarz inequality: 设对易关系&#xff1a; 设一个新态&#xff1a; 投影&#xff1a; 那么有&#xff1a; 代回Schwarz inequality 即可证明&#xff1a;

2023OceanBase年度发布会后,有感

很荣幸收到了OceanBase邀请&#xff0c;于本周四&#xff08;11月16日&#xff09;参加了OceanBase年度发布会并参加了DBA老友会&#xff0c;按照理论应该我昨天&#xff08;星期五&#xff09;就回到成都了&#xff0c;最迟今天白天就该把文章写出来了&#xff0c;奈何媳妇儿买…

zsh和ohmyzsh安装指南+插件推荐

文章目录 1. 安装指南2. 插件配置指南3. 参考信息 1. 安装指南 1. 安装 zsh sudo apt install zsh2. 安装 Oh My Zsh 国内访问GitHub sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"这将安装 Oh My Zsh 和所…

75基于matlab的模拟退火算法优化TSP(SA-TSP),最优路径动态寻优,输出最优路径值、路径曲线、迭代曲线。

基于matlab的模拟退火算法优化TSP(SA-TSP)&#xff0c;最优路径动态寻优&#xff0c;输出最优路径值、路径曲线、迭代曲线。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 75matlab模拟退火算法TSP问题 (xiaohongshu.com)

联想系列台式机Win11系统改Win7系统BIOS设置步骤

联想最新一代的台式机默认操作系统Win11&#xff0c;采用UEFIGPT启动模式&#xff0c;并且开启了安全启动功能&#xff0c;一般用户不能直接将Win11改成Win7&#xff0c;如果需要更改操作系统&#xff0c;是需要再BIOS菜单中关闭安全启动功能的&#xff0c;并且把启动模式设置成…

Linux CentOS7 添加网卡

一台主机中安装多块网卡&#xff0c;有许多优势。可以实现多项功能。 为了学习网卡参数的设置&#xff0c;可以为主机添加多块网卡。与添加磁盘一样&#xff0c;要在VMware中设置。利用图形化方式或命令行查看或设置网卡。本文仅作一初步讨论。有关网络参数的设置不在讨论之列…

【Web】Ctfshow SSRF刷题记录1

核心代码解读 <?php $url$_POST[url]; $chcurl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $resultcurl_exec($ch); curl_close($ch); ?> curl_init()&#xff1a;初始curl会话 curl_setopt()&#xff1a;会…

C语言进阶第十课 --------文件的操作

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

HarmonyOS开发Java与ArkTS如何抉择

在“鸿蒙系统实战短视频App 从0到1掌握HarmonyOS”视频课程中&#xff0c;很多学员来问我&#xff0c;在HarmonyOS开发过程中&#xff0c;面对Java与ArkTS&#xff0c;应该选哪样&#xff1f; 本文详细分析Java与ArkTS在HarmonyOS开发过程的区别&#xff0c;力求解答学员的一些…

【我和Python算法的初相遇】——体验递归的可视化篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON数据结构与算法学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 递归的起源 什么是递归? 利用递归解决列表求和问题 递归三定律 递归应用-整数转换为任意进制数 递归可视化 画…

获取虎牙直播源

为了今天得LOL总决赛 然后想着下午看看 但是网页看占用高 就想起来有个直播源 也不复杂看了大概一个小时 没啥问题 进入虎牙页面只有 直接F12 网络 然后 看这个长条 一直在获取 发送 那就选中这个区间 找到都是数字这一条 如果直接访问的话会一直下载 我这都取消了 然后 打开…