STM32中断控制及优先级设置

M3用8bits而STM32用高四位来表示抢占和子优先级:bit=1表示抢占;bit=0表示非抢占即子优先级;所以共有5中方案分组:

分组  Bit7 Bit6  Bit5  Bit4 说明:

第0组    0   0    0   0

第1组    1   0    0   0

第2组    1   1    0   0     抢占共有2^2=4(0~3);子优先级2^2=4(0~3),共4*4=16级嵌套

第3组    1   1    1   0  抢占共有2^3=4(0~7);子优先级2^1=2(0~1),共8*2=16级嵌套

第4组    1   1    1   1     

到底谁优先:数字越小优先级越高,抢占级数字小的可剥夺抢占级数字大的

1抢占相同,子优先级不同:此时没有抢占剥夺,此时按照子优先级顺序排序

2抢占和子优先级都相同但有先后:此时无抢占剥夺,依照FIFO,前一个执行完了才能执行后者;

3抢占和子优先级都相同且同时到达:此时按照中断向量表顺序排先后

 开关总中断:

在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h,但在标准库3.5版本中没有改文件,NVIC控制放在了在了mis.c(优先级设置与分组)中和core.cm3.c(总中断的开关控制)) 定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。

CPSID I ;  PRIMASK=1, ;关中断
CPSIE I ;  PRIMASK=0, ;开中断
CPSID F ;  FAULTMASK=1, ;关异常
CPSIE F ;  FAULTMASK=0 ;开异常
PRIMASK(总中断控制位):只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。
FAULTMASK(总异常控制位)::只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。


下面两个函数等效于关闭总中断:
void NVIC_SETPRIMASK(void);

void NVIC_RESETPRIMASK(void);


void NVIC_SETFAULTMASK(void);
void NVIC_RESETFAULTMASK(void);

可以用宏定义开关:

#define EA=1   __set_PRIMASK(1);//__set_FAULTMASK(1)
#define  EA=0 __set_PRIMASK(0);//__set_FAULTMASK(0)
***********************************************************************************

/THUMB指令不支持汇编内联
//采用如下方法实现执行汇编指令WFI
//CHECK OK
//091209
__asm void WFI_SET(void)
{
        WFI;    
}
WFE 休眠并且在发生事件时被唤醒
WFI 休眠并且在发生中断时被唤醒//进入待机模式         
//check ok 
//091202
void Sys_Standby(void)
{
        SCB->SCR|=1<<2;//使能SLEEPDEEP位 (SYS->CTRL)           
          RCC->APB1ENR|=1<<28;     //使能电源时钟            
        PWR->CSR|=1<<8;          //设置WKUP用于唤醒
        PWR->CR|=1<<2;           //清除Wake-up 标志
        PWR->CR|=1<<1;           //PDDS置位                  
        WFI_SET();                                 //执行WFI指令                 
}

原文地址:https://www.cnblogs.com/jieruishu/p/4425731.html