对于NVIC的任务,可以概括为三个:
1.配置中断向量表--如果不配置,则不能进入中断 SCB->VTOR
2.配置系统中断分组--决定了第一和第二优先级各占用的位数 SCB->AIRCR
3.配置对应中断优先级和使能中断--中断使能 ISER[0/1] 中断优先级IPR[0:15]
只要按照这样配置,就可以使用中断了
1 /****************************************************** 2 *函数: NVIC_Group(u8 group) 3 *功能: 设置中断分组 4 *参数: group-对应分组号 0~4 共5组 5 *返回: 无 6 ******************************************************/ 7 void NVIC_Group(u8 group)//设置中断优先级分组寄存器 8 { 9 10 u32 temp,temp1; 11 //设置中断向量表,这里不配置会导致不能进入中断 12 SCB->VTOR = NVIC_VectTab_FLASH; 13 temp1=(~group)&0x07;//取后三位 14 temp1<<=8; 15 temp=SCB->AIRCR; //读取先前的设置 16 temp&=0X0000F8FF; //清空先前分组 17 temp|=0X05FA0000; //写入钥匙 18 temp|=temp1; 19 SCB->AIRCR=temp; //设置分组 寄存器地址0xe000ed00c 可以看cortex m3权威指南 20 } 21 22 23 /****************************************************** 24 *函数: NVIC_Irq_Config(u8 irq,u8 priority) 25 *功能: 设置中断irq中断优先级 26 *参数: irq--中断号 27 priority--中断优先级,4位有效 28 0组0:4 1组1:3 2组2:2 3组3:1 4组4:0 29 有规律的,不难设置,例如组2,想用第一优先级1,第二优先级2,则priority=0110B=0x6 30 *返回: 无 31 ******************************************************/ 32 void NVIC_Irq_Config(u8 irq,u8 priority) 33 { 34 u8 addr_en,offset_en; 35 u8 addr,offset; 36 37 addr=irq/4; 38 offset=irq%4; 39 40 addr_en=irq/32; //中断使能控制寄存器 41 offset_en=irq%32;//中断使能控制位 42 43 NVIC->ISER[addr_en]|=1<<offset_en; 44 NVIC->IPR[addr]=priority<<(offset*8+4);// (优先级设置)<<(offset*8+4); 45 }