STM32 中断NVIC详解,配置及示例

news2024/12/26 22:02:27

        NVIC全称 Nested Vectored Controller 嵌套向量中断控制器

        它是一种硬件设备,用于管理和协调处理器的中断请求。NVIC可以管理多个中断请求,并按优先级处理它们。当一个中断请求到达时,NVIC会确定其优先级并决定是否应该中断当前执行的程序,以便及时响应和处理该中断请求。

        它可以提高系统的响应速度和可靠性,尤其是在需要及时处理大量中断请求的实时应用程序中。NVIC通常集成在处理器中,可以使用特定的控制寄存器进行编程配置。在嵌入式系统中,程序员需要理解和使用NVIC以确保系统能够正确处理中断请求,同时提高系统的性能和可靠性。

       举个例子:当你在炒菜的时候,来了个电话,你停下炒菜,去接了个电话,然后再回来炒菜。停下炒菜,去接电话。这个过程就叫做中断。

        在STM32中有两个优先级的概念,每个中断源都需要指定这两种优先级。

  • 抢占优先级 Preemption Priority
  • 从优先级(响应优先级) Sub Priority

        其中高抢占优先级的中断可以嵌套低抢占优先级的中断。

        假设 X抢占优先级为X_{P},Y抢占优先级为Y_{P},X响应优先级为X_{S},Y响应优先级位Y_{S}

X_{P}>Y_{P}时,中断Y_{P}和代码,先执行X_{P}

X_{P}=Y_{P}时,若X_{P}先到达,则先执行X_{P}后执行Y_{P}。反之,先执行Y_{P}后执行X_{P}

X_{P}=Y_{P}X_{S}=Y_{S}时,根据它们在中断表中的排位顺序执行。

        可以使用STM32库函数中的NVIC_PriorityGroupConfig()选择优先级,函数的参数为NVIC_PriorityGroup_X

        EXTI(External Interrupt/event Controller)是外部中断/事件控制器。它提供了一种单向的、由外部事件触发的中断机制,可以用于响应外部信号的变化,例如按键、传感器、通信接口等外设的状态变化。EXTI模块可以配置为两种工作模式:事件中断和触发中断。

        事件中断:手头有上的事情做完了,再去执行中断。

        触发中断:直接执行中断。

        所以中断请求的及时性比时间请求的及时性快。

        触发方式有上升沿触发、下降沿触发、双边沿触发、以及低电平触发。

        EXTI模块可以实现多种中断触发方式的支持,中断延时时间短,具有高精度的中断响应能力,并可以与其他外设操作结合使用,是STM32微控制器中实现外部中断的常用模块。

        我们看一下外部中断/时间线路映像图

        从中我们可以看到PA0/PB0/.../PG0——>EXTI0 ,PA1/PB1/.../PG1——>EXTI1,...,PA15/PB15/.../PG15——>EXTI15       

        在本示例用PA0按钮控制LED亮灭,所以等等配置EXTI_Line的时候就要用到EXTI_Line0

//1.配置NVIC

	NVIC_InitTypeDef NVIC_InitStructure;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitStructure.NVIC_IRQChannel =EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	
    NVIC_Init(&NVIC_InitStructure);

//2.配置PA0+PA0外部中断使能

	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);

//3.配置EXTI

	EXTI_InitTypeDef EXTI_InitSturcture;
	
	EXTI_InitSturcture.EXTI_Line = EXTI_Line0;
	EXTI_InitSturcture.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitSturcture.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitSturcture.EXTI_LineCmd = ENABLE;
	
	EXTI_Init(&EXTI_InitSturcture);

//4.开启PA0和PA0的复用功能的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

到这里PA0的配置就搞定了

void PA0_EXTI0_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitSturcture;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitStructure.NVIC_IRQChannel =EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	EXTI_InitSturcture.EXTI_Line = EXTI_Line0;
	EXTI_InitSturcture.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitSturcture.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitSturcture.EXTI_LineCmd = ENABLE;
	
	EXTI_Init(&EXTI_InitSturcture);
	
}

//5.配置LED

void Led_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

        根据中断表,当PA0配置成外部中断,只要PA0出现异常就会跳转到EXTI0_IRQHandler。

        在STM32中,厂家已经把中断的主要部分都编写完了,我们只需要在stm32f103x_it.c中编写自己需要的中断即可。也可以放在自己想要的位置。

void EXTI0_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line0)==SET)
	{
		GPIOA->ODR ^= GPIO_Pin_1;
        ClearITPendingBit(EXTI_Line0);
	}
}

        EXTI_GetITStatus是判断中断是否触发,触发的话返回SET,没出发返回RESET       

        触发后翻转一次PA1的电平。

        然后清除EXTI_GetITStatus,要不然你第一次按下PA0的按钮后,EXTI_GetITStatus返回SET,然后会一直触发中断。

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

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

相关文章

python自动化测试(二):获取元素定位的基本方式

目录 一、前置代码 二、通过HTML元素ID的方式去进行元素定位 三、通过HTML元素的name属性进行元素定位 四、练习一:打开百度登录界面并输入数据后登录 五、通过HTML元素的类名来进行元素定位 六、通过链接的文本值方式进行元素定位 七、通过部分的链接文本值…

mac电脑怎么永久性彻底删除文件?

Mac老用户都知道在我们查看Mac内存时都会发现有一条“其他文件”占比非常高,它是Mac储存空间中的“其他”数据包含不可移除的移动资源,如,Siri 语音、字体、词典、钥匙串和 CloudKit 数据库、系统无法删除缓存的文件等。这些“其他文件”无用…

如何使用Abaqus进行跌落仿真

跌落测试通常是主要用来模拟产品在搬运期间可能受到的自由跌落,考察产品抗意外冲击的能力。通常跌落高度大都根据产品重量以及可能掉落机率作为参考标准,落下表面应该是混凝土或钢制成的平滑、坚硬的刚性表面(如有特殊要求应以产品规格或客户…

word英文论文检查标点是否正确

背景 英文论文,国内很多都是word模板,我们在搞完文章内容后,往往需要做点关于标点符号的检查。 检查内容 我个人经验来讲,有如下: . 后面有没有加空格,并且下一句话首字母大写。, 后面有没有加空格&…

微信小程序学习

Window导航栏 设置上拉触底的距离 概念:上拉触底是移动端的专有名词,通过手指在屏幕上的上拉滑动操作,从而加载更多数据的行为。 设置步骤: app.json -> window -> 为 onReachBottomDistance 设置新的数值 注意&#xf…

Centos7安装mongodb7.0.2教程以及基础java远程使用

由于项目性能需求,尝试研究mongodb的使用,与mysql的存储和读取性能进行比较。安装完成发现,其批量写入数据功能确实比mysql快,但是读取性能并不如mysql,但是由于其是文件型数据库,可能在内存操作点啥&#…

超声波测距与倒车雷达电路1

文章目录 超声测距 超声测距 超声测距跟倒车雷达绝大多数用的都是40kHz 接受是一个同相比例整流后加上一个比较器 换能器自带滤波,需要激发信号与换能器信号匹配 这个电路图是错的,一直不停的发,底下来不及收 频率越高传输距离…

Pritunl搭建OpenVPN服务器详细流程,快速实现公网远程连接!

文章目录 前言1.环境安装2.开始安装3.访问测试4.创建连接5.局域网测试连接6.安装cpolar7.配置固定公网访问地址8.远程连接测试 前言 Pritunl是一款免费开源的 VPN 平台软件(但使用的不是标准的开源许可证,用户受到很多限制)。这是一种简单有…

mac加速器哪个好用?Mac提升运行速度的十大小技巧

经常听到小伙伴在抱怨PC电脑很慢,但是其实Mac电脑随着用的时间增长,运行速度也会越来越慢,那么造成Mac运行慢的原因有很多,可能是操作系统过时未更新,也可能是内存(RAM)不足,以下小编…

C++智能指针[下](shared_ptr/weak_ptr/循环引用/删除器)

文章目录 4.智能指针[shared_ptr]4.1设计理念成员属性 4.2主要接口拷贝构造 4.3引用计数线程安全问题测试线程安全通过对计数引用的加锁保护使得类线程安全类实例化的对象使用时需要手动加锁保护 "锁"的引进线程引用传参问题 4.4整体代码 5.循环引用问题5.1问题的引入…

算法通关村第二关-黄金挑战K个一组反转

大家好我是苏麟 , 今天带来K个一组反转 , K个一组反转 可以说是链表中最难的一个问题了,每k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后…

为“数字盲道”修“护栏”,隐语YACL护航无障碍数字服务隐私安全

“隐语”是开源的可信隐私计算框架,内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择,提供丰富的联邦学习算法和差分隐私机制 开源项目:github.com/secretflowgitee.com/secretflow 10月19日,杭州第4届亚洲残疾人运动会火炬…

cola架构:有限状态机(FSM)源码分析

目录 0. cola状态机简述 1.cola状态机使用实例 2.cola状态机源码解析 2.1 语义模型源码 2.1.1 Condition和Action接口 2.1.2 State 2.1.3 Transition接口 2.1.4 StateMachine接口 2.2 Builder模式 2.2.1 StateMachine Builder模式 2.2.2 ExternalTransitionBuilder-…

重生奇迹MU上武器加13有加成吗?

重生奇迹一身加13的额外属性在哪看 装备页面。在角色扮演类游戏《重生奇迹mu》中,玩家可以在装备页面查看一身加13的额外属性,该道具能为玩家提供攻击力加成,输出更多的伤害。 重生奇迹13绝望之仗需要多少力量 16力量。重生奇迹mu加13绝望…

掌动智能APP自动化测试工具的主要功能

掌动智能APP自动化测试工具是一类用于自动执行测试脚本和验证移动应用程序的工具。它们模拟用户与应用程序的交互,以便检查应用程序的功能、性能和稳定性。这些工具可以用于各种移动平台,包括iOS和Android。本文将介绍APP自动化测试工具的主要功能有哪些…

大数据-Storm流式框架(四)---storm容错机制

1、集群节点宕机 Nimbus服务器 硬件 单点故障?可以搭建HA jStorm搭建 nimbus的HA nimbus的信息存储到zookeeper中,只要下游没问题(进程退出)nimbus退出就不会有问题, 如果在nimbus宕机,也不能提交…

DC-9 靶机

DC_9 信息搜集 存活检测 详细扫描 后台网页扫描 漏洞利用 漏洞发现 在 search 页面的输入框尝试 sql 注入 1 or 11#返回大量数据 sqlmap 爆破数据库 sqlmap -u http://10.4.7.154/search.php --dbs --batch 爆破失败,显示未找到参数 抓包查看 爆破数据库 …

iPhone手机屏幕分辨率

ios app测试时,需要测试应用在不同型号的苹果手机上的表现形式,可以自己在浏览器上配置。 代数设备逻辑像素尺寸缩放发布时间第一代iPhone 2G320 x 480480 x 3203.5寸1x2007年6月29日第二代iPhone 3320 x 480480 x 3203.5寸1x2008年7月11日第三代iPhone …

ThinkPHP8学习笔记

ThinkPHP8官方文档地址:ThinkPHP官方手册 一、composer换源 1、查看 composer 配置的命令composer config -g -l 2、禁用默认源镜像命令composer config -g secure-http false 3、修改为阿里云镜像源composer config -g repo.packagist composer https://mirror…

JoySSL-新兴国产品牌数字证书

随着我国对数据安全重视程度的不断提升,国产SSL证书越来越受到广大政府机关和企业的青睐,成为提升网站数据安全能力的重要技术手段。那么什么是国产SSL证书?国产SSL证书和普通SSL证书又有什么区别呢? 什么是国产SSL证书&#xff…