当前位置: 首页 > news >正文

基于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

相关文章:

  • 春秋云境靶场CVE-2022-28512漏洞复现(sql手工注入)
  • 阿里面试面试题
  • Linux非阻塞等待示例
  • 【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷B
  • react hook 获取setState的新值
  • 146. LRU 缓存
  • 蓝桥杯每日一题2023.11.16
  • 51.Sentinel微服务保护
  • 网络运维Day18
  • YOLOV5部署Android Studio安卓平台NCNN
  • 从零开始的C++(十七)
  • flask创建步骤
  • 利用 Pandoc + ChatGPT 优雅地润色论文,并保持 Word 公式格式:Pandoc将Word和LaTeX文件互相转化
  • 第八章 应用参数为约束建模 P1|系统建模语言SysML实用指南学习
  • 迭代新品 | 第四代可燃气体监测仪,守护燃气管网安全快人一步
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • JS笔记四:作用域、变量(函数)提升
  • leetcode386. Lexicographical Numbers
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • pdf文件如何在线转换为jpg图片
  • Promise初体验
  • python_bomb----数据类型总结
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 反思总结然后整装待发
  • 将 Measurements 和 Units 应用到物理学
  • 开源地图数据可视化库——mapnik
  • 前端
  • 深入 Nginx 之配置篇
  • 数组大概知多少
  • 物联网链路协议
  • 小程序button引导用户授权
  • 用jQuery怎么做到前后端分离
  • 智能合约Solidity教程-事件和日志(一)
  • HanLP分词命名实体提取详解
  • (03)光刻——半导体电路的绘制
  • (07)Hive——窗口函数详解
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (转)创业的注意事项
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .NET Core 成都线下面基会拉开序幕
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NetCore项目nginx发布
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .skip() 和 .only() 的使用
  • /*在DataTable中更新、删除数据*/
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @vue/cli脚手架
  • [20180129]bash显示path环境变量.txt
  • [Android] 修改设备访问权限
  • [C++]模板与STL简介
  • [HCIE] IPSec-VPN (手工模式)