百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

stm32中断详解

bigegpt 2024-09-04 02:50 4 浏览

中断介绍

1:在单片机系统中,如果遇到需要紧急处理的突发事件时,CPU需要迅速的作出反应,暂停正在运行的程序来处理突发事件,这时就需要中断

2:中断是指单片机正在执行程序的时,发生突发事件从而打断当前程序,转而去处理这一事件,当处理完成后再回到原来被打断出继续执行原程序的过程

异常

异常是导致程序流更改的事件。当发生异常时,处理器暂停当前正在执行的任务,并执行程序中称为异常处理程序的一部分。异常处理程序的执行完成后,处理器将恢复正常的程序执行。在ARM体系结构中,中断是一种异常类型。中断通常由外设或外部输入产生,在某些情况下,它们可以由软件触发。中断的异常处理程序也称为中断服务例程(ISR)

每个异常源都有一个异常编号。异常编号1至15为系统异常,异常编号16及以上为中断。Cortex-M3和Cortex-M4处理器中的NVIC设计可支持多达240个中断输入。然而,在实践中,设计中实现的中断输入数量要少得多,通常在16到100之间。通过这种方式,设计的硅尺寸可以减小,这也降低了功耗。

在stm32中存在一个嵌套矢量中断控制器(NVIC)

NVIC是Cortex-M处理器的一部分。它是可编程的,其寄存器位于内存映射的系统控制空间(SCS)中

NVIC处理异常和中断配置、优先级和中断屏蔽。NVIC具有以下功能:

?灵活的异常和中断管理

?嵌套异常/中断支持

?矢量化异常/中断条目

?中断屏蔽

异常类型

1:系统异常

2:中断

3:中断控制

重置后,将禁用所有中断,并将优先级值设置为0。在使用任何中断之前,您需要:

设置所需中断的优先级(此步骤是可选的)

在触发中断的外围设备中启用中断生成控制

在NVIC中启用中断

在大多数典型的应用程序中,这就是您需要做的全部工作。当中断触发时,相应的中断服务例程(ISR)将执行(您可能需要清除处理程序内外围设备的中断请求)。ISR的名称可以在启动代码的矢量表中找到,启动代码也是由微控制器供应商提供的。ISR的名称需要与向量表中使用的名称匹配,以便链接器可以将ISR的起始地址正确地放入向量表中。

中断资源介绍

在介绍资源时我们先了解一下EXTI

EXTI 控制器的主要特性:

每个中断/事件线上都具有独立的触发和屏蔽

每个中断线都具有专用的状态位

支持多达23个软件事件/中断请求

检测脉冲宽度低于APB2 时钟宽度的外部信号

从图中看出和外部中断有关的寄存器有:上升沿触发选择、下降沿触发选择、软件中断事件寄存器、中断屏蔽寄存器、挂起请求寄存器、事件屏蔽寄存器和NVIC中断控制寄存器等。此外就是对输入线的理解了。

在stm32f4系列中具有140个GPIO 通过以下方式连接到16个外部中断\事件线上

例如:PA0占用了EXTI0则PB0·PG0则不可使用

另外还有七根线的连接

简单介绍了一下EXTI后我们需要了解在这么多中断时加入同时发生中断我们应该先执行哪一个中断,下面我们介绍一下NVIC控制器

NVIC 控制器是控制中断优先级的

中断优先级的一个意义:出现多个中断同时触发,但是不能同时处理,所以先后顺序之分,要根据实际上的运行环境优先处理重要的中断。

1.概述

STM32 对中断优先级进行分组,共 5 组,组 0~4,这些分组是用于指定当前M4支持多少个抢占优先级和多少个响应优先级。同时,对每个中断设置一个抢占优先级和一个响应优先级。函数原型如下

/** * @brief Configures the priority grouping: pre-emption priority and subpriority. * @param NVIC_PriorityGroup: specifies the priority grouping bits length. * This parameter can be one of the following values: * @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority //不支持抢占优先级 * 4 bits for subpriority //支持16个响应优先级 * @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority //支持2个抢占优先级 * 3 bits for subpriority //支持8个响应优先级 * @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority //支持4个抢占优先级 * 2 bits for subpriority //支持4个响应优先级 * @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority //支持8个抢占优先级 * 1 bits for subpriority //支持2个响应优先级 * @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority //支持16个抢占优先级 * 0 bits for subpriority //不支持响应优先级 * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible. * The pending IRQ priority will be managed only by the subpriority. * @retval None */ void NVIC_PriorityGroupConfig(uint32_t, NVIC_PriorityGroup)

只要开机初始化一次之后中断优先级分组就确定了

NVIC结构体原型

NVIC_InitStructure.NVIC_IRQ = IRQn;//中断线

NVIC_InitStructure.NVIC_IRQPreemptPriority =pri;//抢占优先级

NVIC_InitStructure.NVIC_IRQSubPriority = pri1;//响应优先级

NVIC_InitStructure.NVIC_IRQEnable = ENABLE;//中断使能

NVIC_Init(&NVIC_InitStructure);//中断初始化


关于抢占优先级与响应优先级的差别

抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。

4)抢占优先级相同且响应优先级相同的中断,假如同时发生,会按照硬件内部固定的优先级执行,如下图。

5)无论是抢占优先级还是响应优先级,优先级数值越小,就代表优先级越高。

四、中断服务函数

中断服务函数要简单、高效完成,以下的delay函数是为了方便观察中断现象,在实际项目开发过程,是不会这么做的。

常用代码贴文

void exit0_Init(void)//中断初始化函数

{

//使能端口D按键检测端口,端口A的输出

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);


GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//输出端口设置

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//端口的模式

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//端口响应速度

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;//设置上下拉店主

GPIO_Init(GPIOD,&GPIO_InitStructure);



RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//激活系统时钟

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource0);//将PD0连接到中断EXIT0


//外部中断配置


EXTI_InitStructure.EXTI_Line = EXTI_Line0;//外部中断0

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//触发方式

EXTI_InitStructure.EXTI_LineCmd = ENABLE;//是能

EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//打开外部中断0的请求

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;//抢占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;//响应优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//终端请求使能

NVIC_Init(&NVIC_InitStructure);

}

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...