NVIC

NVIC

、上图所示为中断分组以及抢占优先级与响应优先级的对应关系

//设置NVIC

//NVIC_PreemptionPriority:抢占优先级

//NVIC_SubPriority       :响应优先级

//NVIC_Channel           :中断编号
//NVIC_Group             :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先         
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)  {
   u32 temp;      
   MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组(见上分析)
  temp=NVIC_PreemptionPriority<<(4-NVIC_Group); //有上图可知bit4-7是设置优先级的。
 //而优先级设定是由分组决定的
//0组时:0位抢占优先级,4位响应优先级(bit4-7)

 //1组时:1位抢占优先级(bit7),3位响应优先(bit4-6)级

//2组时:2位抢占优先级(bit6-7),2位响应优先级(bit4-5) 所以这里要减去NVIC_Group,分别占的位数

temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf;                                                     //取低四位 
 NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);      //stm32最多好像有200多个中断吧,不记得了,NVIC_Channl代表的其中一个,例如USART2_IRQn = 38。这些中断由8个32位寄存器使之使能,就拿USART2_IRQn来说,38/32 =1,38%32=6,所以要使USART2中断使能的话,必须设置NVIC->ISER[1]第六位为1

NVIC->IP[NVIC_Channel]|=temp<<4;              //设置响应优先级和抢断优先级

}