在 STM32/Cortex-M3 中是通過改變 CPU 的當前優(yōu)先級來允許或禁止中斷。
PRIMASK 位:只允許 NMI 和 hardfault 異常,其他中斷/異常都被屏蔽(當前 CPU 優(yōu)先級=0)。
FAULTMASK 位:只允許 NMI,其他所有中斷/異常都被屏蔽(當前 CPU 優(yōu)先級=-1)。
在 STM32 固件庫中(stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定義了四個函數(shù)操作 PRIMASK 位和
FAULTMASK 位,改變 CPU 的當前優(yōu)先級,從而達到控制所有中斷的目的。
下面兩個函數(shù)等效于關閉總中斷:
void NVIC_SETPRIMASK(void);
void NVIC_SETFAULTMASK(void);
下面兩個函數(shù)等效于開放總中斷:
void NVIC_RESETPRIMASK(void);
void NVIC_RESETFAULTMASK(void);
上面兩組函數(shù)要成對使用,不能交叉使用。
例如:
第一種方法:
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)
來實現(xiàn) (野火的例程用的庫版本是3.0的,需要使用補充的方法)