【转】STM32 - 程序跳转、中断、开关总中断
程序跳转注意:
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);//开放总中断
【来源】