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

目录

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

中断分三个级别

中断控制器

STM32 的中断和异常

NVIC 中断控制器

NVIC 结构体成员

抢占优先级和响应优先级

简单配置NVIC中断控制器

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

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

要注意的是:

简单配置EXTI外部中断

中断处理函数

NVIC 和 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 这个模式不会立刻触发中断,而只是在寄存器上把相应的事件标置位置1EXTI_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;
    }
  4. NVIC 和 EXTI 的区别?

    1. NVIC 是中断控制器, EXTI是外部事件中断源,EXTI仅仅是NVIC上的一个中断源

  5. 编号相关问题?

    1. 中断号(由NVIC编号)的顺序和异常向量表的顺序相关

    2. 外部中断的中断号, 和GPIO管脚编号相关
  6. 外部中断号与中断号的对应关系?

    1. 外部中断0 (EXTI0) 对应的中断号是0  【独占一个】
    2. 外部中断5~9 对应的中断号是同一个  【共享一个】

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

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

相关文章

“桥接模式”和“NAT模式”以及“host-only模式(仅主机模式)”

使用虚拟机的时候,我们常看到网络链接配置中,有【桥接】、【NAT】、【仅主机】的选项,今天就来介绍一下这三种网络链接模式。 关于虚拟机中配置网络的内容可以看这篇博客: 深入浅出的介绍一下虚拟机VMware Workstation——part2…

自己一天在家没事就爱折腾

来吃馍馍了,看我自己动手做的花卷,味道一定美极了,哈哈,有没有想吃的呀!快来我家,我和你一起分享。

三维地下管线建模软件MagicPipe3D V3.1.3发布

经纬管网建模系统MagicPipe3D V3.1.3持续更新,内容如下: (1)新增管线流向配置,建模生成带流向箭头管道模型; (2)新增建模完成后可以直接载入3DTiles或obj模型功能; &a…

5.(vue3.x+vite)v-if与v-show区别

前端技术社区总目录(订阅之前请先查看该博客) 1:效果预览 2:v-if与v-show区别 1、v-if会增删DOM元素。 2、v-show比v-if性能更高,因为v-show只能动态的改变样式(display),不需要增删DOM元素。 3、v-if切换时候回实时的销毁和重建内部的事件、钩子函数等,v-show只会…

基于大规模分布式系统的云原生运维实践

在云计算、大数据、人工智能等新兴技术的推动下,众多行业都在经历一场轰轰烈烈的数字化转型大潮。随着容器技术和编排系统的发展、基础设施不断云化、分布式微服务架构不断演进和敏捷、DevOps等开发理念的带动,应用云化已经是不可逆转的趋势,云原生也成为…

Docker 网络访问原理解密

How Container Networking Works: Practical Explanation 这篇文章讲得非常棒,把docker network讲得非常清晰。 分为三个部分: 1)docker 内部容器互联。 2)docker 容器 访问 外部root 网络空间。 3)外部网络空间…

k8s集群安装v1.20.9后-2-改造部署自己的服务k8sApp,增加istio

1.环境准备: K8s集群,已经实现了k8s-app小例子,可以正常访问。(已包含docker) 在此基础上对项目进行改进,实现istio流量切换。 2.安装部署istio 2.1 安装go 官网下载go和istio的安装包,上传到k8s集群虚拟机上(三个机器都安装) [root@node1 ~]# cd /root/Public/i…

Cisdem Video Player for mac(高清视频播放器) v5.6.0中文版

Cisdem Video Player mac是一款功能强大的视频播放器,适用于 macOS 平台。它可用于播放不同格式的视频文件,并具有一些实用的特性和功能。 Cisdem Video Player mac 中文版软件特点 多格式支持:Cisdem Video Player 支持几乎所有常见的视频格…

Kubernetes新增节点

1. K8S节点Hosts及防火墙设置 node3节点进行如下配置&#xff1a; #添加hosts解析&#xff1b; cat >/etc/hosts<<EOF 127.0.0.1 localhost localhost.localdomain 192.168.1.146 master1 192.168.1.147 node3 EOF #临时关闭selinux和防火墙&#xff1b; sed -i /SE…

破解mariadb密码

破解mariadb密码 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.先停止mariadb systemctl stop mariadb.service 2.进单用户模式 mysqld_safe --skip-grant-tables & 3.登录mariadb mysql -uroot #&#xff08;不用密码也能登录&#xff09; 4.切换到mysql …

解决 Centos 安装 Python 3.10 的报错: Could not import runpy module

操作环境&#xff1a;CentOS 7、Gcc 4.8.5、Python 3.10.0 系统上已经有 2.x&#xff0c;3.6 版本的 Python 了&#xff0c;但是还是想装一个 3.10 的。因为刚写的脚本文件是较高版本的&#xff0c;在 3.6 上无法正常运行&#xff0c;Python 语法不是很了解&#xff0c;只能从…

分享一份关于 Rust 编程的学习指南

Rust是一种现代的系统级编程语言&#xff0c;以其注重内存安全、性能和并发性而闻名。学习Rust可以是一段有回报的旅程&#xff0c;为您打开构建强大高效应用的机会。无论您是经验丰富的开发者还是完全的初学者&#xff0c;本指南将通过精选的资源和技巧帮助您踏上Rust编程之旅…

华为李鹏:加速5G商业正循环,拥抱更繁荣的5.5G(5G-A)

2023年10月10日&#xff0c;在华为主办的第十四届全球移动宽带论坛上&#xff0c;华为高级副总裁、运营商BG总裁李鹏面向来自全球的运营商和产业伙伴&#xff0c;提出抓住网络需求和趋势的力量——“面向后天的业务&#xff0c;积极规划明天的网络&#xff0c;加速5G商业正循环…

【Qt之QTableWidget和QTreeWidget】树悬停、选择样式及表格表头和首行间隔线

QTableWidget设置表头与首行间隔线 win10 实例化QTableWidget后&#xff0c;表格表头和首行中间无间隔线&#xff0c;以下是通过样式表进行设置&#xff1a; // 设置横向表格头的间隔线&#xff0c;可设置四个方向的间隔线,不需要间隔线的可以设置为0px// border-left:0px sol…

使用pendulum包对时间数据进行加、减操作 add()和subtract()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 使用pendulum包 对时间数据进行加、减操作 add()和subtract() 选择题 请问dt.add(years5)的结果是&#xff1a; import pendulum as pdl print("【执行】dtpdl.datetime(2023,10,1)&qu…

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

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

distcc分布式编译

distcc https://gitee.com/bison-fork/distcc.git 下载工具链 mingw&#xff0c;https://www.mingw-w64.org/downloads/#w64devkitperl&#xff0c;https://strawberryperl.com/releases.html免安装zip版本&#xff0c;autoconf等脚本依赖perlautoconf、automake&#xff0c…

催交费通知单套打单纸设置说明

2.0系统打印催交费通知单设置尺寸操作展示如下,仅供参考。具体如下: 一、Win7系统 1.找到设备和打印机,选中对应打印机后点击上方打印服务器属性; 2.创建一个宽14cm,高14cm的表单; 二、win10系统 1.找到打印机,点管理,选择打印首选项;

17.(开发工具篇Gitlab)如何在Gitlab配置ssh key

前言: Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置 一、git 配置 (1)打开 git 命令窗口 (2)配置用户名(填自己的姓名) git config --global user.name “chenbc” (3)配置用户邮箱(填自己的邮箱) git config …

金和OA C6任意文件读取漏洞 复现[附POC]

文章目录 金和OA C6任意文件读取漏洞 复现[附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 金和OA C6任意文件读取漏洞 复现[附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试…