程序跳轉注意:
1、如果跳轉之前的程序A里有些中斷沒有關,在跳轉之后程序B的中斷觸發,但程序B里沒有定義中斷響應函數,找不到地址會導致死機。
2、程序跳轉前關總中斷,程序跳轉后開總中斷(關總中斷,只是屏蔽了中斷;當開總中斷后,關總中斷之前開的如定時器的中斷還是開啟的)
開關總中斷:
在STM32/Cortex-M3中是通過改變CPU的當前優先級來允許或禁止中斷
PRIMASK位:只允許NMI和hard fault異常,其他中斷/異常都被屏蔽(當前CPU優先級=0)。
FAULTMASK位:只允許NMI,其他所有中斷/異常都被屏蔽(當前CPU優先級=-1)。
第一種方法:
PRIMASK 用於除能在NMI 和硬fault 之外的所有異常,它有效地把當前優先級改為0(可編程優先級中的最高優先級)。
void__disable_irq (void);//關閉總中斷
void __enable_irq (void);//開放總中斷
__set_PRIMASK(1);//關閉總中斷
__set_PRIMASK(0);//開放總中斷
第二種方法:
FAULTMASK 更絕,它把當前優先級改為‐ 1 。這么一來,連硬fault 都被掩蔽了。使用方案與PRIMASK 的相似。但要注意的是,FAULTMASK 會在異常退出時自動清零。
void __disable_fault_irq (void); //關閉總中斷
void __enable_fault_irq (void);//開放總中斷
__set_FAULTMASK(1);//關閉總中斷
__set_FAULTMASK(0);//開放總中斷
常常使用
void __disable_irq (void);//關閉總中斷
void __enable_irq (void);//開放總中斷
【來源】