步骤一  设置中断分组

STM32中断规则

中断优先级分为抢占式优先级和子优先级。对于每一个中断需事先设置其抢占式优先级和子优先级。

抢占式优先级级别高的中断可以打断抢占式优先级级别地的中断。抢占式优先级级别相同时,互相均不能打断对方中断执行,且同时产生两个中断时,按照中断的子优先级顺序执行中断。

例子:中断2设置抢占式优先级为1,子优先级为2。中断3的抢占式优先级为1子优先级为1.中断8的抢占式优先级为1,子优先级为3

此时中断优先级:中断2>中断8>中断3

具体的 当中断3执行过程中,中断2或中断8任意一个产生,均可以使中断3挂起而先执行后产生的中断。另外当中断2和中断8同时产生的时候,优先执行中断2中断2执行完毕后执行中断8。

中断分组的实现

COM3内核中存在设置中断优先级分组的寄存器(IP[240]:)

IP寄存器有240个8Bbit的寄存器。STM32只是使用60个。每个寄存器都可以设置特定的一个中断的抢占式优先级和子优先级的级别。比如中断2,其对应的IP寄存器的值可能为      01 10  0000 或 1 010  0000。STM32只是使用其高四位,另外两种可能的设置方法取决于中断分组设置。中断分组的设置由SCB->IRCR寄存器(bit10~8)设置决定。

中断分组可分为5组:当SCB->IRCR寄存器(bit10~8)数分别为111、110、101、011、001时  ,不同类优先级能表示位数比:抢占式优先级:子优先级=0:4 or 1:3 or 2:2 or 3:1 or 4:0

分组使用的函数

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) //NVIC_PriorityGroup的值为NVIC_PriorityGroup_X ,其中X=0~4,分别代表不同中断分组情况
{assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

步骤二  中断初始化

对中断初始化结构体相关赋值

中断初始化的结构体

typedef struct
{uint8_t NVIC_IRQChannel;                    //要设置的中断号 uint8_t NVIC_IRQChannelPreemptionPriority;  //抢占式优先级级别uint8_t NVIC_IRQChannelSubPriority;         //子优先级级别FunctionalState NVIC_IRQChannelCmd;         //中断使能
} NVIC_InitTypeDef;

中断初始化

中断初始化函数

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;tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;tmppriority = tmppriority << 0x04;NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;/* Enable the Selected IRQ Channels --------------------------------------*/NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);}else{/* Disable the Selected IRQ Channels -------------------------------------*/NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);}
}

根据STM32中断规则实现多级中断嵌套

参考

《Cortex-M3权威指南》

《STM32F1开发指南-库函数版本》

STM32----中断优先级设置相关推荐

  1. STM32 中断优先级设置或配置

    STM32F103XXX 中断优先级设置或配置 STM32 中断系统系统是非常复杂的.如果是搞不清楚计算机底层硬件或计算机工作原理的人,是很难搞懂中断系统.作为普通程序员只要会使用也未尝不可呀!我认为 ...

  2. stm32中断优先级分组

    STM32中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念--抢占式优先级和响应优先级,有人把响应优先级称作' ...

  3. STM32中断优先级的管理(NVIC)

    STM32 NVIC 中断优先级管理 CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置. STM32 并没有使用 CM3 内核的 ...

  4. stm32——中断优先级管理

    1.NVIC中断优先级分组 1.CM3内核支持256个中断, 其中包含16个内核中断和240个外部中断,并且具有256级的可编程中断设置. 2.STM32并没有使用CM3内核全部的东西,而是只用了他其 ...

  5. STM32——中断优先级分组

    一.SCB-AIRCR寄存器 首先,对STM32中断进行分组,0--4.同时,每个中断设置一个抢占优先级和一个响应优先级. 1. 高抢占可以打断正在执行的低抢占 2. 抢占相等,高响应不能打断低响应 ...

  6. STM32中断优先级概念

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

  7. STM32中断优先级、FreeRTOS中断优先级,任务优先级

    STM32中断优先级 NVIC(Nested Vectored Interrupt Controller)嵌套向量中断控制器,管理着整个芯片与中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设.各 ...

  8. STM32中断优先级NVIC

    参考正点原子视频 为什么STM32需要中断 就拿你去饭馆吃饭为例. 使用中断就是饭做好了,服务员会为你端上来,然后你开始吃饭.端上来之前你爱干啥就干啥. 不使用中断,你需要一次一次去问服务员饭做好了没 ...

  9. STM32-NVIC中断优先级分组-中断优先级设置

    STM32-中断优先级管理NVIC 1.NVIC中断优先级分组 NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器.STM32F中文参考手册中 ...

  10. STM32中断优先级彻底讲解

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

最新文章

  1. 《低功耗蓝牙开发权威指南》——第2章基本概念
  2. mysql datetime 默认值_老大让我整理下公司内部MySQL使用规范,分享给大家
  3. 实验二:网络嗅探与欺骗
  4. Couchbase 介绍 - 更好的 Cache 系统
  5. 如何将SP1集成到Office 2007安装包
  6. verilog中的代码使用
  7. Snuke Festival(二分法)
  8. 世界最厉害的14位程序员,你认识几个?
  9. python xycoords_python可视化节点关系(三):matplotlib(2)鼠标交互
  10. python核心编程笔记chapter 3
  11. Java键盘录入 Scanner
  12. linux 进程内存分布,linux C++ 的内存分布情况
  13. 采用多种方式实现词频统计
  14. linux 添加接口永久,在Linux中,配置虚拟网络接口
  15. 《Elasticsearch 源码解析与优化实战》样章-第 6 章 数据模型
  16. 在实际应用中,用计算机作为控制器时,最大的优越性是( ),在实际应用中,用计算机作为控制器时,最大的优越性是( )。...
  17. ubantu下面U盘无法识别
  18. 计算机网络 全集视频
  19. cadence 常见pcb电阻_CADENCE从原理图到PCB步骤 精
  20. 浙江大学计算机科学与技术博士培养研究方向,浙江大学计算机科学技术学院博士研究生导师简介:王跃明...

热门文章

  1. echarts自适应大小或改变窗体大小自适应大小与浏览器最大最小化事件
  2. 按键精灵调用python插件_【Python 教程】使用 Python 和大漠插件进行文字识别
  3. 山西省阳泉市谷歌高清卫星地图下载
  4. flash与服务端的交互方法
  5. PBR以及在Disney和UE渲染模型中的使用
  6. Java面向对象 ----多态
  7. flutter 打开办公文件 pdf ppt xlsx 等等(仅Android)
  8. 使用Optional处理null
  9. 用Python实现跳一跳自动跳跃
  10. C语言实验报告册-20163a,C语言实验报告册20163a-资源下载人人文库网