NVIC嵌套向量中断控制器 本文当由个人编制,方便查阅使用,王均伟天津第四项目部宿舍 这个控制器和内核捆绑在一起,是控制中断的。 下面是他吹的: ● 高达68中断
●一个0-15的可编程每个中断的优先级。一个更高的层次对应一个
低优先级的,所以0级是最高的中断优先级
●等级和脉冲中断信号的检测
●动态的优先次序加以重订的中断
●成组的优先级和次优先领域的优先级值分组
●中断尾部链接
●外部非屏蔽中断(NMI)
处理器自动进入异常堆栈其状态和unstacks这种状态上
异常退出,无需额外指令开销。这提供了低延迟的异常处理。 说别的没用底下这个表的重要程度在于不看他都很难理解寄存器啥意思,记住Table34 使用中要用这个表和底下的寄存器进行对比,佐照。才会发现要的东西 看了这个表请不要问这些寄存器都是那个中断的啊? 就相当于你看了一个坑你还向里跳一样愚蠢!! 上面的这个表非常重要!!!!!!!!!!!!!!
1.
中断设置启用寄存器(NVIC_ISERx) SETENA[31:0]:中断使能位 Write: 0: No effect 1: Enable interrupt Read: 0: Interrupt disabled 1: Interrupt enabled. 如果待处理的中断使能,NVIC激活基于其优先级的中断。如果一个
中断被禁止,声称其中断信号改变中断状态为挂起,
但从未激活了NVIC中断,无论其优先级 这才明白啥叫挂起,原来如此 2. 中断关闭使能寄存器(NVIC_ICERx) Bits 31:0 CLRENA[31:0]: Interrupt clear-enable bits. Write: 0: No effect 1: Disable interrupt Read: 0: Interrupt disabled 1: Interrupt enabled. 3. 中断挂起开启寄存器(NVIC_ISPRx) Bits 31:0 SETPEND[31:0]: Interrupt set-pending bits Write: 0: No effect 1: Changes interrupt state to pending Read: 0: Interrupt is not pending 1: Interrupt is pending 4. 中断挂起关闭寄存器 (NVIC_ICPRx) Bits 31:0 CLRPEND[31:0]: Interrupt clear-pending bits Write: 0: No effect 1: Removes the pending state of an interrupt Read: 0: Interrupt is not pending 1: Interrupt is pending 5. 中断标志寄存器(NVIC_IABRx) Bits 31:0 ACTIVE[31:0]: Interrupt active flags 0: Interrupt not active 1: Interrupt active 6. 中断优先级寄存器(NVIC_IPRx) 这个图表示17个字,每个字32位,每8位表示一个中断的优先级代码,共68个中断。 每个中断的优先级的值范围是0~255,值越低,相应的优先级越高,值得注意的的是CORTEX-M3 只有16个优先级,所以当设置优先级时只有位【7:4】有效,而【3:0】保持为0.以此类推。 总结:中断优先级寄存器通俗的说就是: Cortex-m3不是有68个中断吗,那么把这68个中断分成17组,一组是4个中断,然后再把一个中断赋予8位数据值,就是4*8=32位,正好一个“字”,也就是说4个中断要一个字,那么68个中断要68/4=17个字,然后看下图18,正好是IPR0~IPR16,17个字。 你分组为了啥?不就是要设置中断优先级吗!那么他的值有多大?0~255,8bit吗!但是问题是这个处理器他没有这么多的优先级,他有多少?只有0~15个,咋办?他是采取了表35的做法,一个中断优先级的值是8位,我屏蔽低4位,保留高4位,哎!正好,4位可以表示0~15之间的数据,正好和我们要的不冲突,真好吻合。就是这个结果。我的理解是这样的!!!! 7. 软件触发中断寄存器(NVIC_STIR) INTID【8-0】:这个就是说你可以设置软件中断的中断号,比如说你向里面写入“000000011”就产生一个IRQ3的软件中断,但是这个中断值是0~239之间的!! 附表:
完 于天津第四项目部 //
|