CM3最多240个中断,每个中断有自己的可编程的中断优先级(唯一对应的中断优先级寄存器)。由于CM3支持硬件中断嵌套,所以可以有256级的可编程优先级和256级中断嵌套。
STM32 目前支持的中断共为 84 个(16个内核+68个外部),16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。
__set_FAULTMASK(1); //关所有中断
NVIC_SystemReset(); //复位,在core_cm3.h里定义
上述代码通过__set_FAULTMASK(1)关闭所有中断,避免在执行NVIC_SystemReset()复位函数中被打断。想要保持之前配置好的寄存器不被初始化复位,需要在程序跳转之前先初始化堆栈
__set_MSP(*(__IO uint32_t*) 0x08000000); 初始化堆栈指针
((void (*)(void)) (*(vu32 *)0x08000004)(); 程序跳转
STM32/Cortex-M3中是通过改变 CPU的当前优先级来允许或禁止中断。
PRIMASK位:允许NMI和hard fault异常,其他都被屏蔽(当前CPU优先级=0)。
FAULTMASK位:允许NMI,其他所有都被屏蔽(当前CPU优先级=-1)。
在STM32固件库中(stm32f10x_nvic.c和 stm32f10x_nvic.h)定义了四个函数操作PRIMASK位和FAULTMASK位,改变 CPU 的当前优先级,从而达到控制所有中断的目的。
NVIC_SETPRIMASK(); //关闭总中断
NVIC_RESETPRIMASK(); //开放总中断
第二种方法:
NVIC_SETFAULTMASK(); //关闭总中断
NVIC_RESETFAULTMASK(); //开放总中断
#define CLI() __set_PRIMASK(1)
#define SEI() __set_PRIMASK(0)