嵌入式系统开发【深入浅出】 EXTI 与 NVIC

news2024/11/19 17:43:51

目录

CPU 感知外部事件变化的三种方式 

中断分三个级别

中断控制器

STM32 的中断和异常

NVIC 中断控制器

NVIC 结构体成员

抢占优先级和响应优先级

简单配置NVIC中断控制器

EXTI 外部中断【中断源级】​

STM32系列微控制器实际上最多有23根外部中断线(EXTI0-EXTI15、PVD、RTC Alarm、USB OTG FS Wakeup、ETH Wakeup和RTC Tamper/Timestamp/Security)

要注意的是:

简单配置EXTI外部中断

中断处理函数


 引言:

        EXTI (External interrupt) 就是指外部中断,通过 GPIO检测输入脉冲,引起中断事件,打断原来的代码执行流程,进入到中断服务函数中进行处理,处理完后,再返回到中断之前的代码中执行。

  1. CPU 感知外部事件变化的三种方式 

    1. 轮询、中断 、DMA【DMA 直接内存访问】
  2. 中断分三个级别

    1. 中断源级 【产生:外设   信号-->软中断】
    2. 中断控制级 【NVIC】
    3. ArmCore级
  3. 中断控制器

    1.      VIC       向量中断控制器
    2.     NVIC     可嵌套的向量中断控制器    mcu
    3.      GIC      通用中断控制器                   soc
  4. STM32 的中断和异常

    1. 事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,编号 为0~15的称为内核异常,而16以上的则称为外部中断(外,相对内核而 言),这个表就称为中断向量表。【异常向量表的顺序万万不可修改】
    2. 编号从-3至6的中断向量定义为 系统异常,编号为负的内核异常不能被设置优先级
    3. 编号7开始的为外部中断,这些中断的优先级都是可以自行设置的

  1. NVIC 中断控制器

    1. NVIC是属于 Cortex 内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而 SYSTICK 不是由NVIC来控制的。
    2. NVIC 结构体成员
      1. NVIC_IRQChannel 需要配置的中断向量
      2. NVIC_IRQChannelCmd 使能或关闭相应中断向量的中断响应
      3. NVIC_IRQChannelPreemptionPriority 配置相应中断向量抢占优先级
      4. NVIC_IRQChannelSubPriority 配置相应中断向量的响应优先级
    3. 抢占优先级和响应优先级
      1. STM32的中断向量具有两个属性,一个为抢占属性,另一个为响应属性, 其属性编号越小,表明它的优先级别越高
    4. 简单配置NVIC中断控制器
      void NVIC_Configuration(void)
      {
      		NVIC_InitTypeDef NVIC_InitStructure = {0};
      		
      		/* 配置中断源的优先级 */
      		// 配置分组 组优先级、子优先级
      		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
      		
      		/* 为中断源提供中断号 */
      		NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;				// 需要配置的中断向量
      		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;						// 使能或关闭相应中断向量的中断响应
      		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 配置相应中断向量抢占优先级 
      		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;				// 配置相应中断向量的响应优先级
      		NVIC_Init(&NVIC_InitStructure);	
      		
      		NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
      		NVIC_Init(&NVIC_InitStructure);	
      }
  2. EXTI 外部中断【中断源级】

    1. STM32系列微控制器实际上最多有23根外部中断线(EXTI0-EXTI15、PVD、RTC Alarm、USB OTG FS Wakeup、ETH Wakeup和RTC Tamper/Timestamp/Security)
    2. 1. EXTI0: 外部中断线0
      2. EXTI1: 外部中断线1
      3. EXTI2: 外部中断线2
      4. EXTI3: 外部中断线3
      5. EXTI4: 外部中断线4
      6. EXTI5: 外部中断线5
      7. EXTI6: 外部中断线6
      8. EXTI7: 外部中断线7
      9. EXTI8: 外部中断线8
      10. EXTI9: 外部中断线9
      11. EXTI10: 外部中断线10
      12. EXTI11: 外部中断线11
      13. EXTI12: 外部中断线12
      14. EXTI13: 外部中断线13
      15. EXTI14: 外部中断线14
      16. EXTI15: 外部中断线15
      17. PVD: 低压检测中断
      18. RTC Alarm: 实时时钟闹钟中断
      19. USB OTG FS Wakeup: USB OTG FS唤醒中断
      20. ETH Wakeup: 以太网唤醒中断
      21. RTC Tamper/Timestamp/Security: 实时时钟防窃取/时间戳/安全中断
    3. 要注意的是:
      1. PAx~PGx 端口的中断事件都连接到了EXTIx,即同一时刻EXTx只能相应一个端口的事件 触发,不能够同一时间响应所有GPIO端口的事件,但可以分时复用。它可以配置为上升沿触发,下降沿触发或双边沿触发。EXTI 最普通的应用就是接上一 个按键,设置为下降沿触发,用中断来检测按键。

    4. 简单配置EXTI外部中断
      void EXTI_Configuration(void)
      {
      		EXTI_InitTypeDef EXTI_InitStruct = {0};
      	
      		/* 初始化EXIT外部事件线  为EXTI选择输入源*/
      		GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8);// 选择要设置为EXTI 线的端口及引脚
      		GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource9);		
      		GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
      		
      		EXTI_InitStruct.EXTI_Line = EXTI_Line8 | EXTI_Line9 | EXTI_Line0;
      		EXTI_InitStruct.EXTI_LineCmd = ENABLE;
      		EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;		// 把EXTI_Linexx的模式设置为为中断模式,也可以赋值为事件模式
      		// EXTI_Mode_Event 这个模式不会立刻触发中断,而只是在寄存器上把相应的事件标置位置1
      		EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;    // 下降沿中断   
      		EXTI_Init(&EXTI_InitStruct);
      }
  3. 中断处理函数

    /* 中断处理函数 */
    void EXTI9_5_IRQHandler(void)
    {
    		// 检测EXTI信号来源 ---> 由按键触发中断
    		while(EXTI_GetITStatus(EXTI_Line9)){
    				
                    // 工作内容
                    // ....
    				EXTI_ClearITPendingBit(EXTI_Line9); // 用于清除外部中断线上的中断挂起标志位
    		}
    		while(EXTI_GetITStatus(EXTI_Line8)){
    
    				// 工作内容
                    // ....
    				EXTI_ClearITPendingBit(EXTI_Line8);
    		}
            // 等等...
            return;
    }

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

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

相关文章

【数据结构C/C++】顺序与链式二叉树创建与前中后、层序遍历

文章目录 顺序存储结构二叉树链式存储结构二叉树刷题推荐408考研各数据结构C/C代码(Continually updating) 顺序存储结构二叉树 顺序存储结构的二叉树的特点在于,其使用数组存放二叉树中的每一个节点。 我们设定根节点的数组索引下标为n&…

忘记压缩包密码?解决方法一键找回,省时又便捷!

使用在线rar/zip解密工具,找回rar/zip密码并解密压缩包的方法非常简单。具体步骤如下:首先,在百度上搜索“密码帝官网”,这是一个专业的解密服务网站。然后,点击搜索结果中的链接,进入官网首页。在页面上方…

节能环保的选择:OLED透明拼接屏在葫芦岛市市场的成功应用

葫芦岛市位于中国辽宁省东北部,是一个拥有悠久历史和丰富自然景观的城市。 近年来,OLED透明拼接屏在葫芦岛市的市场表现备受瞩目,成为该市展示技术的重要代表。 OLED透明拼接屏以其出色的显示效果和高清清晰度而闻名,能够提供出…

大模型部署手记(9)LLaMa2+Chinese-LLaMA-Plus-7B+Windows+llama.cpp+中文文本补齐

1.简介: 组织机构:Meta(Facebook) 代码仓:GitHub - facebookresearch/llama: Inference code for LLaMA models 模型:llama-2-7b、Chinese-LLaMA-Plus-7B(chinese_llama_plus_lora_7b&#x…

使用/deep/覆盖element中的样式

我们在开发Vue项目的时候一般都会在组件中的style标签上面添加scoped属性&#xff0c;从而避免父组件影响子组件的样式&#xff0c;达到只修改当前组件样式的目的。 <style scoped lang"scss">... </style> 其原理是——在打包的时候会给每个选择器都添…

什么是存储服务器?

随着互联网的发展&#xff0c;越来越多的信息会在网络上暴露&#xff0c;所以企业就会更加重视数据&#xff0c;因此更加安全可靠的数据存储服务器受到了大多数人的信赖&#xff0c;今天就让小编带大家了解一下什么是存储服务器吧&#xff01; 存储服务器的含义。存储服务器是…

基于乌燕鸥优化的BP神经网络(分类应用) - 附代码

基于乌燕鸥优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于乌燕鸥优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.乌燕鸥优化BP神经网络3.1 BP神经网络参数设置3.2 乌燕鸥算法应用 4.测试结果&#x…

常见的Web安全漏洞(2021年9月的OWASP TOP 10)

聊Web安全漏洞&#xff0c;就不得不提到OWASP TOP10。开放式Web应用程序安全项目&#xff08;OpenWeb Application Security Project&#xff0c;OWASP&#xff09;是一个开源的、非营利的组织&#xff0c;主要提供有关Web应用程序的实际可行、公正透明、有社会效益的信息&…

每日一题 2731. 移动机器人(中等,模拟)

思路: 机器人是完全相同的且移动速度一样&#xff0c;所以对于碰撞后转向的机器人&#xff0c;可以看作是不碰撞继续运动。可以这么理解&#xff0c;如果没有碰撞&#xff0c;在移动后坐标 i 处有一个机器人&#xff0c;那么存在碰撞的情况下&#xff0c;坐标 i 处任有一个机器…

全志R128芯片应用开发案例——驱动 WS2812 流水灯

驱动 WS2812 流水灯 本文案例代码下载地址驱动 WS2812 流水灯案例代码https://www.aw-ol.com/downloads?cat24 R128-DevKit 拥有4颗 WS2812 LED&#xff0c;本文将详细叙述如何点亮他们。 LEDC 模块简介 LEDC 硬件方框图如上图所示&#xff0c;CPU 通过 APB 总线操作 LEDC 寄…

使用“Apple 诊断”测试你的 Mac(查看电池是否到达更换标准)

使用“Apple 诊断”测试你的 Mac “Apple 诊断”&#xff08;以前称为“Apple Hardware Test”&#xff09;可以检查你的 Mac 是不是存在硬件问题。 如果你认为你的 Mac 可能存在硬件问题&#xff0c;可以使用“Apple 诊断”来帮助确定可能存在故障的硬件组件。“Apple 诊断”…

2023P企业管理系统提供商,助力大中型企业一体化管理,免费更新

大中型企业通常业务流程更为复杂&#xff0c;工作数据更庞大&#xff0c;数据迁移的过程中可能会遇到数据不一致、数据丢失等问题。因此大中型企业实施ERP系统是一项复杂的任务&#xff0c;需要企业投入大量的资源和精力&#xff0c;克服各种困难和挑战。 在过往为广西省大中型…

淘宝API官方商品、交易、订单、物流、插旗接口如下:

以下是一些淘宝官方商品、交易、订单、物流、插旗接口的参考&#xff1a; 获取一个产品的信息(taobao.product.get)&#xff1a;该接口可以获取一个产品的信息&#xff0c;包括商品ID、标题、价格、销量等。搜索产品信息(taobao.products.search)&#xff1a;该接口可以搜索产…

“UTONMOS”掀起元宇宙游戏热潮,全球发展前景广阔

我们都知道&#xff0c;市面上无论是PC端的网游还是移动端手游&#xff0c;它如果要做到源源不断的内容输出&#xff0c;不仅取决于游戏公司产品质量和业绩&#xff0c;也与公司的决策和市场沟通密不可分。 元宇宙游戏市场受到关注 近年来&#xff0c;元宇宙游戏市场逐渐升温…

算法题:柠檬水找零(典型的贪心算法问题)

这道题就是纯贪心算法题&#xff0c;遍历每个顾客&#xff0c;先把钱收了&#xff0c;如果是10块钱就判断手里头有没有5元用于找零&#xff1b;如果是20块钱&#xff0c;先判断是不是有10元5元&#xff0c;如果没有就再判断是否有3个5元。没有的话就直接返回 False。(完整题目附…

保研经历分享(一)

这个系列的文章主要是想记录一下自己大学期间最重要的一件事&#xff08;保研!!&#xff09;的经历、过程&#xff0c;外加一些保研流程介绍、面试经验、院校投递、踩坑经历&#xff0c;主要给学弟学妹们避雷&#xff0c;也做一些借鉴吧~ 这一篇主要是对保研过程的一些介绍&…

如何在虚幻引擎中渲染动画?

大家好&#xff0c;今天我将展示如何在虚幻引擎中渲染动画&#xff0c;以及虚幻引擎渲染动画怎么设置的方法步骤。 需要提前了解&#xff1a; 虚幻引擎本地运行慢、渲染慢、本地配置不够&#xff0c;如何解决&#xff1f; 渲云云渲染支持虚幻引擎离线渲染&#xff0c;可批量…

【UE5】Pixel Streaming 配置https协议

【UE5】Pixel Streaming 配置https协议 Pixel Streaming 传输视频流插件&#xff0c;使用任何现代Web浏览器进行连接&#xff0c;并从虚幻引擎应用程序中流式传输渲染的帧像素和音频。 用户无需安装或下载任何内容。 HTTPS &#xff08;全称&#xff1a;Hypertext Transfer Pro…

大模型部署手记(12)LLaMa2+Chinese-LLaMA-Plus-2-7B+Windows+text-gen+中文对话

1.简介&#xff1a; 组织机构&#xff1a;Meta&#xff08;Facebook&#xff09; 代码仓&#xff1a;https://github.com/facebookresearch/llama 模型&#xff1a;chinese-alpaca-2-7b-hf 下载&#xff1a;使用百度网盘下载 硬件环境&#xff1a;暗影精灵7Plus Windows版…