STM32開關總中斷(轉貼)

來自 http://www.ourdev.cn/forum.php?mod=viewthread&tid=5397451 

作者:fire

在 STM32/Cortex-M3 中是通過改變 CPU 的當前優先級來允許或禁止中斷。   
PRIMASK 位:只允許 NMI 和 hard  fault 異常,其他中斷/  異常都被屏蔽(當前 CPU 優先級=0)。  
FAULTMASK 位:只允許 NMI,其他所有中斷/異常都被屏蔽(當前 CPU 優先級=-1)。   

在 STM32 固件庫中(stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定義了四個函數操作 PRIMASK 位和

FAULTMASK 位,改變 CPU 的當前優先級,從而達到控制所有中斷的目的。   

下面兩個函數等效於關閉總中斷:  
void NVIC_SETPRIMASK(void);   
void NVIC_SETFAULTMASK(void);
   

下面兩個函數等效於開放總中斷:  
void NVIC_RESETPRIMASK(void);   
void NVIC_RESETFAULTMASK(void);
   

上面兩組函數要成對使用,不能交叉使用。  

例如:  

第一種方法:  
NVIC_SETPRIMASK();         //關閉總中斷  
NVIC_RESETPRIMASK();       //開放總中斷   

第二種方法:  
NVIC_SETFAULTMASK();      //關閉總中斷  
NVIC_RESETFAULTMASK();    //開放總中斷   

常常使用  

NVIC_SETPRIMASK();                       // Disable Interrupts  
NVIC_RESETPRIMASK();                     // Enable Interrupts

-------------------------------------------------------------------------------------------------
在 3.0 的庫中    已經沒有  
第一種方法:  
NVIC_SETPRIMASK();      //關閉總中斷  
NVIC_RESETPRIMASK();    //開放總中斷   

第二種方法:  
NVIC_SETFAULTMASK();      //關閉總中斷  
NVIC_RESETFAULTMASK();    //開放總中斷   

補充  可以用  
#define CLI()      __set_PRIMASK(1)  
#define SEI()      __set_PRIMASK(0)  

來實現 (野火的例程用的庫版本是3.0的,需要使用補充的方法)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章