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