stm32中断源与事件总结20130710

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c/当2(n)个相同抢先优先级和相同子优先级的中断出现,STM32首先响应中断通道所对应的中断向量地址低的那个中断(见ROM0008,表52)。具体一点:
0号抢先优先级的中断,可以打断任何中断抢先优先级为非0号的中断;1号抢先优先级的中断,可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出现(或挂在那里等待),就看它们2个谁的子优先级高了,如果子优先级也相同,就看它们的中断向量位置了。
◆处理器状态的自动保存和恢复;
◆中断向量表读取与处理器状态保存并行处理;
◆支持尾链技术,当处理背靠背的中断时,不需要在2个终端服务子程序之间进行入栈和出栈操作;
◆可动态重设优先级;
◆NVIC和Cortex-M3处理器和紧密耦合,可尽早处理中断,尤其是晚到的高优先级中断;
◆中断的数目可以配置,1~240;
通过让优先级以MSB对齐,可以简化程序的跨器件移植。比如,如果一个程序早先在支持4位优先级的器件上运行,在移植到只支持3位优先级的器件后,其功能不受影响。但若是对齐到LSB,则会使MSB丢失,导致数值大于7的低优先级一下子升高了,甚至会反转小于等于7的高优先级。如,8号优先级因为损失了MSB,现在反而变成0号了!
●配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)
软件中断/事件的选择
20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:
●配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)
●设置软件中断寄存器的请求位(EXTI_SWIER)
另外四个EXTI线的连接方式如下:
●EXTI线16连接到PVD输出
●EXTI线17连接到RTC闹钟事件
●EXFra Baidu bibliotekI线18连接到USB唤醒事件
●EXTI线19连接到以太网唤醒事件(只适用于互联型产品)

a/初始化过程
首先要设置寄存器AIRC中PRIGROUP的值,规定系统中的抢先优先级和子优先级的个数(在4个bits中占用的位数);
设置TIME2本身的寄存器,允许相应的中断,如允许UIE(TIME2_DIER的第[0]位)
举例来说,如果只使用了3个位来表达优先级,则优先级配置寄存器的结构会如图7.1所示:
在图中,[4:0]没有被实现,所以读它们总是返回零,写它们则忽略写入的值。因此,对于3个位的情况,我们能够使用的8个优先级为:0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0以及0xE0。
通过软件设置的优先级权限高于硬件优先级。例如,如果设置IRQ[0]的优先级为1,IRQ[31]的优先级为0,则IRQ[31]的优先级比IRQ[0]的高。但通过软件设置的优先级对复位、不可屏蔽中断和硬件故障没有影响。
当多个中断具有相同的优先级时,拥有最小中断号的挂起中断优先执行。例如,IRQ[0]
和IRQ[1]的优先级都为1,则IRQ[0]优先执行。
在计算抢占优先级和亚优先级的有效位数时,必须先求出下列值:
◆芯片实际使用了多少位来表达优先级
◆优先级组是如何划分的。
二、异常的优先级
在处理器处理异常时,优先级决定了处理器何时以及如何进行异常处理。可以给中断设置软件优先级以及对其进行分组。
优先级NVIC支持通过软件设置的优先级。通过写中断优先级寄存器的PRI_N字段可以设置优先级,范围为0~255。硬件优先级随着中断号的增加而减小,优先级0为最高优先级,255为最低优先级。
2.
外部中断/事件控制器(EXTI)由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配合输入类型和对应的触发事件。每个输入线都可以被独立地屏蔽,由挂起寄存器保持着状态线的中断要求。
EXTI控制器的结构图如图5-1所示,其主要特性如下:
�每个中断/事件都有独立的触发和屏蔽;
�每个中断线都有专用的状态线;
NVIC中有一个寄存器是“应用程序中断及复位控制寄存器”(内容见表7.5),它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段:MSB所在的位段(左边的)对应抢占优先级,而LSB所在的位段(右边的)对应亚优先级。
抢占优先级决定了抢占行为:当系统正在响应某异常L时,如果来了抢占优先级更高的异常H,则H可以抢占L。亚优先级则处理“内务”:当抢占优先级相同的异常有不止一个悬起时,就优先响应亚优先级最高的异常。
此时内核硬件将TIME2中断通道的Pending标志置位(相当与中断通道标志置位),表示TIME2有中断申请。
如果当前有中断在处理,TIME2的中断级别不够高,那么就保持Pending标志,当然用户可以在软件中通过写ICPR寄存器中相应的位把本次中断清除掉。
当内核有空,开始响应TIME2的中断,进入TIME2的中断服务。此时硬件将IABR寄存器中相应的标志位置位,表示TIME2中断正在被处理。同时硬件清除TIME2的Pending标志位。
优先级分组。为了更好的对大量的中断进行优先级管理和控制,NVIC支持优先级分组。通过设定应用中断和复位中断控制寄存器的PRIGROUP字段,可以将PRI_N字段分成2个部分:抢占优先级和次要优先级,如表2所列。抢占优先级可以认为是优先级分组,当多个挂起的异常具有相同的抢占优先级时,次要优先级就起作用。优先级分组和次要优先级共同作用确定了异常的优先级,当两个挂起的异常具有完全相同的优先级时,硬件位置编号低的异常优先级被激活。
◆为Handle和Thread模式分别提供独立的栈和访问权限等级;
◆可屏蔽优先级以支持临界区。
一、异常的种类
Cortex-M3处理器将复位、不可屏蔽中断、外部中断、故障都统一为异常,异常有多种
类型。故障是指指令执行时由于错误的条件所导致的异常。故障可分为同步故障和一般故障,
同步故障是指当指令产生错误时就同时报告错误,而异步故障则是指当指令产生错误时无法
如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。
通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。
硬件中断选择
通过下面的过程来配置20个线路做为中断源:
异常
Cortex-M3处理器和NVIC对所有优先级进行划分和处理。所有的异常处理均在Handle模式下进行。当出现异常时,处理器的状态被自动保存到栈中;在中断服务子程序结束之后,又会自动从栈中恢复处理器的状态。获取中断向量和状态保存是同时进行的,这提高了进入中断处理的效率。Cortex-M3处理器支持尾链技术,即当发生背靠背中断时,无需保存和恢复状态,而是继续执行。Cortex-M3处理器的一下特性,提高了处理异常的效率并降低了时间的延迟。
STM32
地址为偏移量,不是绝对地址。NVIC的绝对地址在e000e000
Core_cm3.h
中断嵌套问题
9.具体优先级的确定和嵌套规则。ARM corte x_m3(STM32)规定
a/只能高抢先优先级的中断可以打断低抢先优先级的中断服务,构成中断嵌套。
b/当2(n)个相同抢先优先级的中断出现,它们之间不能构成中断嵌套,但STM32首先响应子优先级高的中断。
NVIC_PriorityGroup_1 =>选择第1组
NVIC_PriorityGroup_2 =>选择第2组
NVIC_PriorityGroup_3 =>选择第3组
NVIC_PriorityGroup_4 =>选择第4组
二、
向量中断控制器,简称NVIC,是Cort ex‐M3不可分离的一部分,它与CM3内核的逻辑紧密耦合,有一部分甚至水乳交融在一起。NVIC与CM3内核同声相应,同气相求,相辅相成,里应外合,共同完成对中断的响应。N VIC的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外,NVIC还包含了MPU的控制寄存器、SysT ick定时器以及调试控制。
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:
NVIC_PriorityGroup_0 =>选择第0组
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
原则上,CM3支持3个固定的高优先级和多达256级的可编程优先级,并且支持128级抢占(128的来历请见下文分解——译注)。但是,绝大多数CM3芯片都会精简设计。以致实际上支持的优先级数会更少,如8级,16级,32级等。它们在设计时会裁掉表达优先级的几个低端有效位,以达到减少优先级数的目的(可见,不管使用多少位,优先级号是以MSB对齐的——译注)。
设置TIME2中断通道的抢先优先级和子优先级(IP[28],在NVIC寄存器组中)
设置允许TIME2中断通道。在NVIC寄存器组的ISER寄存器中的一位。
b/中断响应过程
当TIME2的UIE条件成立(更新,上溢或下溢),硬件将TIME2本身寄存器中UIE中断标志置位,然后通过TIME2中断通道向内核申请中断服务。
保证同时报告错误。下表列出了异常的类型、位置和优先级。位置是指中断向量在中断向量
表中的位置,是相对于中断限量表开始处字的偏移。优先级的值越小,优先级越高。
二、中断优先级
在CM3中,优先级对于异常来说很关键的,它会影响一个异常是否能被响应,以及何时可以响应。优先级的数值越小,则优先级越高。CM3支持中断嵌套,使得高优先级异常会抢占(preempt)低优先级异常。有3个系统异常:复位,NMI以及硬fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。所有其它异常的优先级则都是可编程的(但不能编程为负数)。
c/执行TIME2的中断服务程序
所有TIME2的中断事件,都是在一个TIME2中断服务程序中完成的,所以进入中断程序后,中断程序需要首先判断是哪个TIME2的具体事件的中断,然后转移到相应的服务代码段去。
NVIC的访问地址是0xE000 _E000。
每个外部中断都有一个对应的优先级寄存器,每个寄存器占用8位,但是允许最少只使用最高3位。4个相临的优先级寄存器拼成一个32位寄存器。如前所述,根据优先级组设置,优先级可以被分为高低两个位段,分别是抢占优先级和亚优先级。优先级寄存器都可以按字节访问,当然也可以按半字/字来访问。有意义的优先级寄存器数目由芯片厂商实现的中断数目决定,优先级配置寄存器的详细信息在附录D中给出
�支持多达19个中断/事件请求;
�检测脉冲宽度低于APB2时钟宽度的外部信号。
要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。
●配置20个中断线的屏蔽位(EXTI_IMR)
●配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);
●配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。
硬件事件选择
通过下面的过程,可以配置20个线路为事件源
●配置20个事件线的屏蔽位(EXTI_EMR)
这种优先级分组规定:亚优先级至少是1个位。因此抢占优先级最多是7个位,造成了最多只有128级抢占的现象。
但是CM3允许从比特7处分组,此时所有的位都表达亚优先级,没有任何位表达抢占优先级,因而所有优先级可编程的异常之间就不会发生抢占——相当于在它们之中除能了
CM3的中断嵌套机制。当然还有凌架于法律之上的三位老大:复位,NMI和硬fault。它们无论何时出现,都立即无条件抢占所有优先级可编程的“平民异常”。
相关文档
最新文档