STM32中断优先级void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

发布者:breakthrough2最新更新时间:2024-10-18 来源: cnblogs关键字:STM32  中断优先级  掩码 手机看文章 扫描二维码
随时随地手机看文章

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
  u32 tmppriority = 0x00, tmpreg = 0x00, tmpmask = 0x00;
  u32 tmppre = 0, tmpsub = 0x0F;

  /* Check the parameters */
  assert(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  assert(IS_NVIC_IRQ_CHANNEL(NVIC_InitStruct->NVIC_IRQChannel));
  assert(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));
  assert(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
   
  if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  {
    /* Compute the Corresponding IRQ Priority --------------------------------*/   
    tmppriority = (0x700 - (SCB->AIRC & (u32)0x700))>> 0x08;//算出来得到的就是占先优先级的位数占四位中的几位
    tmppre = (0x4 - tmppriority);
    //算出来得到的就是响应优先级的位数占四位中的几位
    tmpsub = tmpsub >> tmppriority;
    //然后将四位掩码通过抢占优先级位数得到响应优先级的掩码  
    tmppriority = (u32)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
    //把用户输入的优先级组别参数 结合 前面计算出来的响应优先级的位数 通过 移位放置到抢占优先级相应的bit上
    tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;//与上相应优先级掩码得到单纯的相应优先级
    //然后 或上(|) 响应优先级得到了该中断通道8位的优先级数
    //接下来的问题就是如何将这个优先级放置到相应的通道中断优先级寄存器中?
    tmppriority = tmppriority << 0x04;
    //首先将这个优先级数左移四位放置到相应通道优先级寄存器8位的高四位(优先级8位从左边算起的)
    tmppriority = ((u32)tmppriority) << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
    //因为一个32位中包含4个八位,而同时又包括好几个32位,这样的话,需要有一个对准的问题,比如我现在
    //是第六个通道,我就需要将其放置到第二个32位中的第二个八位(从左边数),具体算法是:
    //首先将该通道在32位中的第几个八位算出来,所以同0x03相与,将通道序号按照模4(MOD)计算,结果其实就是通道数除以4得到的余数,
    //然后再乘以8得到的便是该通道在32位中的第几位,有0*8=0,1*8=8,2*8=16,3*8=24,这四种情况
    //总之该语句将该通道优先级寄存在其32位当中从第几位开始的8位找出来了放在tmppriority相应的地方中
    tmpreg = NVIC->Priority[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)];
    //接下来将通道数除以四(这里通道移位来运算除法的),得到的其实就是该通道在第几个32位优先级寄存器上,把这个32位寄存
    //结果读出来放在tmpreg中!
    tmpmask = (u32)0xFF << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
    //该语句将该通道优先级寄存器在32位当中的第几位开始的八位加上了掩码,以便后面方便写入到该通道优先级寄存器的八位上
    tmpreg &= ~tmpmask;
    //将该通道在32位的优先级寄存器组上的8位清零,其他位也就是其它通道的响应优先级寄存器保证同一相与,不会改变
    tmppriority &= tmpmask;
    //该语句只保留该通道的响应优先级寄存器在32位上的八位,其他的通道响应优先级寄存器全部用0屏蔽,
    tmpreg |= tmppriority;
    //终于现在,tmpreg中该通道响应优先级寄存器的8位全部为0,其他通道响应优先级寄存器的8位(还有三组)全部为原来本身的数而没有改变
    //tmppriority中该通道响应优先级寄存器的8位数据完好,其他通道响应优先级寄存器的8位(还有三组)全部为0
    //两者相'或',该32位tmpreg便是已经包含了本次用户输入的通道中断响应优先级寄存器的8位信息
    NVIC->Priority[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)] = tmpreg;
    //输入到包含该通道中断响应优先级寄存器的32位寄存器中,可以看出,本质上也是一个读--修改--写的过程
    /* Enable the Selected IRQ Channels --------------------------------------*/
    NVIC->Enable[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
      (u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
  }
  else
  {
    /* Disable the Selected IRQ Channels -------------------------------------*/
    NVIC->Disable[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
      (u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
  }
}

关键字:STM32  中断优先级  掩码 引用地址:STM32中断优先级void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

上一篇:STM32固件库
下一篇:STM32管脚重定义

推荐阅读最新更新时间:2026-03-20 12:07

stm32中断优先级(学习随笔)
一、抢占优先级与响应优先级 1.高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 2.抢占优先级相同的中断,高响应优先级中断是不能够打断低优先级响应中断的。 3.抢占优先级相同的的中断,当两个中断同时发生的情况下,哪个响应优先级高哪个先执行。 4.无论是抢占优先级还是响应优先级,优先级数值越小,代表优先级越高。 5.中断向量表就是中断入口地址。 6.在keil编译代码的时候,会根据中断号,将对应的中断服务函数地址写入到Flash地址当中。 7.当有外部中断0事件触发中断的时候,pc(程序计数器)会自动跳转到中断入口地址执行该中断服务函数。 8.设备上电的时候,就会自动触发复位中断。 9.如果外部定义了跟自己相同名字的函
[单片机]
STM32学习之路-中断优先级
优先级的问题可以分为以下情况: 抢占优先级和响应优先级 (1)抢占优先级高的可以打断抢占优先级低的,形成嵌套. (2)抢占优先级相同时,看响应优先级.如果两个中断前后发生的话,后来的中断不能打断前一个中断 只能等,如果两个中断同时发生的话,则响应优先级高的先响应. (3)抢占级别和响应级别都一样时,按照中断的地址来响应,地址低的先响应 这样就解决了优先级的问题. 哪个级别高呢? 0 1 2 ...... STM32共有5组分别是0-4组,还是借那个图 可以看到第4组所有的位都用来设置抢占式优先级了(占先式),所以它能嵌套15个中断,然后自身一个中断,一次类推 0组只有响应式优先级,所以它不能
[单片机]
<font color='red'>STM32</font>学习之路-<font color='red'>中断优先级</font><NIVC(2)>
STM32的NVIC中断优先级
一、STM32 NVIC 中断优先级管理 1,中断: CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。 STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。 在 STM32F103 系列 上面,又只有 60 个(在 107 系列才有 68 个)可屏蔽中断。如下: 2,中断管理方法: 首先,对 STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。 分组配置是在寄存器SCB- A
[单片机]
<font color='red'>STM32</font>的NVIC<font color='red'>中断优先级</font>
STM32】NVIC中断优先级管理(中断向量表)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第9章 中断和事件 Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断(异常)和68个可屏蔽中断,具有16级可编程的中断优先级。而STM32F103系列上面,16个内核中断(异常)不变,而可屏蔽中断只有60个(在107系列才有68个)。 注意一下:CM3的外部中断和STM32的外部中断不是一个概念。CM3:除了内核异常之外的都是外部中断;STM32:外部中断EXTI只有6个
[单片机]
【<font color='red'>STM32</font>】NVIC<font color='red'>中断优先级</font>管理(中断向量表)
STM32中断设置以及中断优先级设置
最近,在做一个智能锁的项目,由于,今天碰到了一个关于中断的问题,因此,又回来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工。问题是什么呢?项目中我用到了一个触摸键盘TTP229,结果在测试键盘时,不能够输入密码?最终,调试出bug就是由于中断优先级的影响。 本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表。(如下图所示) 首先,我们了解一下NVIC是什么,在core_cm0.h文件中的标准库中的NVIC结构体。 其中,我们一般只用到ISER、ICER、IP这3个寄存器。ISER用于使能中断,ICER用来清除中断,IP
[单片机]
<font color='red'>STM32</font>中断设置以及<font color='red'>中断优先级</font>设置
STM32中断优先级设定
在STM32的手册里没有提到关于设置中断优先级的情况,只列给出了中断向量表。根据该向量表可以创建一个中断编号的枚举数据,方便设置优先级及使能等的使用。 先说一下如何设置优先级。 优先级的设置在Cortex-CM3中:异常 - 优先级定义 中有描述;针对优先级的寄存器描述需要查看Cortex-M3编程手册。 可在此处下载手册:http://download.csdn.net/detail/gao_xyz/9780686 1、优先级组的设置 在权威指南 优先级定义中有描述,其优先级由:抢占优先级 和 子优先级组成。 此处需注意:抢占优先级,顾名思义,可以抢占CPU的,当有更高的抢占优先级时,可打断低抢占优先级的
[单片机]
<font color='red'>STM32</font>的<font color='red'>中断优先级</font>设定
STM32 中断优先级(Cortex-M3)
一、概述 STM32(Cortex-M3)中有两个优先级的概念——抢占优先级和响应优先级,其属性编号越小,则优先级别越高。有人把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相
[单片机]
stm32(二) stm32中断优先级的设置
stm32优先级 1.优先级等级: STM32用户能分配的优先级有16级,也就是用优先级寄存器NVIC- IP 的高四位来表示莫个中断的优先级。 2.优先级组: 在STM32中将一个中断的优先级分为:抢占优先级和子优先级。 在进行优先级判断的时候先是比较抢占优先级然后比较子优先级。 在固件库中用变量分别表示抢占优先级和子优先级: NVIC_InitTypeDef.NVIC_IRQChannelPreemptionPriority;(抢占优先级) NVIC_InitTypeDef.NVIC_IRQChannelSubPriority;(子优先级) 优先级组就是对抢占优先级和
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved