[12]STM32-NVCI中断优先级管理

2023-11-08

前言

这一篇博客主要讲解NVCI中断优先级分组,优先级设置。因为还没有我还没学到做中断实验,所以有些地方我自己理解得也不是很透彻,这是看了原子哥的视频用自己的话来梳理一下思路。

基础知识

STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。

而我们常用的就是这 68 个可屏蔽中断, 但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。因为我们开发板选择的芯片是 STM32F103 系列的所以我们就只针对 STM32F103 系列这 60 个可屏蔽中断进行介绍。
具体就是IP[0]-IP[59],每一个中断具体作用可以查看《STM32中文参考手册》9.1.2,下面放一下部分参考手册中的截图。在这里插入图片描述

NVIC中断优先级分组

STM32 将中断分为 5 个组,组 0-4该分组的设置是由 SCB->AIRCR 寄存器的 bit10-8 来定义的。具体的分配关系如表所示。
配置了AIRCR的10-8位之后,就对4-7位进行了一个分组,假设分组为1,则第7位是抢占优先级,6-4位是响应优先级(即1位抢占优先级,3位响应优先级),同理可以看出抢占优先级可以设置位0或1,响应优先级可以设置位0-7(000-111)。
在这里插入图片描述

抢占和响应优先级的理解

在这里插入图片描述
这里先贴一张原子哥的图。用通俗的话来讲,我们把响应和抢占当作抢答一样,现在有A B C三个人进行抢答。
如果A B C,A的抢占优先级高,那我们就将A设为评委,现在B先抢到了回答,正在进行回答。但是A是评委(高抢占优先级),他可以随时中止B的回答,然后进行自己的回答。

如果A B C,A的抢占优先级高(评委),但B的响应优先级比C高,我们就假设B离控制中心更近,如果B,C同时进行抢答操作的话,B的信号会先达到控制中心,然后就判定B开始回答问题。但是如果C先抢答到,B无法跟A一样可以中断C的回答,因为B并非评委,B,C地位一样。

如果三个人都没有抢占优先级,也没有响应优先级,就跟抢答一样,谁先抢到谁发言。

值得注意的是抢占优先级和响应优先级一样,越低位优先级越高,比如0比1的抢占优先级高,响应优先级同理。

原子哥的这个例子说明性也很强,可以参考一下
在这里插入图片描述

NVCI 相关函数

首先是中断优先级分组函数,这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改,否则可能会出现意想不到的错误。

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

这个函数的实现方式可以找到,跟上文一样然是配置AIRCR寄存器

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

函数的入口参数也可以查看

#define IS_NVIC_PRIORITY_GROUP(GROUP)
(((GROUP) == NVIC_PriorityGroup_0) ||  //分组0
((GROUP) == NVIC_PriorityGroup_1) || \
((GROUP) == NVIC_PriorityGroup_2) || \
((GROUP) == NVIC_PriorityGroup_3) || \ //分组3
((GROUP) == NVIC_PriorityGroup_4))

如果我们要分组位2响应2抢占

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

分组好了之后,要设置单个中断的抢占优先级和响应优先级
在寄存器里面我们要配置IP[0]-IP[59] (60个中断),每个IP寄存器的高四位来设置抢占和响应优先级,低四位没有用到。(根据前面的表格就是4-7位)
这里就要用上NVIC_Init() 函数,用法和GPIO_Init()相同。
先看一下这个函数的结构体成员变量

typedef struct
{
  uint8_t NVIC_IRQChannel;                    /*!< Specifies the IRQ channel to be enabled or disabled.
                                                   This parameter can be a value of @ref IRQn_Type 
                                                   (For the complete STM32 Devices IRQ Channels list, please
                                                    refer to stm32f10x.h file) */

  uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< Specifies the pre-emption priority for the IRQ channel
                                                   specified in NVIC_IRQChannel. This parameter can be a value
                                                   between 0 and 15 as described in the table @ref NVIC_Priority_Table */

  uint8_t NVIC_IRQChannelSubPriority;         /*!< Specifies the subpriority level for the IRQ channel specified
                                                   in NVIC_IRQChannel. This parameter can be a value
                                                   between 0 and 15 as described in the table @ref NVIC_Priority_Table */

  FunctionalState NVIC_IRQChannelCmd;         /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
                                                   will be enabled or disabled. 
                                                   This parameter can be set either to ENABLE or DISABLE */   
} NVIC_InitTypeDef;
  • NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到每个中断对应的名字。例如USART1_IRQn。
  • NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。
  • NVIC_IRQChannelSubPriority:定义这个中断的子优先级别。
  • NVIC_IRQChannelCmd:该中断是否使能。

比如我们要使能串口 1 的中断,同时设置抢占优先级为 1,子优先级位 2,初始化的方法是(跟GPIO很相似):

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器

参考资料

《STM32F1开发指南-库函数版本》 4.5小节
《STM32中文参考手册》第九章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[12]STM32-NVCI中断优先级管理 的相关文章

  • 【apifox/postman】使用技巧

    文章目录 一 apifox 1 1 设置全局变量 1 1 1 token 二 postman 2 1 设置全局变量 一 apifox 1 1 设置全局变量 1 1 1 token 首先设置 login 接口后 取 token 设置到 名为

随机推荐

  • 零基础,零成本,部署一个属于你的大模型

    前言 看了那么多chatGPT的文章 作为一名不精通算法的开发 也对大模型心痒痒 但想要部署自己的大模型 且不说没有算法相关的经验了 光是大模型占用的算力资源 手头的个人电脑其实也很难独立部署 就算使用算法压缩后的大模型 部署在个人电脑上
  • pytorch: 给tensor删除或者添加维度为1的维度(squeeze和unsqueeze)

    删除tensor中维度为1的维度 在pytorch中 用torch squeeze 函数或者tensor的自身成员函数squeeze 去除维度为1的维度 import torch x torch randn 3 1 4 1 2 a x sq
  • Servlet学习(八):Session

    一 Session的基本使用 1 概念 Session 服务端会话跟踪技术 将数据保存到服务端 Session是存储在服务端而Cookie是存储在客户端 存储在客户端的数据容易被窃取和截获 存在很多不安全的因素 存储在服务端的数据相比于客户
  • GDB 格式化结构体输出及记录到文件

    GDB 常用命令参考手册 set print address set print address on 打开地址输出 当程序显示函数信息时 GDB会显出函数的参数地址 系统默认为打开的 show print address 查看当前地址显示
  • JDBC五种连接方式详解

    目录 前言 二 JDBC程序编写步骤 1 总流程图如下 2 五种连接方式 2 1 数据库连接方式一 2 2 数据库连接方式二 2 3 数据库连接方式三 2 4 数据库连接方式四 2 5 数据库连接方式五 总结 前言 JDBC Java Da
  • 【计算机网络】 RTT和RTO

    文章目录 RTT 往返时延 RTO Retransmission Timeout 超时重传时间 RTT 往返时延 RTT Round Trip Time 是计算机网络中的一个重要的性能指标 表示从发送端发送数据开始 到发送端接收到来自接收端
  • STM32学习笔记——EXIT(外部中断)

    目录 一 什么是中断系统 二 中断系统执行流程 三 NVIC 提供中断控制器 CPU的好助手 1 NVIC的作用 STM32 2 NVIC优先级分组 四 EXTI 外部中断 1 EXTI简介 2 EXTI基本结构 3 EXTI框图 五 AF
  • elk笔记12--常见api和设置区别

    elk笔记12 常见api和设置区别 1 freeze 和 close 区别 1 1 freeze介绍 1 2 close介绍 2 persistent 和transient区别 3 两个allocation 说明 本文主要记录 es 中常
  • 《数据结构》将一个带头结点的单链表分解成两个单链表

    将一个带头结点的单链表分解成两个单链表 题目描述 设计一个算法 将一个带头结点的单链表分解成两个具有相同结构的 链表B和C 其中B白哦的结点为A中小于0的结点 C表的结点为A中大于0 的结点 要求B和C 仍利用A表的结点 A表的元素都是非0
  • pyqt5 QLabel详细用法

    QLabel控件类的主要API如下 setAlignment 设置文本的对齐方式 setIndent 设置文本缩进 text 获取文本内容 setText 设置文本内容 selectedText 返回所选择的字符 setBuddy 设置伙伴
  • OpenCV代码提取:遍历指定目录下指定文件的实现

    OpenCV 3 1之前的版本 在contrib目录下有提供遍历文件的函数 用起来比较方便 但是在最新的OpenCV 3 1版本给去除掉了 为了以后使用方便 这里将OpenCV 2 4 9中相关的函数给提取了出来 适合在Windows 64
  • python运行报错:‘NoneType‘ object is not callable

    NoneType object is not callable 空类型对象不可调用 调用了装饰器函数 但是装饰器函数没有返回值 导致使用的函数报错 参照代码的注释 timmer 引用装饰器等于test1 timmer func 所以timm
  • 字节跳动开源 Kelemetry:面向 Kubernetes 控制面的全局追踪系统

    动手点关注 干货不迷路 Kelemetry是字节跳动开发的用于Kubernetes控制平面的追踪系统 它从全局视角串联起多个 Kubernetes 组件的行为 追踪单个 Kubernetes 对象的完整生命周期以及不同对象之间的相互影响 通
  • MongoDB 获取数组中匹配到的第一个元素对象

    例如当前test库中的grade集合中有两条文档数据 如下图所示 相关的两个实体映射类如下 import lombok Data import org springframework data annotation Id import or
  • 政企数智办公潮水里的融云「答卷」

    在这张集合了党政机关 金融保险 交通 能源电力等中大型组织复杂办公需求的高难度答卷上 融云在扎实耐打的通信底层之上 保持灵活的身段和强大的进化能力 稳定而轻盈 在不断变化的环境中正在成为确定性本身 作者 皮爷 出品 产业家 如果说过去两年里
  • 报sslSocketFactory(SSLSocketFactory) not supported on JDK 9+

    使用OkHttpClient的时候 jdk版本1 8 0 151启动不会报错 但jdk版本1 8 0 202启动就会报错 应该是OkHttpClient jdk小版本号高了不行 修改代码如下 public class SSLSocketCl
  • 20.docker之DockerCompose基础进阶

    1 docker compose命令模板 docker compose yml 作用 compose以项目为核心 在项目中定义一组具有相同业务逻辑单元服务运行 注意 在编写docker compose yml文件时 所有的冒号 短横线 后面
  • Spring框架入门基础1:IOC---控制权反转

    Spring框架的优点 方便解耦 简化开发 Spring就是一个大工厂 可以将所有对象创建和依赖关系维护 交给Spring管理 这也是IOC的作用 IOC IOC就是控制反转 将创建对象的过程交给spring进行管理 可以用来减低计算机代码
  • linux命令练习-实验一

    实验序号 一 实验项目 熟悉常用的Linux操作 实验成绩 一 实验目的 为后续上机实验做准备 熟悉常用的Linux操作 1 了解安装Linux的方法 2 熟悉常用的Linux操作 二 实验内容 一 安装Linux Ubuntu 14 以上
  • [12]STM32-NVCI中断优先级管理

    前言 这一篇博客主要讲解NVCI中断优先级分组 优先级设置 因为还没有我还没学到做中断实验 所以有些地方我自己理解得也不是很透彻 这是看了原子哥的视频用自己的话来梳理一下思路 基础知识 STM32 有 84 个中断 包括 16 个内核中断和