zoukankan      html  css  js  c++  java
  • 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指令                 
    }

  • 相关阅读:
    15-07-23 HTML--标签
    15-07-22 数据库--存储过程、触发器
    15-07-19数据库练习题答案
    15-07-17 数据库练习题
    15-07-20 数据库--索引视图编程
    15-07-17 数据库--高级查询
    c#语句
    SQL 触发器
    SQL 存储过程
    SQL 循环语句
  • 原文地址:https://www.cnblogs.com/jieruishu/p/4425731.html
Copyright © 2011-2022 走看看