stm32中断优先级概述

一:综述

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

二:优先级判断

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)中断优先级设置

注意:NVIC能配置的是16种中断向量,而不是16个,当工程中有超过16个中断向量时,必然有两个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。

五:启动所需GPIOn_Pin及AFIO的RCC时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,RCC_APB2Periph_AFIO,ENABLE);

注意:千万别忘记启动RCC_APB2Periph_AFIO!否则管脚只能做普通高低电平来用。当把GPIO用作EXTI外部中断或使用重映射功能的时候,必须开启AFIO时钟,而在使用默认复用功能的时候,就不必开启AFIO时钟了。

六:实例

NVIC_InitTypeDef    NVIC_InitStructure;    //定义中断初始化类型结构体变量

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   //配置优先级分组1 2个两个抢占优先级 8个亚优先级

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;  //开口外部中断0

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置0号抢占式优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //亚优先级配置为0号

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道

NVIC_Init(&NVIC_InitStructure);       //对外部中断0进行初始化配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;  //开口外部中断5到9

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //亚优先级配置为1号

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道

NVIC_Init(&NVIC_InitStructure);       //对外部中断0进行初始化配置

NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;  //ADC1中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //亚优先级配置为1号

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道

NVIC_Init(&NVIC_InitStructure);       //对外部中断0进行初始化配置

从上面的配置来看,外部中断0的优先级最高,可以打断ADC和外部5到9的中断,也就说可以嵌套发生,当ADC中断和外部5到9中断同时发生时,它们的抢占优先级别相同,亚优先级别也相同,因为ADC1硬件排在更靠前,则先发生ADC中断,若是两者任何一个中断正在执行,则等此中断执行完,再去执行另一个中断。

NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn表示要配置的为EXTI的第5~9线的中断向量,也就是说EXTI5~EXTI9线是使用同一个中断向量的。这些可写入的参数可以在stm32f10x.h文件中查找到。

stm32 中断处理级别_stm32中断优先级概述相关推荐

  1. 【STM32】中断和中断优先级理解

    在嵌入式系统开发过程中,不可避免的会和"中断"打交道.很多初学者对中断的理解不深,往往是看到中断绕着走.其实不然,费点时间搞懂中断能解决不少问题. 中断英文"Interr ...

  2. 【STM32】RTC实时时钟概述、寄存器、库函数(RTC一般步骤)

    STM32F1xx官方资料: <STM32中文参考手册V10>-第16章  实时时钟(RTC) RTC实时时钟 RTC实时时钟简介 实时时钟是一个独立的定时器.RTC模块拥有一组连续计数的 ...

  3. STM32——中断概览(中断优先级)

    中断是指计算机运行过程中,出现某些意外情况需要主机干预时,机器能够自动停止正在运行的程序并转入处理新情况的程序,处理完毕后有返回原来被暂停的程序继续运行 STM32的中断和异常 (1)对于异常和外部中 ...

  4. stm32正常运行流程图_STM32学习笔记(超详细整理144个问题)

    1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备: 2.Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为s ...

  5. stm32正常运行流程图_stm32学习笔记之问题总结

    1. SYSCLK时钟源有三个来源:HSI RC.HSE OSC.PLL; 2. MCO[2:0]可以提供4源不同的时钟同步信号; 3. GPIO口貌似有两个反向串联的二极管用作钳位二极管; 4. 总 ...

  6. stm32正常运行流程图_STM32单片机学习笔记(超详细整理143个问题,学习必看)...

    原标题:STM32单片机学习笔记(超详细整理143个问题,学习必看) 1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f ...

  7. stm32正常运行流程图_stm32学习基本知识点

    1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为st ...

  8. STM32入门级别代码:对步进电机的控制(原理+亲测+对代码及原理讲解)

    动,首先呢,我再次声明一下呢我本身专业没有开有关STM32的课程,是我花费近3个月 Hello,小伙伴们,大家好.你现在是不是很急切的想找一个拿来直接用的代码来完成手底下的设计,哈哈哈,先别慌慌吗,别 ...

  9. stm32 机械周期_stm32定时器周期计算

    stm32定时器时间计算 stm32 定时器时间计算 STM32 定时器的工作原理 STM32 之所以能够实现定时,是单片机内部在计 数脉冲(来自晶振) T=1/F (F 为频率) 例如:我们以 51 ...

最新文章

  1. 时髦的互联网公司都在用什么技术?
  2. 一张图,一棵大树,六种人, 六载人生 ~
  3. matlab仿真疏散,276基于matlab的疏散仿真程序简介
  4. 游历校园 [COGS 614] [欧拉图]
  5. 【原创】系统分析师--任重而道远
  6. 骨牌覆盖(51Nod-1031)
  7. 单通道GNSS模拟器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. 新美国安全中心报告:中国在量子技术中占据了重要优势
  9. map转换成JSON
  10. log4j2配置文件详解
  11. Android 反编译修改包名、重新签名、更换app名称
  12. Centos7修改IP地址
  13. 第一章 FreeSWITCH 的架构
  14. 微信小程序 自定义标题栏
  15. 有关网络安全基础知识
  16. FTP+Cyberduck+服务器部署项目+pm2
  17. 4g+uim卡是什么卡_你知道SIM卡是什么吗?
  18. 渗透测试学习之日常打靶THE PLANETS: EARTH
  19. CompareTo()和Compare()的用法
  20. comsol圆柱形永磁体_基于COMSOL Multiphysics的磁场仿真分析

热门文章

  1. Python requests爬取淘宝商品信息
  2. Linux启动引导参数grub
  3. 如何分析夹杂在金属液中的微小气泡
  4. SpringAOP中@within和@annotation的区别
  5. 职业规划要看的书单。
  6. (void (*Visit)(const ElemType ))
  7. 大二第二次月赛--买水果
  8. QQ邮箱设置企业邮箱别名邮箱
  9. quilt的常用使用命令解释
  10. AD域帐号批量查询锁定帐号,批量解锁域帐号