來自 http://www.ourdev.cn/forum.php?mod=viewthread&tid=5397451
在 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的,需要使用補充的方法)