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指令 }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务