|
在 STM32/Cortex-M3 中是通過(guò)改變 CPU的當(dāng)前優(yōu)先級(jí)來(lái)允許或禁止中斷。
PRIMASK 位:只允許 NMI 和 hard fault異常,其他中斷/ 異常都被屏蔽(當(dāng)前 CPU優(yōu)先級(jí)=0)。
FAULTMASK 位:只允許 NMI,其他所有中斷/異常都被屏蔽(當(dāng)前 CPU 優(yōu)先級(jí)=-1)。
在 STM32 固件庫(kù)中(stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定義了四個(gè)函數(shù)操作 PRIMASK位和
FAULTMASK 位,改變 CPU 的當(dāng)前優(yōu)先級(jí),從而達(dá)到控制所有中斷的目的。
下面兩個(gè)函數(shù)等效于關(guān)閉總中斷:
void NVIC_SETPRIMASK(void);
void NVIC_SETFAULTMASK(void);
下面兩個(gè)函數(shù)等效于開放總中斷:
void NVIC_RESETPRIMASK(void);
void NVIC_RESETFAULTMASK(void);
上面兩組函數(shù)要成對(duì)使用,不能交叉使用。
例如:
第一種方法:
NVIC_SETPRIMASK(); //關(guān)閉總中斷
NVIC_RESETPRIMASK(); //開放總中斷
第二種方法:
NVIC_SETFAULTMASK(); //關(guān)閉總中斷
NVIC_RESETFAULTMASK(); //開放總中斷
常常使用
NVIC_SETPRIMASK(); // DisableInterrupts
NVIC_RESETPRIMASK(); // EnableInterrupts
-------------------------------------------------------------------------------------------------
在 3.0 的庫(kù)中 已經(jīng)沒(méi)有
第一種方法:
NVIC_SETPRIMASK(); //關(guān)閉總中斷
NVIC_RESETPRIMASK(); //開放總中斷
第二種方法:
NVIC_SETFAULTMASK(); //關(guān)閉總中斷
NVIC_RESETFAULTMASK(); //開放總中斷
補(bǔ)充 可以用
#define CLI() __set_PRIMASK(1)
#define SEI() __set_PRIMASK(0)
來(lái)實(shí)現(xiàn) (野火的例程用的庫(kù)版本是3.0的,需要使用補(bǔ)充的方法)
|
|