NVIC 中断优先级管理详解

NVIC 中断优先级管理详解1.NVIC(内嵌向量中断控制器)NVIC:NestedVectoredInterruptController,STM32系列有84个中断,相对于的开发板STM32F103系统

大家好,又见面了,我是你们的朋友全栈君。

1.NVIC(内嵌向量中断控制器)

  1. STM32系列总共有84个中断,其中我用的STM32F103系列的板子也有60个中断,可想而知STM32一定有一个中断的管理机制来管理这么多中断,使能中断并且配置相关中断的优先级,这就是NVIC的工作
  2. 优先级高的中断可以打断优先级低的中断,这样一个中断执行的时候被另外中断给打断,这个中断执行完再执行上一个中断,形成中断之间的嵌套,或许这就是NVIC 名字为内嵌向量中断控制器来源
  3. NVIC中对于每个中断需要设置 抢占优先级响应优先级(又称子优先级),很明显多个中断会先比较 抢占优先级,抢占优先级相同的比较响应优先级,这里值得注意的是 高抢占优先级能够打断低抢占优先级的,但是相同抢占优先级的高响应优先级不能打断低响应优先级。
  4. NVIC利用四个位保存抢占优先级和响应优先级
    我们可以自由设置用几个位来保存抢占优先级和响应优先级,例如我们全部用这4个位 全部保存响应优先级,那么响应优先级可以设置为0~15中的任何一个值,这就是优先级分组0,这就是,抢占优先全部一样,我们也可以设置1个位来保存抢占优先级3个位保存响应优先级,这样抢占优先级就可以设置为0和1,响应优先级就可以设置为0至7,这就是优先级分组1,顺便一提,值越小代表优先级越高


中断分组表

中断优先级分组 分配结果 抢占优先级取值 响应优先级取值
0 0位抢占优先级,4位响应优先级 0~0 0~15
1 1位抢占优先级,3位响应优先级 0~1 0~7
2 2位抢占优先级,2位响应优先级 0~3 0~3
3 3位抢占优先级,1位响应优先级 0~7 0~1
4 4位抢占优先级,0位响应优先级 0~15 0~0

提示:我们最好一个程序就用就只指定一个中断分组,否则容易混肴!

2.NVIC配置详情

这里利用定时器3举例

//定时器3中断初始化,指定抢占优先级与响应优先级 
void MY_TIM3_Interrupt_Init(u8 preemptionPriority,u8 subPriority){

    // 1.这里是配置允许定时器中断
    NVIC_InitTypeDef NVIC_Initstructure;

    //第一个参数指定具体是那种中断,定时器3(TIM3就是) TIM3_TRQn,例如串口1是USART1_IRQn
    NVIC_Initstructure.NVIC_IRQChannel = TIM3_IRQn; //设置为定时器3中断
    NVIC_Initstructure.NVIC_IRQChannelCmd = ENABLE; //中断使能
    //指定抢占式优先级
    NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority = preemptionPriority;
    //指定响应式优先级(子优先级)
    NVIC_Initstructure.NVIC_IRQChannelSubPriority = subPriority;
    NVIC_Init(&NVIC_Initstructure);
}

//我们这里只是允许TIM3中断,定时器有更新中断,输入捕获中断等
//所以我们还需要在配置定时器的时候指定定时器具体中断请求,这里其实和NVIC配置没关系了(题外话)
//例如:
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断

//另外最好在主函数配置中断优先级分组,设置完一次就不要再配置了!
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);//后面的值不仅可以为2,还可以为0,1,3,4

//***************************************************
//***************************************************
/*中断处理函数*/
//每一种中断处理函数名字都是固定的!我们必须写对中断处理函数名才能让中断得到处理
void TIM3_IRQHandler(void){ 
    //1.判断是什么中断

    // 1.1 如果是定时器更新中断
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)){
        //处理中断事件....

    // 1.2 最后将中断标志位都清理掉
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    }
}

3.NVIC常用的中断请求名和中断函数处理名

这里就不一一列举所有的中断请求名和中断函数处理名,例如我的单片机是STM32F10系列,我就可以在stm32f10x.h中查看到所有的中断请求名,根据中断请求名就基本能写出中断处理函数,实在不行再到别的地方查查吧。。咳咳。。
这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140362.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 计算机等级考试–二级Java的知识点大全

    计算机等级考试–二级Java的知识点大全第一章数据结构与算法【考点1】算法的基本概念1、算法:是指一组有穷的指令集,是解题方案的准确而完整的描述。算法不等于程序,也不等于计算方法。2、算法的基本特征:1)确定性,算法中每一步骤都必须有明确定义,不允许有多义性;2)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止;3)可行性,算法原则上能够精确地执行;4)拥有足够的情报。3、算法的组成…

  • Java面试题大全带答案「建议收藏」

    Java面试题大全带答案「建议收藏」本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有答案,第三虽然有答案,但未必能在面试中说,所以在本文里,会不断收集各种面试题,并站在面试官的立场上,给出我自己的答案。第一部分、Java基础1.JDK和JRE有什么区别?JDK是java的开发工具包,有JDK8,9甚至到14的差别,安装以后,不仅包含了java的开发环境,比如java.exe,还包含了运行环境(jre)相关包。 JRE是java运行环境,一般装好JDK后,系统里会有对应的JRE环境。2..

  • 详解数据库三大范式、BCNF范式

    文章目录什么是”范式(NF)”1.第一范式(1NF)2.第二范式(2NF)2.1函数依赖2.1.1完全函数依赖2.1.2部分函数依赖2.2码2.3非主属性3.第三范式(3NF)4.小结4.1三大范式总结4.2完全&部分函数依赖4.3表设计规范(范式的选择)什么是”范式(NF)”按照教材中的定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。很晦涩吧?实际上你可以把它粗略地理解为一张数据表的.

  • linux下查看java进程日志,linux 下查看java进程[通俗易懂]

    linux下查看java进程日志,linux 下查看java进程[通俗易懂]Maven(二)使用eclipse创建maven多模块项目maven作为一种自动化构建工具,在现在的企业应用开发中运用非常普遍.企业项目一般都比较大,多采用maven管理的多模块项目,下面直接上创建步骤一.创建一个maven项目AndroidActivity的生命周期详解应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监…

  • c#中高效的excel导入sqlserver的方法

    将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.S

    2021年12月27日
  • IIS服务器实现跨域调用「建议收藏」

    IIS服务器实现跨域调用「建议收藏」今天用JS实现了一下ajax请求,本地作为服务器,但是请求的时候总是提示跨域,google了一下,都是说在服务器添加“Access-Control-Allow-Origin”,开始误以为是在服务器得html页面添加,后来才知道是在服务器中添加打开IIS,找到“HTTP响应标头”点进去,在右侧可以看到添加,然后添加如下标头即可Access-Control-Allow-Headers:Content-…

    2022年10月21日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号