第六章嵌套向量中断
- 格式:ppt
- 大小:1.85 MB
- 文档页数:5
一、引言Nvic嵌套向量中断控制器(Nested Vectored Interrupt Controller)是一种常见的中断控制器,它在嵌入式系统中扮演着重要的角色。
本文将介绍Nvic的工作原理,帮助读者更好地理解这一关键的硬件组件。
二、Nvic的基本概念Nvic是一种硬件组件,用于管理和分发系统中的中断请求。
在嵌入式系统中,当发生外部事件或者特定的处理器状态发生变化时,需要立即中断当前的程序执行,执行特定的中断服务程序。
而Nvic就是用来协调这些中断请求的,确保它们按照优先级和顺序得到正确的处理。
三、中断控制器的作用1.管理中断请求中断是在嵌入式系统中的一种重要的事件响应机制。
当外部设备(如传感器、通信接口等)产生需要处理的事件时,会向处理器发送中断请求。
而中断控制器就是负责接收、管理和分发这些中断请求的硬件组件。
2.中断优先级在一个嵌入式系统中,可能同时出现多个中断请求,此时中断控制器需要根据中断请求的优先级决定哪个中断将被优先处理。
Nvic通过优先级编码的方式,能够准确地确定中断的优先级,确保高优先级的中断能够得到及时处理。
四、Nvic的工作原理1.中断向量表Nvic通过中断向量表来实现对中断请求的管理。
中断向量表是一张表格,每个中断都有一个特定的中断向量号。
当中断控制器接收到中断请求时,根据中断向量号可以迅速定位到对应的中断服务程序的入口位置区域,从而进行中断处理。
2.中断优先级编码Nvic使用中断优先级编码的方式来确定中断的优先级。
在Nvic中,中断请求会按照其具体的中断向量号进行编码,从而确定其优先级。
当多个中断请求同时到达时,Nvic会根据优先级编码来决定哪个中断会被优先处理。
3.嵌套中断Nvic支持嵌套中断的机制,即在一个中断服务程序的执行过程中,如果遇到了更高优先级的中断请求,Nvic可以暂停当前中断服务程序的执行,转而处理更高优先级的中断请求。
这种机制可以确保高优先级的中断能够得到及时处理,提高系统的响应速度。
目录
第6章嵌套向量中断控制器 (1)
6.1特性 (1)
6.2描述 (1)
6.3中断源 (1)
第6章嵌套向量中断控制器
6.1特性
?ARM Cortex-M3内部包含有嵌套向量中断控制器;
?与内核紧密联系的中断控制器,可支持低中断延时;
?可对系统异常和外设中断进行控制;
?支持33个嵌套向量中断;
?32个可编程的中断优先级;
?硬件优先级屏蔽;
?可重定位的向量表;
?不可屏蔽中断;
?软件中断功能。
6.2描述
嵌套向量中断控制器(NVIC)是Cortex-M3的一个内部器件。
与CPU紧密结合,降低了中断延时,让新进中断可以得到高效处理。
可参考《ARM®Cortex TM-M3技术参考指南》来获取NVIC操作的详细描述。
6.3中断源
表6.1列出了每一个外设功能所对应的中断源。
每一个外围设备可以有一条或几条中断线连接到向量中断控制器。
多个中断源也可以共用一条中断线。
除过ARM内核指定的某些标准外,哪一条中断线连接到哪一个中断源是无关紧要的或没有优先级的。
表6.1连接到向量中断控制器(VIC)的中断源。
STM32中NVIC(嵌套向量中断控制)的理解NVIC,中文名嵌套中断向量控制器,是Cortex-M3 系列控制器内部独有集成单元,与CPU 结合紧密,降低中断延迟时间并且能更加高效处理后续中断。
举个例子,比如火车站买票,那些火车站的规章制度就是NVIC,规定学生和军人有比一般人更高优先级,它们则给你单独安排个窗口,同学与同学之间也有区别,那就是你也得排队,也就是你的组别(抢断优先级)和你的排队序号(响应优先级)决定你何时能买到票。
抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。
响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌套。
STM32 中指定优先级的寄存器为4 位,其定义如下:第0 组:所有4 位用于指定响应优先级第1 组:最高1 位用于指定抢占式优先级,最低3 位用于指定响应优先级第2 组:最高2 位用于指定抢占式优先级,最低2 位用于指定响应优先级第3 组:最高3 位用于指定抢占式优先级,最低1 位用于指定响应优先级第4 组:所有4 位用于指定抢占式优先级以上定义也称作中断优先级分组,相关内容在STM32 固件库的misc.h 文件中有详细定义。
基础了解了就可以对中断进行操作了。
第一步:使用void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)函数对优先级分组配置。
NVIC_PriorityGroup 可以配置为NVIC_PriorityGroup_0 => 选择第0 组NVIC_PriorityGroup_1 => 选择第1 组NVIC_PriorityGroup_2 => 选择第2 组NVIC_PriorityGroup_3 => 选择第3 组NVIC_PriorityGroup_4 => 选择第4 组例如:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0)配置为0 组。
中断嵌套的处理过程在我们的生活中,常常会遇到一些复杂的问题,需要我们不断地进行思考和处理。
有时候,这些问题会像迷宫一样,将我们困在其中,让我们无法找到正确的出口。
在这种情况下,我们需要学会中断嵌套的处理过程,以避免陷入无尽的循环中。
中断嵌套的处理过程可以理解为在处理一个问题的过程中,当我们发现自己陷入了一个循环或死胡同时,及时中断当前的思考方式,尝试新的思路和方法,以打破困境,找到解决问题的办法。
我们需要明确问题的核心,并将其拆解成更小的子问题。
这样做可以帮助我们更好地理解问题的本质,并找到解决问题的方向。
然后,我们需要对每个子问题进行分析和思考,寻找可能的解决方案。
在这个过程中,我们可以尝试不同的方法和角度,以寻找最佳的解决方案。
当我们在解决一个子问题的过程中遇到了困难,或者发现自己陷入了一个死胡同时,我们需要及时中断当前的思考方式。
这时,我们可以停下来,放松一下自己的大脑,转移一下注意力。
可以进行一些与问题无关的活动,比如散步、听音乐或者与朋友交流。
这样做可以帮助我们放松心情,重新调整思维方式。
在中断的过程中,我们可以尝试思考其他的问题,或者从其他的角度思考同一个问题。
这样做可以帮助我们打破思维的局限,寻找到新的解决方案。
同时,我们也可以寻求他人的帮助和建议,听取他们的观点和意见。
这样做不仅可以为我们提供新的思路,还可以促进我们的思维活跃。
当我们在中断嵌套的处理过程后,重新回到问题的解决过程中时,我们会发现自己的思维变得更加清晰,解决问题的能力也得到了提高。
我们可以重新审视之前的思考方式和解决方案,找出其中的问题和不足之处,并进行修正和改进。
通过不断地中断和调整,我们最终可以找到解决问题的最佳路径,并成功地解决问题。
中断嵌套的处理过程是一种寻找解决问题的新思路和方法的策略。
通过中断和调整,我们可以打破思维的局限,找到解决问题的新途径。
这种处理过程需要我们保持积极的心态和灵活的思维,同时也需要我们学会倾听他人的意见和建议。
分析嵌套中断1.引言所谓“中断”是处理事件的一个“过程”,这一过程一般是由计算机内部或外部某件紧急事件引起并向主机发出请求处理的信号,主机在允许的情况下响应请求,暂停正在执行的程序,保存好“断点”处的现场,转去执行中断处理程序,处理完中断服务程序后自动返回原断点处,继续执行原程序,这一处理过程称为“中断”。
以AT89S52为例,中断系统含有8个中断源,共有6个中断矢量:定时/计数器0、1、2,INT0、INT1和UART。
两级中断优先级,可实现两级中断嵌套。
用户可以很方便的通过软件实现对中断的控制。
既然系统含有8个中断源,就有可能出现数个中断源同时提出中断请求的情况,这样,设计人员必须事先根据它们的轻重缓急来为每个中断源确定CPU对其的响应顺序。
然而,对于中断优先级寄存器IP来说,只可能设定两级优先,即控制位为1时对应的中断源为高级中断,反之,控制位为0时对应的为低级中断。
这样就出现一个问题:如果一个中断正在执行,如何才能让它响应同级甚至是低级中断请求呢?2.中断多优先级的扩展根据AT89S52的结构特点,其中断系统中含有两个不可寻址的“优先级生效”触发器。
一个用于指出CPU是否正在执行高优先级的中断服务程序,这个触发器为1时,系统将屏蔽所有的中断请求;另一个则指出CPU是否正在执行低优先级中断服务程序,该触发器为1时,将阻止除高优先级以外的一切中断请求。
由此可见,若要响应同级甚至是低级中断请求,必须使得该“优先级生效”触发器清零。
但该触发器又是不可寻址的,所以无法用软件直接清零。
遍历系统所提供的111条指令,只有RETI可以达到此目的。
该指令可在CPU执行该指令时,一方面清除中断响应时所置位的“优先级生效”触发器,另一方面可从当前栈顶弹出断点地址送入程序计数PC,从而返回主程序。
一个系统若有n级中断,在MCU中就有n个中断请求触发器,总称为中断请求寄存器;与之对应的有n个中断屏蔽触发器,总称为中断屏蔽寄存器。
中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。
简介其实就是更高一级的中断的“加塞”,处理器正在执行着中断,又接受了更急的另一件“急件”,转而处理更高一级的中断的行为!中断优先级定义优先级高的中断源可以中断优先级低的中断服务程序,这就形成了中断服务程序中套着中断服务程序的情况,即形成了所谓的中断嵌套。
MCU暂停现行程序而转去响应中断请求的过程称为中断响应;为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程序,硬件将中断源分为若干个级别,称作中断优先级。
查询优先级中断的优先级有两个:查询优先级和执行优先级。
查询优先级是datasheet或书上的默认(IP寄存器不做设置,上电复位后为00H)的优先级:外部中断0> 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断或int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART或PX0>PT0>PX1>PT1>PS>......其实都是查询优级。
首先查询优先级是不可以更改和设置的。
这是一个中断优先权排队的问题,是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。
而这与是否发生中断服务程序的嵌套毫不相干。
当CPU查询各个中断标志位的时候,会依照上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。
例如:当计数器0中断和外部中断1(按查询优先级,计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
STM32 NVIC嵌套向量中断控制器函数分析中断管理函数CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。
STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。
而我们常用的就是这60个可屏蔽中断,所以我们就只针对这60个可屏蔽中断进行介绍。
在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体:typedef struct{vu32 ISER[2];u32 RESERVED0[30];vu32 ICER[2];u32 RSERVED1[30];vu32 ISPR[2];u32 RESERVED2[30];vu32 ICPR[2];u32 RESERVED3[30];vu32 IABR[2];u32 RESERVED4[62];vu32 IPR[15];} NVIC_TypeDef;ISER[2]:Interrupt set enable registers中断使能寄存器组ICER[2]:interrupt clear enable registers 中断除能寄存器组ISPR[2]:interrupt set pending registers 中断挂起寄存器组ICPR[2]: interrupt clear pending registers 中断解挂寄存器组IABR[2]:interrupt active bit registers 中断激活标志寄存器组主要分析IPR[15]:interrupt priority registers 中断优先级控制寄存器组使用函数实现中断分组: 可选分组0--4MY_NVIC_PriorityGroupConfig(u8 NVIC_Group) {u32 temp,temp1;//设置中转变量temp1=(~NVIC_Group)&0x07; //取后3位temp1;AIRCR; //读取先前设置temp&=0x0000F8FF; //清空先前设置temp|=0x05FA0000; //插入密钥temp|=temp1; //分组设置赋值进SCB->;AIRCB=temp; //设置完的值赋值给中断分组寄存器}语句解读:temp1=(~NVIC_Group)&0x07; 由于所以组号取反与111 即得到分组所需寄存器值temp|=0x05FA0000;密钥使用函数实现中断优先级设置:void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) {u32 temp;u8 IPRADDR=NVIC_Channel/4; //每组只能存4个得到组地址u8 IPROFFSET=NVIC_Channel%4; //得到组内偏移地址IPROFFSET=IPROFFSET*8+4; //得到确切地址MY_NVIC_PriorityGroupConfig(NVIC_Group); //设置分组temp=NVIC_Preemptionpriority;>;NVIC_Group); //设置响应优先级temp&=0xf; //取低4位if(NVIC_Channel;ISER[0]|=1;ISER[1]|=1;IPR[IPRADDR ]|=temptemp=NVIC_Preemptionpriority;>;NVIC_Group); //响应优先级在右边,根据响应位多少进行右移temp&=0xf; //得到分组值外部中断配置函数:STM32的EXTI控制器支持19个外部中断/事件请求。
嵌套向量中断控制器(NVIC)NVIC 驱动有多种用途:例如使能或者失能I RQ 中断,使能或者失能单独的I RQ 通道,改变I RQ 通道的优先级等等。
Table 266. NVIC 库函数函数名描述NVIC_DeInit 将外设N VIC 寄存器重设为缺省值NVIC_SCBDeInit 将外设S CB 寄存器重设为缺省值NVIC_PriorityGroupConfig 设置优先级分组:先占优先级和从优先级NVIC_Init 根据N VIC_InitStruct 中指定的参数初始化外设N VIC 寄存器NVIC_StructInit 把N VIC_InitStruct 中的每一个参数按缺省值填入NVIC_SETPRIMASK 使能P RIMASK 优先级:提升执行优先级至0NVIC_RESETPRIMASK 失能P RIMASK 优先级NVIC_SETFAULTMASK 使能F AULTMASK 优先级:提升执行优先级至-1NVIC_RESETFAULTMASK 失能F AULTMASK 优先级NVIC_BASEPRICONFIG 改变执行优先级从N(最低可设置优先级)提升至1NVIC_GetBASEPRI 返回B ASEPRI 屏蔽值NVIC_GetCurrentPendingIRQChannel 返回当前待处理I RQ 标识符NVIC_GetIRQChannelPendingBitStatus 检查指定的I RQ 通道待处理位设置与否NVIC_SetIRQChannelPendingBit设置指定的I RQ 通道待处理位NVIC_ClearIRQChannelPendingBit清除指定的I RQ 通道待处理位NVIC_GetCurrentActiveHandler 返回当前活动的H andler(IRQ 通道和系统H andler)的标识符NVIC_GetIRQChannelActiveBitStatus 检查指定的I RQ 通道活动位设置与否NVIC_GetCPUID 返回I D 号码,Cortex-M3 内核的版本号和实现细节NVIC_SetVectorTable 设置向量表的位置和偏移NVIC_GenerateSystemReset 产生一个系统复位NVIC_GenerateCoreReset 产生一个内核(内核+NVIC)复位NVIC_SystemLPConfig 选择系统进入低功耗模式的条件NVIC_SystemHandlerConfig 使能或者失能指定的系统H andlerNVIC_SystemHandlerPriorityConfig 设置指定的系统H andler 优先级NVIC_GetSystemHandlerPendingBitStatus 检查指定的系统H andler 待处理位设置与否NVIC_SetSystemHandlerPendingBit 设置系统H andler 待处理位NVIC_ClearSystemHandlerPendingBit 清除系统H andler 待处理位NVIC_GetSystemHandlerActiveBitStatus 检查系统H andler 活动位设置与否NVIC_GetFaultHandlerSources 返回表示出错的系统H andler 源NVIC_GetFaultAddress 返回产生表示出错的系统H andler 所在位置的地址函数NVIC_SystemHandlerPriorityConfig函数名NVIC_SystemHandlerPriorityConfig函数原形void NVIC_SystemHandlerPriorityConfig(u32 SystemHandler, u8SystemHandlerPreemptionPriority, u8 SystemHandlerSubPriority) 功能描述设置指定的系统H andler 优先级输入参数1SystemHandler:待使能或者失能的指定系统H andler参阅S ection:SystemHandler 查阅更多该参数允许取值范围输入参数2SystemHandlerPreemptionPriority:指定系统H andler 的新组优先级参阅S ection:SystemHandlerPreemptionPriority 查阅更多该参数允许取值范围输入参数3SystemHandlerSubPriority:指定系统H andler 的新从优先级参阅S ection:SystemHandlerSubPriority 查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无SystemHandler 类型该参数指定了待设置的系统HandlerNVIC_ VectTab 描述SystemHandler_MemoryManage 存储器管理H andlerSystemHandler_BusFault 总线错误H andlerSystemHandler_UsageFault 使用错误H andlerSystemHandler_SVCall SVCall HandlerSystemHandler_DebugMonitor 除错监控H andlerSystemHandler_PSV PSV HandlerSystemHandler_SysTick 系统滴答定时器H andler例:/* Enable the Memory Manage Handler */NVIC_SystemHandlerPriorityConfig(SystemHandler_MemoryManage, 2, 8);函数N VIC_PriorityGroupConfig函数名NVIC_PriorityGroupConfig函数原形void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)功能描述设置优先级分组:先占优先级和从优先级输入参数NVIC_PriorityGroup:优先级分组位长度参阅S ection:NVIC_PriorityGroup 查阅更多该参数允许取值范围输出参数无返回值无先决条件优先级分组只能设置一次被调用函数无NVIC_PriorityGroup 值,该参数设置优先级分组位长度NVIC_PriorityGroup 描述NVIC_PriorityGroup_0 先占优先级 0 位从优先级 4 位NVIC_PriorityGroup_1 先占优先级1位从优先级3位NVIC_PriorityGroup_2 先占优先级2位(值:0-3)从优先级2位(值:0-3)NVIC_PriorityGroup_3 先占优先级3位从优先级1位NVIC_PriorityGroup_4 先占优先级4位从优先级0位例:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);函数N VIC_Init函数名NVIC_Init函数原形void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)功能描述根据N VIC_InitStruct 中指定的参数初始化外设N VIC 寄存器输入参数NVIC_InitStruct:指向结构N VIC_InitTypeDef 的指针,包含了外设G PIO 的配置信息参阅S ection:NVIC_InitTypeDef 查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无typedef struct{u8 NVIC_IRQChannel; //IRQ通道u8 NVIC_IRQChannelPreemptionPriority; //先占优先级取值u8 NVIC_IRQChannelSubPriority; //从优先级取值FunctionalState NVIC_IRQChannelCmd; //使能} NVIC_InitTypeDef;该参数设置了成员 N VIC_IRQChannel 中的先占优先级,Table. 273 列举了该参数的取值。