看了大半天,終於把原子哥的例程中的中斷分組和優先級看懂了,勉勉強強知道了怎么設置中斷分組和優先級,,不容易啊。下面就是我收集的資料及我的理解
分組不是很難,就是有一點知道就就全部明白了:

// 設置NVIC分組
//NVIC_Group:NVIC 分組 0~4 總共 5 組
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
{
u32 temp,temp1;
temp1=(~NVIC_Group)&0x07;//取后三位 見后注釋
temp1<<=8; //因為優先級分組在8-10位
temp=SCB->AIRCR; //讀取先前的設置
temp&=0X0000F8FF; //清空先前分組
temp|=0X05FA0000; //寫入鑰匙 看上寄存器
temp|=temp1;
SCB->AIRCR=temp; //設置分組
}
temp1=(~NVIC_Group)&0x07;//取后三位 為什么NVIC_Group要取反?和CM3分組不是反了嗎?仔細查看《CM3權威指南》和對比《STM32不完全手冊》可以發現,STM32是把CM3內核中第7分組定義為STM32的第0分組!原子哥撇開STM的庫函數自己寫,其實寫的就是內核驅動,所以現在我們要控制的不是STM32,而是CM3,為了和STM32文檔對應,那么我們應該對NVIC_Group取反!比如說我現在要用到STM32中的第1分組,其實是CM3中的第6分組,那我應該是把0x600寫進CM3!

//設置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; //設置響應優先級和搶斷優先級
}
再插張一張NVIC寄存器吧,(在M3權威指南):

