ARM单片机的中断详细过程(重要)
一、ARM异常中断
ARM的异常(中断源)总共分为三类(八种:具体是哪八种在后面有介绍):
- 三类:
- (1)执行指令引起的直接异常:软件中断,未定义的指令和预取指令终止(地址无效、权限问题、内存故障、缓冲一致性)等。
- (2)指令执行引起的间接异常:读取和存储数据时的数据终止。
- (3)外部产生的异常(与指令流无关):复位,IRQ,FIQ(快速中断)。
- 在8种异常中断中,向量中断控制器VIC仅仅控制外部中断源,然后将其输出为FIQ和IRQ!!!“向量中断控制器VIC”的作用就是控制允许哪些中断源可以产生中断、可以产生那类中断、产生中断后执行哪段服务程序。
二、关于中断向量表(多级中断向量表)
异常有四种:中断、陷阱、故障、终止。每一种异常都有对应的处理子程序,所以系统启动时初始化有一个中断向量表在从地址0开始的32个字节的空间内。
- 异常细分下来总共有8种:复位,未定义指令,软件中断SWI,指令预取终止,数据访问终止,保留,IRQ,FIQ。其中FIQ和IRQ是由向量中断控制器(VIC)来进行管理的外部中断,细分下来总共有大概30种左右的中断源。这些中断也对应一个中断向量表,大概是从0x0000020-0x000000c0。也就是说,由于IRQ数量众多,所以还需要一个二级普通中断向量表!这些中断源经由VIC之后可以由VIC自由决定其属于那一种中断。
三、中断的执行过程
注:除了复位异常立刻终止当前指令外,其他情况都是处理器处理完当前指令后才去执行异常处理程序;
先备知识:①用户模式和系统模式不是异常中断模式没有CPSR,其他模式都有CPSR,当发生异常时用于保存当前模式的状态信息:如条件标志、中断标志、处理器工作模式等等。②LR有两个作用:保存子程序的返回地址;保存异常发生前PC的值减4.
- 保存CPSR(程序转态寄存器)的值到SPSR(备份程序寄存器)。
- 设置当前状态寄存器CPSR的值。
- 将引起异常指令的下一条地址(断点的地址)保存到新的异常工作模式的LR中,使得异常处理程序执行完后能正确返回原来的程序处继续执行。
- 给程序计数器PC强制赋值,转入中断向量地址,以便执行相应的处理程序。
四、NVIC管家
-
M3 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。
-
1、
中断使能寄存器
与中断失能寄存器
共有32*8=256,用于控制240个中断的打开与关闭; -
2、
应用程序中断及复位控制寄存器
位10、9、8三位用于控制优先级的分组,三位共222=8种,取其中的5组作为中断优先级的分组情况;通俗的来将就是控制中断优先级寄存器的抢占和相应优先级的位数的。 -
3、
中断优先级寄存器
用于控制中断的优先级,包括抢占优先级与响应优先级,高4位控制,至于哪几位控制抢占,哪几位控制响应,由应用程序中断及复位控制寄存器说了算;
1. NVIC工作原理
工作过程:
- 当外部被出发时,首先进入ICER、ISER寄存器,用于控制是否开对应的中断,打开的中断进入IPR寄存器,进行中断优先级的判断,IPR寄存器受AIRCR寄存器控制,最后按照中断优先级依次进入CPU被执行。内核中断由SHPR寄存器控制,SHPR与IPR寄存器属于同一级别;
2.中断优先级
- 1、抢占优先级(pre):高抢占优先级可以打断正在执行的低抢占优先级中断;
- 2、响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但是不能相互打断;
- 3、抢占优先级和响应优先级都相同的情况下,自然优先级越高的先执行;
- 4、自然优先级:中断向量表中的优先级;
- 5、数值越小,表示优先级越高;
3.NVIC的使用
使用步骤:
1、设置中断分组:AIRCR寄存器[10:8];
HAL_NVIC_SetPriorityGrouping();
2、设置中断优先级:IPR寄存器[7:4];
HAL_NVIC_SetPriority();
3、使能中断:ISER寄存器;
HAL_NVIC_EnableIRQ();
4.中断和事件的区别
中断和事件的理解
中断:要进入NVIC,有相应的中断服务函数,需要CPU处理;
事件:不进入NVIC,仅用内部硬件自动控制,TIM,DMA,ADC等