当前位置: 首页 > news >正文

STM32中断优先级彻底讲解

文章来源:http://blog.sina.com.cn/s/blog_4fed55ce0100j7nd.html

一:综述

STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级
的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。

二:优先级判断

STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。

具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
三:优先级分组
既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位在NVIC应用中断与复位控制寄丛器(AIRCR)的中断优先级分组域中,可以有8种分配方式,如下:

所有8位用于指定响应优先级
最高1位用于指定抢占式优先级,最低7位用于指定响应优先级
最高2位用于指定抢占式优先级,最低6位用于指定响应优先级
最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

这就是优先级分组的概念。


Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位(AIRCR高四位),这4个寄存器位的分组方式如下:

第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级

可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

NVIC_PriorityGroup_0 => 选择第0组
NVIC_PriorityGroup_1 => 选择第1组
NVIC_PriorityGroup_2 => 选择第2组
NVIC_PriorityGroup_3 => 选择第3组
NVIC_PriorityGroup_4 => 选择第4组

中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的高四位分配各个优先级数字所占的位数。在一个程序中只能设定一次

四:中断源的优先级

接下来就是指定中断源的优先级,中断源优先级是在中断优先级寄存器中设置的,只能设置及高四位,必须根据中断优先级分组中设置好的位数来在该寄存器中设置相应的数值。假如你选择中断优先级分组的第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级,那么抢占式优先级就有000-111共八种数据选择,也就是有八个中断嵌套,而响应优先级中有0和1两种,总共有8*2=16种优先级。

中断源优先级具体的设置了该中断源的优先级别

在一个程序中可以设定多个(最多16个)优先级,每个中断源只能设定的一个。

每写一个关于中断优先级的程序必须包含下列两个函数:

 

(1)void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)中断分组设置

(2)void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)中断优先级设置

转载于:https://www.cnblogs.com/yuqilihualuo/p/4445017.html

相关文章:

  • 基于PCA和SVM的人脸识别
  • markdonw 一个模版
  • android超快模拟器Ggenymotion的安装和配置
  • NSUserDefaults设置bool值重启后bool只设置丢失问题
  • 01_Android应用开发环境_03_开发环境搭建及简单Android程序
  • 信息学奥赛辅导经验谈 问题教学法中的学生思维能力培养
  • HTTP 404 - 未找到文件 怎么样解决
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • JS获得当月的天数和得到当月最后一天的日期
  • void (*f(int, void (*)(int)))(int) 函数解析
  • 我爱淘冲刺阶段站立会议每天任务4
  • jetty运行maven程序(修改及时生效,不需要重启jetty程序)
  • 转:python的命令行输入参数
  • 微一微博的应用项目源码
  • DOM操作
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Angular数据绑定机制
  • Debian下无root权限使用Python访问Oracle
  • Django 博客开发教程 16 - 统计文章阅读量
  • gf框架之分页模块(五) - 自定义分页
  • happypack两次报错的问题
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • node-glob通配符
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Windows Containers 大冒险: 容器网络
  • 第2章 网络文档
  • 番外篇1:在Windows环境下安装JDK
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 前端面试题总结
  • 延迟脚本的方式
  • 用简单代码看卷积组块发展
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Nginx实现动静分离
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 阿里云API、SDK和CLI应用实践方案
  • #define用法
  • #include到底该写在哪
  • (2020)Java后端开发----(面试题和笔试题)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (二)fiber的基本认识
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (四)Controller接口控制器详解(三)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net 高效开发之不可错过的实用工具
  • .Net 路由处理厉害了
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET导入Excel数据
  • .NET中的Exception处理(C#)