NVIC与中断控制
一.中断相关主要寄存器
1.中断使能/除能寄存器组
每个中断拥有一个使能/除能对,最多共240对,分布在8对32位寄存器中 (r/w)
作用:使能中断
使能寄存器地址:SETENAs: xE000_E100 – 0xE000_E11C 共32个字节
除能寄存器地址:CLRENAs:0xE000E180 - 0xE000_E19C 共32个字节
SETENA0—SETENA7
2.中断的悬起和解悬寄存器组
最多240对,分布在8对32寄存器中(r/w),操作同中断使能/除能寄存器相同
作用:中断不能立即得到响应时,该中断悬起
如果中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响
应。此时中断被悬起。
悬起寄存器地址:SETPENDs:0xE000_E200 – 0xE000_E21C ;
解悬寄存器地址: CLRPENDs:0xE000E280 - 0xE000_E29C
可手动悬起中断,
3.优先级配置寄存器(r/w)
作用:配置中断的优先级
地址:0xE000_E400 – 0xE000_E4EF
每个外部中断都有一个8位优先级配置寄存器,相邻4个优先级寄存器组成一个32寄存器。每个8位优先级配置寄存器可根据优先级分组,分为抢占优先级和响应优先级。
4.活动状态寄存器(只读寄存器,由硬件清零)
作用:表明响应了中断请求
处理器执行了其 ISR 的第一条指令后(即进入了中断服务函数),它的活动位就被置 1,并且直到 ISR 返回时才硬件清零。
ACTIVE 寄存器地址:0xE000_E300_0xE000_E31C 共8个32位寄存器,可按字、半字、字节访问。
5.PRIMASK 与 FAULTMASK 特殊功能寄存器
Primask:只对除NMI 和硬 fault 之外(因为这两异常的优先级通常最高)的所有异常有效
相当于我们常说的中断总开关吧。
操作:我们通常可通过只能通过MSR指令对PRIMASK写0或1来操作。(不能用LDR!!!因为手册上好像有说明 特殊功能寄存器只能由MSR或MRS来操作)
例:1. 关中断
MOV R0, #1
MSR PRIMASK, R0
2. 开中断
MOV R0, #0
MSR PRIMASK, R0
此外,还可以通过CPS指令快速完成上述功能:(这个是CM3专门设置的一条指令)
CPSID i ;关中断
CPSIE i ;开中断
FAULTMASK:直接将当前优先级置为-1,可将除NMI外的中断全都屏蔽包括硬fault。
6. BASEPRI寄存器
作用:该寄存器可屏蔽优先级低于某个值的中断
例:屏蔽优先级不高于0x60的中断
MOV R0, #0x60
MSR BASEPRI, R0
取消屏蔽则写0;
MOV R0, #0
MSR BASEPRI, R0
7.其它异常的配置寄存器
系统Handler控制及状态寄存器SHCSR(地址:0xE000_ED24)
作用:用来处理一些特殊异常的,用法fault,总线fault以及存储器管理fault
8. 中断控制及状态寄存器ICSR(地址:0xE000_ED04)(这个寄存器很重要,在操作系统移植会用到)
8.中断的建立过程
1. 建立优先级组
2. 为该中断指定优先级
3. 使能该中断