重學STM32---(三) 中斷分組和優先級


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

 

 

分組不是很難,就是有一點知道就就全部明白了:

 

 

// 設置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權威指南):

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM