1、存储管理4可配置存储保护单元不匹配,包括不可访问和不匹配,同步故障;也用于MPU不可用或不存在的情况,以支持默认存储映射的从不执行区域总线故障5预取错误,存储器访问错误,以及其他地址/存储器相关的错误;当为精确地总线故障时是同步故障,不精确时为异步故障应用故障6应用错误,如执行未定义的指令或试图进行非法的状态装换,同步故障-710保留SVCall11使用SVC指令进行系统服务调用,同步故障调试监视异常12调试监视异常,同步故障,但只在允许时有效;如果它的优先级比当前激活的处理程序的优先级更低,则它不能激活13PendSV14系统服务的可挂起请求,异步故障,只能由软件挂起SysTick15用于系
2、统嘀嗒定时器,异步故障外部中断16由核外发出的中断,INTISR239:0,传递给NVIC都为异步故障二、异常的优先级在处理器处理异常时,优先级决定了处理器何时以及如何进行异常处理。可以给中断设置软件优先级以及对其进行分组。优先级 NVIC支持通过软件设置的优先级。通过写中断优先级寄存器的PRI_N字段可以设置优先级,范围为0255。硬件优先级随着中断号的增加而减小,优先级0为最高优先级,255为最低优先级。通过软件设置的优先级权限高于硬件优先级。例如,如果设置IRQ0的优先级为1,IRQ31的优先级为0,则IRQ31的优先级比 IRQ0的高。但通过软件设置的优先级对复位、不可屏蔽中断和硬件故
3、障没有影响。当多个中断具有相同的优先级时,拥有最小中断号的挂起中断优先执行。例如,IRQ0和IRQ1的优先级都为1,则IRQ0优先执行。优先级分组 为了更好的对大量的中断进行优先级管理和控制,NVIC支持优先级分组。通过设定应用中断和复位中断控制寄存器的PRIGROUP字段,可以将PRI_N字段分成2个部分:抢占优先级和次要优先级,如表2所列。抢占优先级可以认为是优先级分组,当多个挂起的异常具有相同的抢占优先级时,次要优先级就起作用。优先级分组和次要优先级共同作用确定了异常的优先级,当两个挂起的异常具有完全相同的优先级时,硬件位置编号低的异常优先级被激活。表2-1 优先级分组中断优先级字段PR
4、I_N7:0PRIGROUP2:分割点位置抢占优先级字段次要优先级字段占先优先级数量次要优先级数量B000bxxxxxxx.y7:10128B001bxxxxxx.yy21:64B010bxxxxx.yyy32:328B011bxxxx.yyyy43:16B100bxxx.yyyyy54:B101bxx.yyyyyy.65:B110bx.yyyyyyy76:B111b.yyyyyyyy无256优先级对异常处理的影响异常的处理 异常的处理与优先级有很大的关系,异常处理中与优先级相关的操作入表2-2所列表2-2 异常处理中宇优先级相关的操作操作抢占当新异常比当前异常或任务有更高的优先级时,则中断当
5、前的操作流,响应新的中断,并执行新的ISR,于是就产生了中断的嵌套。异常产生时,处理器的状态将自动入栈保护;与此同时,相应的中断向量被取出。保存处理器状态后,将执行ISR的第一条指令,进入了处理器流水线的执行阶段尾链这时用于加快中断服务处理的机制。如果有一个新的ISR或任务比即将返回的ISR拥有更高的优先级,则处理器状态出栈就被跳过而去执行新的ISR返回如果没有挂起的异常,或没有比栈中的ISR优先级更高的异常,则处理去执行出栈返回操作。ISR完成时,将自动通过操作恢复进入ISR之前的处理器状态,在恢复处理器状态的过程中,如果有一个新到的中断比当前异常或任务有更高的优先级,则抛弃当前的操作,并对
6、并新的中断做尾链处理迟到这时用于加快抢断速度的机制,当这在为先前到达的中断保存处理区状态时,如果有一个更高优先级的中断到达,则处理器的选择处理更高优先级的中断,并未该中断获取向量,但状态保存不会因晚到而受到影响,因为对于两个中断来说,保存处理器状态操作都是一样的,做保存状态不被中断而是继续进行,但保存完状态之后会执行迟到的中断的ISR的第一条指令。返回时则使用通常的尾链规则三、NVIC异常处理 1、异常的处理当一个异常出现以后,Cortex一M3处理器由硬件通过Dbus保存处理器状态,同时通过Ibus读取向量表中的SP,更新PC和LR,执行中断服务子程序。为了应对堆栈操作阶段到来后的更高优先级
7、异常,CortexM3支持迟到和抢占机制,以便对各种可能事件做出确定性的响应。2、抢占的处理抢占是一种对更高优先级异常的响应机制。CortexM3异常抢占的处理过程如图1所示。当新的更高优先级异常到来时,处理器打断当前的流程,执行更高优先级的异常操作,这样就发生了异常嵌套。迟到是处理器用来加速抢占的一种机制。如果一个具有更高优先级的异常在上一个异常执行压栈期间到达,则处理器保存状态的操作继续执行,因为被保存的状态对于两个异常都是一样的。但是,NVIC马上获取的是更高优先级的异常向量地址。这样在处理器状态保存完成后,开始执行高优先级异常的ISR。3、异常的返回为了应对异常返回阶段可能遇到的新的更
8、高优先级异常,CortexM3支持完全基于硬件的尾链机制,简化了激活的和未决的异常之问的移动,能够在两个异常之间没有多余的状态保存和恢复指令的情况下实现backtoback处理。尾链发生的2个条件:异常返回时产生了新的异常;挂起的异常的优先级比所有被压栈的异常的优先级都高。尾链发生后,CortexM3处理过程如图3中尾链分支所示。这时,CortexM3处理器终止正在进行的出栈操作并跳过新异常进入时的压栈操作,同时通过Ibus立即取出挂起异常的向量。在退出前一个ISR返回操作6个周期后,开始执行尾链的ISR。四、复位过程Cotex-M3处理器复位时,NVIC同时复位并控制内核从复位中释放出来。复
9、位的过程是可完全预知的,如下表表4-1 复位的过程动作NVIC复位,控制内核NVIC清除其大部分寄存器,处理器处于Thrend模式,特权访问方式执行代码,堆栈使用Main栈NVIC从复位中释放内核内核配置堆栈内核从向量表开始处读取初始SP,Main_SP内核设置PC和LR内核从向量表偏移中读取初始PC,LR设置为0Xffffffff运行复位程序禁止NVIC中断,并允许NMI和硬故障 向量表在向量表的0位置处,仅需要包含4个值: 栈顶地址; 复位程序的入口地址; 非屏蔽中断ISR的入口地址; 硬故障ISR的入口地址。当中断允许时,不管向量表放在何处,向量总是指向所有可屏蔽异常的处理。同样,如果使
10、用SVC指令,SVCall ISR的位置也被定位。一个完整向量表的例子:Unsigned in stack_baseSTACK_SIZE;Void ResetISR(viod);Void NmiISR(viod); ISR_VECTOR_TABLE vevtor_table_at_0stack_base+sizeof(stack_base),RedetISR,NmiISR,FaultISR,1. /用于内存保护单元0, /用于总线故障0, /用于硬件故障0,0,0,0 /保留SVCallISR,0, / 用于调试监控程序0, /保留0, /用于可挂起的服务请求0, /用于SysTick/以下向
11、量用于外部中断Timer1ISR,GpioInISRGpioOoutISR,I2Cisr五、中断和事件外部中断/事件控制器(EXTI)由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配合输入类型和对应的触发事件。每个输入线都可以被独立地屏蔽,由挂起寄存器保持着状态线的中断要求。EXTI控制器的结构图如图5-1所示,其主要特性如下: 每个中断/事件都有独立的触发和屏蔽; 每个中断线都有专用的状态线; 支持多达19个中断/事件请求; 检测脉冲宽度低于APB2时钟宽度的外部信号。 图5-1 外部中断/事件控制器框图如果要产生外部中断,那么中断线必须事先配置好并激活。配置内容包括:根据
12、需要的边沿检测设置2个触发寄存器、在中断屏蔽寄存器的相应位写1以允许中断请求。当外部中断线出现相应的边沿信号时,将产生一个中断请求,对应的挂起位也随着置1。通过写1到挂起寄存器,可以清除该中断请求。如果要产生事件请求,事件请求线必须事先配置好并激活。当事件请求线上出现相应的边沿信号时,将产生一个事件请求脉冲,对应的挂起位不置1。也可以通过软件在中断/事件寄存器写1,来产生一个中断/事件请求。下面具体介绍如何配置软硬中断/事件请求。(1)硬件中断选择 通过下面的过程,可以配置19根线为中断源: 配置19根中断线的屏蔽位(EXTI_IMR);配置所选中断线的触发选择位; 配置那些控制映射到外部中断
13、/事件控制器(EXTI)的NVIC中断通道的允许和屏蔽位,使得19根中断线中的请求可以被正确地响应。图5-2 通用I/O与外部中断的映射关系(2)硬件事件选择 通过下面的过程,可以配置19根线为事件源:配置19根事件请求线的屏蔽位; 配置事件线的触发选择位(3)软件中断/事件选择 可以配置19根线为软件中断/事件请求线,通过以下过程可以产生软件中断:1 配置19根中断/事件请求线的屏蔽位;2 设置软件中断请求寄存器的请求。(4)外部中断/事件线路映射 80个通用I/O端口可以用图5-2方式映射到16根外部中断/事件线上。 另外3种其他的外部中断/事件控制器的连接如下:1 EXTI线16连接到P
14、VD输出;2 EXTI线17 连接到RTC闹钟事件;3 EXTI线18连接到USB唤醒事件。Cortex-M3可以通过外部或内部事件来唤醒内核,利用以上19根中断/事件请求线,可以配置任何外部I/O端口、RTC闹钟和USB唤醒事件来唤醒CPU。(5)相关的功能寄存器 1、中断屏蔽寄存器(EXTI_IMB)该寄存器用来设置是否屏蔽中断请求线上的中断请求, 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16ResevedWR18WR17WR16 rw rw rw15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0WR15WR14WR
15、13WR12WR11WR10WR9WR8WR7WR6WR5WR4WR3WR2WR1WR0rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw图5-3 EXTI_IMR寄存器表5-1 EXTI_IMR寄存器的位域定义位定义31:19保留,必须始终保持为复位状态(0)18:MRx:线x上的中断屏蔽0:线x上的中断请求被屏蔽;1:线x上的中断请求不被屏蔽2、事件屏蔽寄存器(EXTI_EMR)该寄存器用来设置是否屏蔽事件请求线上的中断请求, rw rw rwrw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw 图5-4
16、 EXTI_EMR寄存器表5-2 EXTI_EMR寄存器的位域定义线x上的事件屏蔽线x上的事件请求被屏蔽;线x上的事件请求不被屏蔽3、上升沿触发选择寄存器(EXTI_RTSR)该寄存器用来设置是否上升沿触发中断和事件TR18TR17TR16TR15TR14TR13TR12TR11TR10TR9TR8TR7TR6TR5TR4TR3TR2TR1TR0 图5-5 EXTI_RTSR寄存器 表5-3EXTI_RTSR寄存器的位域定义TRx:线x上的上升沿触发事件配置位禁止线x上的上升沿触发;允许线x上的上升沿触发4、下降沿触发选择寄存器(EXTI_FTSR) 图5-6 EXTI_FTSR寄存器 表5-
17、4 EXTI_FTSR寄存器的位域定义线x上的下降沿触发事件配置位禁止线x上的下降沿触发;允许线x上的下降沿触发5、软件中断事件寄存器(EXTI_SWIER)该寄存器用来软件触发中断和事件31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16SWIER18SWIER17SWIER1615 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0SWIER15SWIER14SWIER13SWIER12SWIER11SWIER10SWIER9SWIER8SWIER7SWIER6SWIER5SWIER4SWIER3SWIER2SWIER1SWIER
18、0图5-7 EXTI_SWIER寄存器表5-5 EXTI_SWIER寄存器的位域定义SWIERx:线x上的软件中断该位为0时,写1将设置EXTL-PR中相应的挂起位。如果在EXTI-IMR和EXTI-EMR中允许产生改中断,则此时将产生一个中断。通过清除EXTL-PR的对应位,可以清除该位为06、挂起寄存器(EXTI_PR)该寄存器用来保存中断/事件请求线上是否有请求PR18PR17PR16 rc_w1 rc_w1 rc_w1PR15PR14PR13PR12PR11PR10PR9PR8PR7PR6PR5PR4PR3PR2PR1PR0rc_w1 rc_w1 rc_w1 rc_w1 rc_w1 r
19、c_w1 rc_w1 rc_w1 rc_w1 rc_w1 rc_w1 rc_w1 rc_w1 rc_w1 rc_w1 rc_w1图5-8 EXTI_PR寄存器表5-6 EXTI_PR寄存器的位域定义PRx:挂起位当外部中断线上发生了选择的边沿事件,该位置1。在该位写1可以清除它,也可以通过改变边沿检测的极性来清除六、NVIC库函数函数使用:6.1函数NVIC_PriorityGroupConfig函数名NVIC_PriorityGroupConfig函数原形void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)功能描述设置优先级分组:先占优先
20、级和从优先级输入参数NVIC_PriorityGroup:优先级分组位长度参阅Section:NVIC_PriorityGroup 查阅更多该参数允许取值范围输出参数返回值先决条件优先级分组只能设置一次被调用函数NVIC_PriorityGroup 该参数设置优先级分组位长度下表给出了由函数NVIC_PriorityGroupConfig设置的先占优先级和从优先级可取的值NVIC_PriorityGroupNVIC_PriorityGroup_0先占优先级0位 从优先级4位NVIC_PriorityGroup_1先占优先级1位 从优先级3位NVIC_PriorityGroup_2先占优先级2位
21、 从优先级2位NVIC_PriorityGroup_3先占优先级3位 从优先级1位NVIC_PriorityGroup_4先占优先级4位 从优先级0位1. 选中NVIC_PriorityGroup_0,则参数NVIC_IRQChannelPreemptionPriority对中断通道的设置不产生影响。2. 选中NVIC_PriorityGroup_4,则参数NVIC_IRQChannelSubPriority对中断通道的设置不产生影响。NVIC_IRQChannelCmd 该参数指定了在成员NVIC_IRQChannel中定义的IRQ通道被使能还是失能。这个参数取值为ENABLE或者DISAB
22、LE。例:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/抢占优先级字段为1,次要优先级字段为36.2函数NVIC_InitNVIC_Initvoid NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,包含了外设GPIO的配置信息NVIC_InitTypeDef structure NVIC_InitTypeDef定义于文件“stm32f10x_nvic.h”:typedef struct u8 NVIC_IRQChannel;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1