STM32中断使用NVIC

news2024/11/19 5:55:16

抢占优先级和响应优先级

值越小优先级越高,抢占优先级高就可以的打断抢占优先级低的;但同一个抢占优先级,高响应优先级并不能打断低响应优先级;当然中断同时发生的响应优先级高的先执行。简单理解为:抢占优先级能控制中断的绝对打断,同级抢断优先级没有打断的功能

分组配置是在寄存器SCB->AIRCR中配置:

SCB: System Control Block; AIRCR : Application Interrupt / Reset Control Register
在这里插入图片描述

常用寄存器解释

typedef struct 
{ 
  __IOM uint32_t ISER[8U];             
         uint32_t RESERVED0[24U]; 
  __IOM uint32_t ICER[8U];           
         uint32_t RSERVED1[24U]; 
  __IOM uint32_t ISPR[8U];        
         uint32_t RESERVED2[24U]; 
  __IOM uint32_t ICPR[8U];          
         uint32_t RESERVED3[24U]; 
  __IOM uint32_t IABR[8U];              
        uint32_t RESERVED4[56U];
  __IOM uint8_t  IP[240U];            
         uint32_t RESERVED5[644U]; 
  __OM  uint32_t STIR;                  
}  NVIC_Type;

ISER[8]

ISER 全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。CM3 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制(328=256),但103系列的芯片只有60个所以只需要两个32位中断(232=64),也就是ISER[0]和ISER[1]

ICER

ICER[8]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。

ISPR

ISPR[8]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。

ICPR

ICPR[8]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。

IABR

全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器通过它可以知道当前在执行的中断是哪一个

IP

IP[240]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄存器组相当重要!STM32 的中断分组与这个寄存器组密切相关。IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit。想要设置某个序号的中断,最终是通过修改IP中某个序号8位的值。例如IP[37]=

程序设置中断过程

typedef struct
{
  uint8_t NVIC_IRQChannel; //设置中断通道
  uint8_t NVIC_IRQChannelPreemptionPriority;//设置响应优先级
  uint8_t NVIC_IRQChannelSubPriority; //设置抢占优先级
  FunctionalState NVIC_IRQChannelCmd; //使能/使能
} NVIC_InitTypeDef;

系统运行后先设置中断优先级分组。调用函数:
1.void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
 整个系统执行过程中,只设置一次中断分组。
针对每个中断,设置对应的抢占优先级和响应优先级:
2.void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
NVIC_InitTypeDef   NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断,这里就是37
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);	//根据上面指定的参数初始化NVIC寄存器,实际就是在这里边将某个特定位置的寄存器地址中的数据修改为上面赋值的内容,进而达到想要使用的功能
③ 如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。

在这里插入图片描述

库函数中的中断初始化函数分析

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
  uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;
  
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));  
  assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
    
  if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  {
    /* Compute the Corresponding IRQ Priority --------------------------------*/    
    tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;   //抢占优先级需要定义的位数
    tmppre = (0x4 - tmppriority);		//定义响应优先级位数
    tmpsub = tmpsub >> tmppriority;    //定义的响应优先级位全是1

    tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;  //设置的抢占优先级数值左移响应优先级的定义位数
    tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;     //只保留响应优先级定义位和抢占优先级位的值,其他位清零
    tmppriority = tmppriority << 0x04;   //左移四位,因为只是用[7:4]位做为中断抢占和响应优先级的值
        
    NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;   //NVIC的IP对应的值可以根据数据手册查看,也可参考程序库中的名称和对应的地址,例如USART1就是37
    
    /* Enable the Selected IRQ Channels --------------------------------------*///这里才是把设置的值作用到寄存器
    NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =            //ISER中每一bit位管理一个中断使能,而每一个ISER是以32位bit为数组中的一个元素,所以中断序号除以32得到该序号对应的ISER的数组序号
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);  //取得不被32整除的部分做为中断序号在对应ISER组中的bit位的值
  }
  else
  {
    /* Disable the Selected IRQ Channels -------------------------------------*/
    NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);  //如果设置为DISABLE,那么设置另一个寄存器和上面寄存器的方法一样
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RV1126笔记十七:吸烟行为检测及部署<五>

若该文为原创文章,转载请注明原文出处。 ubuntu16.04上搭建转化成RKNN环境并把onnx转成RKNN模型(ubuntu16.04) onnx模型转rknn模型需要用到py3.8,所以搭建环境在转换,下面全部操作都是虚拟机下进行。 注意:转模型用py3.6, 训练用py3.8 一、miniconda安装 1、下载地址…

论文投稿指南——中文核心期刊推荐(自然科学总论)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

基于python的AD-census立体匹配算法实现

文章目录前言一、AD-census是什么&#xff1f;1.代价计算2.代价聚合3.视差优化4.视差后处理二、基于python的AD-census立体匹配算法实现前言 AD-Census算法来自于中国学者Xing Mei等在ICCV2011发表的论文《On Building an Accurate Stereo Matching System on Graphics Hardwar…

多类型随机图形生成方法及应用研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Linux-5 基础命令

Linux-5 基础命令 查看类命令 此类命令仅能查看文件中的内容 ls是用来查看目录中的内容cat是用来查看文件中的内容 查看文件 cat 选项 -n&#xff1a;显示文件内容的行数-A&#xff1a;显示文件中的特殊字符&#xff08;如果从Windows拷贝配置文件到Linux&#xff0c;很容易出…

化学试剂Biotin-PEG-COOH,Biotin-PEG-acid,生物素-聚乙二醇-羧基

英文名称&#xff1a;Biotin-PEG-COOH&#xff0c;Biotin-PEG-acid 中文名称&#xff1a;生物素-聚乙二醇-羧基 生物素-PEG-COOH是一种含有生物素和羧酸的线性杂双功能PEG试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。生物素能以高特异性和亲和力与亲和素和链霉亲…

C++:STL:常用容器(上):string

1&#xff1a;string容器 1.1 string基本概念 本质&#xff1a; string是C风格的字符串&#xff0c;而string本质是一个类 string和char* 区别 1&#xff1a;char* 是一个指针 2&#xff1a;string是一个类&#xff0c;类内部封装了 char* 管理这个字符串&#xff0c;是一个 …

5G无线技术基础自学系列 | 5G网络接入问题分析

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G网络的接入失败或者接入时延过大都会…

实现安卓LED设备驱动:不写一行代码

文章目录一、前言二、准备工作2.1 内核版本2.2 内核文档&#xff1a;bindings->leds2.3 文档解析&#xff1a; leds-gpio.txt三、编写DTS3.1 查原理图&#xff0c;挑选GPIO3.2 编写DTS文件四、编译测试4.1 编译dt.img4.2 烧录dt.img五、基于fs的测试5.1 测试命令5.2 **点灯效…

将单向链表按照目标值value 划分成左边小,中间等,右边大的形式,给定一个单链表,判断单链表的值是否是回文结构【图文解释包你看懂】

将单向链表按照目标值value 划分成左边小&#xff0c;中间等&#xff0c;右边大的形式 例如 1 -> 3 -> 5-> 3 -> 7 按照value 3划分 1-> 3-> 3 -> 5 -> 7 解题思路&#xff1a;给定值为 value 用6个变量&#xff0c;分别表示 小于value 的Head sH &…

2023年天津中德应用技术大学专升本专业课考试具体安排及准考证

2023年天津中德应用技术大学高职升本科专业课考试准考证下载及考生须知 一、准考证下载打印 12月24日12点开始&#xff0c;专业课报名审核通过的考生&#xff0c;登录学校专业课报名系统&#xff08;114.115.135.236/jobgroup/f&#xff09;&#xff0c;点击“准考证”&#xf…

Qt之悬浮球菜单

一、概述 最近想做一个炫酷的悬浮式菜单&#xff0c;考虑到菜单展开和美观&#xff0c;所以考虑学习下Qt的动画系统和状态机内容&#xff0c;打开QtCreator的示例教程浏览了下&#xff0c;大致发现教程中2D Painting程序和Animated Tiles程序有所帮助&#xff0c;如下图所示&a…

Java反射面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

科技交流英语(2022秋)Unit 6 test

科技交流英语&#xff08;2022秋&#xff09;Unit 6 test 简介 由电子科技大学组织开设&#xff0c;授课教师为李京南、庞慧、刘兆林等5位老师。 课程介绍 英语广泛用于工程技术领域的国际交流。如何使用简洁的语言清楚地传递信息是工程师在国际舞台上常常面临的问题。本课…

【Vue】Vue重写教室管理系统的前端网页V1(前后端分离)--20221222

项目说明 目的 练习并熟悉Vue2 的API&#xff0c;来为Vue项目做准备&#xff1a; 插值语法插槽props和data父子组件通信Ajax异步请求数据生命周期函数methods方法computed属性vue-router、路由守卫、query/params传参、编程函数式路由模拟后端服务器传送数据打包项目 需要加…

Tableau可视化设计案例-06Tableau填充地图,多维地图,混合地图

文章目录Tableau可视化设计案例06 填充地图&#xff0c;多维地图&#xff0c;混合地图1.填充地图1.1 各省售电量填充地图 地图格式设置2.多维地图2.1 各省售电量多维地图3.混合地图3.1 各省售电量混合地图Tableau可视化设计案例 本文是Tableau的案例&#xff0c;为B站视频的笔…

如何花最少的资源遍历二叉树

文章目录一、递归遍历二叉树1.1 前序遍历1.2 中序遍历1.3 后序遍历二、非递归遍历二叉树2.1 前序遍历2.2 中序遍历2.3 后序遍历三、高效的 Morris 遍历3.1 前序遍历3.2 中序遍历3.3 后序遍历关于二叉树的遍历也是面试过程中非常有可能考的话题。常见的简单的递归遍历二叉树&…

头条号权重高有什么优势?头条权重在线查询

头条号权重是根据你的关键词排名、预估流量等综合评估计算出的一个"权重值"&#xff0c;关键词指数越大&#xff0c;排名越好&#xff0c;预估的流量就越多&#xff0c;权重也就越高。 如果是查询头条号权重较少&#xff0c;可以看看这3个方法&#xff1a; 1、指…

flutter 环境搭建

一、简介 Flutter 是谷歌开发的一款开源、免费的&#xff0c;基于 Dart 语言的U1框架,可以快速在i0S和Android上构建高质量的原生应用。 它最大的特点就是跨平台和高性能。Dart是由谷歌&#xff0c;在2011 年开发的计算机编程语言&#xff0c;它可以被用于Web、服务器、移动应…

腾讯云轻量应用服务器安装和配置宝塔 Linux 面板腾讯云专享版

宝塔 Linux 面板腾讯云专享版由腾讯云与堡塔公司联合开发&#xff0c;专享版在已支持普通版所有功能的基础上&#xff0c;还默认集成腾讯云对象存储、文件存储、内容分发网络和 DNS 解析插件。插件具备如下功能&#xff1a; 支持将对象存储的存储桶挂载到轻量应用服务器实例&a…