中断建立一般为三个步骤:
1.建立优先级组
2.为该中断指定优先级(抢占级和响应级)
3.使能该中断
分步骤归纳:
一、建立优先级组
SCB->AIRCR寄存器和NVIC->IP[]寄存器组这两个相关:
首先说明IP寄存器组是一个由240个8bit的寄存器组成,每个可屏蔽中断占用8bit(即一个8bit寄存器配置一个中断的优先级)。但实际只用到这8bit寄存器的高四位[7:4],这四位又分为抢占优先级和子优先级(响应优先级)。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。
先设置 SCB->AIRCR的分组,分配关系如图
执行步骤:
u32 temp,temp1; temp1 = (~NVIC_Group) & 0x07; //读取分组 temp1 <<= 8; //左移到[10:8] temp = SCB->AIRCR; //读取寄存器原先值,后续修改 temp &= 0X0000F8FF; //清空原有分组 temp |= 0X05FA0000; //修改寄存器内容,需要写入0x05FA密钥 temp |= temp1; //添加分组信息 SCB->AIRCR=temp; //写入寄存器,设置分组二、为该中断指定优先级(抢占级和响应级)
上一步已设置好分组,接着设置中断的优先级
(例如分组2,强占优先级3,子优先级3,设置串口1的中断优先级,串口在中断和异常向量表中位置为37)
NVIC->IP[37] = ((3 << 2) | (3 & (0xf >> 2))) << 4;
三、使能该中断
ISER[8] 由8个32位寄存器组成,每个位控制一个中断。
NVIC->ISER[37 / 32] = 1 << (37 % 32);