• 重学STM32---(三) 中断分组和优先级


      看了大半天,终于把原子哥的例程中的中断分组和优先级看懂了,勉勉强强知道了怎么设置中断分组和优先级,,不容易啊。下面就是我收集的资料及我的理解

    分组不是很难,就是有一点知道就就全部明白了:

    // 设置NVIC分组 

    //NVIC_Group:NVIC 分组 0~4  总共 5 组   

    void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)     

    {  

        u32 temp,temp1;    

        temp1=(~NVIC_Group)&0x07;//取后三位 见后注释

        temp1<<=8;                //因为优先级分组在8-10位

        temp=SCB->AIRCR;  //读取先前的设置 

        temp&=0X0000F8FF; //清空先前分组 

        temp|=0X05FA0000; //写入钥匙   看上寄存器

        temp|=temp1;      

        SCB->AIRCR=temp;  //设置分组                      

    }

           temp1=(~NVIC_Group)&0x07;//取后三位 为什么NVIC_Group要取反?和CM3分组不是反了吗?仔细查看《CM3权威指南》和对比《STM32不完全手册》可以发现,STM32是把CM3内核中第7分组定义为STM32的第0分组!原子哥撇开STM的库函数自己写,其实写的就是内核驱动,所以现在我们要控制的不是STM32,而是CM3,为了和STM32文档对应,那么我们应该对NVIC_Group取反!比如说我现在要用到STM32中的第1分组,其实是CM3中的第6分组,那我应该是把0x600写进CM3!

     

     

     

     

     

    //设置NVIC

    //NVIC_PreemptionPriority:抢占优先级

    //NVIC_SubPriority       :响应优先级

    //NVIC_Channel           :中断编号

    //NVIC_Group             :中断分组 0~4

    //注意优先级不能超过设定的组的范围!否则会有意想不到的错误

    //组划分:

    //组0:0位抢占优先级,4位响应优先级

    //组1:1位抢占优先级,3位响应优先级

    //组2:2位抢占优先级,2位响应优先级

    //组3:3位抢占优先级,1位响应优先级

    //组4:4位抢占优先级,0位响应优先级

    //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先         

    void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)  

    {

           u32 temp;      

           MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组(见上分析)

           temp=NVIC_PreemptionPriority<<(4-NVIC_Group); //有上图可知bit4-7是设置优先级的。

                                                                                            而优先级设定是由分组决定的

                                                                                           0组时:0位抢占优先级,4位响应优先级(bit4-7)

                                                                                           1组时:1位抢占优先级(bit7),3位响应优先(bit4-6)级

                                                                                           2组时:2位抢占优先级(bit6-7),2位响应优先级(bit4-5)

                                                                                           。。。。  所以这里要减去NVIC_Group

           temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);

           temp&=0xf;                                                     //取低四位 

           NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);      //stm32最多好像有200多个中断吧,不记得了,NVIC_Channl代表的其中一个,例如USART2_IRQn = 38。这些中断由8个32位寄存器使之使能,就拿USART2_IRQn来说,38/32 =1,38%32=6,所以要使USART2中断使能的话,必须设置NVIC->ISER[1]第六位为1(看看下面的寄存器)

           NVIC->IP[NVIC_Channel]|=temp<<4;              //设置响应优先级和抢断优先级  

    }

     

     

    再插张一张NVIC寄存器吧,(在M3权威指南):

     

  • 相关阅读:
    远程服务器Xshell的使用 -- 重启服务器操作 和 linux的常用命令
    Spring Boot 服务端开发项目目录结构
    font-weight字体重量和font-family字体类型中的粗细度的对应关系
    iframe的使用
    js 多个箭头函数的使用
    js 获取本地上传的文件(图片和视频)的宽高和大小
    react-navigation Modal弹出层中的StackNavigator导航如何和物理返回匹配?
    IntelliJ IDEA 2019.3的安装和激活
    android EditText 的聚焦和失焦,输入框的监听
    Android 系统架构 和 各个版本代号介绍
  • 原文地址:https://www.cnblogs.com/qigaohua/p/5324030.html
Copyright © 2020-2023  润新知