您好,欢迎来到年旅网。
搜索
您的当前位置:首页STM32中断控制及优先级设置

STM32中断控制及优先级设置

来源:年旅网
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指令 }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务