1.NVIC中断优先级分组

1.CM3内核支持256个中断, 其中包含16个内核中断和240个外部中断,并且具有256级的可编程中断设置。

2.STM32并没有使用CM3内核全部的东西,而是只用了他其中的一部分。

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

4.STM32F103系列上边,又只有60个可屏蔽中断(在107系列才有68个)

中断管理方法

首先,对STM32中断进行分组,组0-4.同时,对每个中断设置一个抢占优先级和一个响应优先级

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

AIRCR[10:8]

IP bit[7:4]分配情况

分配结果

0

111

0:4

0位抢占优先级,4位响应优先级

1

110

1:3

1位抢占优先级,3位响应优先级

2

101

2:2

2位抢占优先级,2位响应优先级

3

100

3:1

3位抢占优先级,1位响应优先级

4

011

4:0

4位抢占优先级,0位响应优先级

抢占优先级和响应优先级的区别

1.高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。

2.抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

3.抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。

4.如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。

例子

假定设置中断优先级组为2,然后设置中断3(RTC中断)的抢占优先级为2,响应优先级为1。  中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。

那么这3个中断的优先级顺序为:中断7>中断3>中断6。

说明

一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。

中断优先级分组函数

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

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

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

2.中断优先级的设置

中断设置相关寄存器

__IO uint8_t  IP[240]; //中断优先级控制的寄存器组

__IO uint32_t ISER[8]; //中断使能寄存器组

__IO uint32_t ICER[8]; //中断失能寄存器组

__IO uint32_t ISPR[8]; //中断挂起寄存器组

__IO uint32_t ICPR[8]; //中断解挂寄存器组

__IO uint32_t IABR[8]; //中断激活标志位寄存器组

MDK中NVIC寄存器结构体

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

对于每个中断设置优先级

中断优先级控制寄存器组:IP[240]

全称:Interrupt Priority Registers

240个八位寄存器,每个中断使用一个寄存器来确定优先级。

STM32F10x系列一共60个可屏蔽中断,使用IP[59]-IP[0]=

每个IP寄存器的高四位用来设置抢占和响应优先级(根据分组),低四位没有用到

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

中断使能寄存器组:ICER[8] 作用:用来控制使能中断

32位寄存器,每个位控制一个中断的使能。STM32F10x只有60个可屏蔽中断,所以只使用了其中的ICER[0]和ICER[1]

ICER[0]的bit0-bit31分别对应中断0-31.ICER[1]的bit0-27对应中断32-59

配置方法与ISER一样

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

中断挂起控制寄存器组:ISPR[8]  作用:用来挂起中断

中断解挂控制寄存器组:ICPR[8] 作用:用来解挂中断

static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)

static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)

static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn);

终端激活标志位寄存器组:IABR[8]  作用:只读

通过它可以知道当前在执行的中断是哪一个 如果对应位为1,说明该终端正在执行

static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn);

中断参数初始化函数

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

typedef struct
{uint8_t NVIC_IRQChannel; //设置中断通道uint8_t NVIC_IRQChannelPreemptionPriority;//设置响应优先级uint8_t NVIC_IRQChannelSubPriority; //设置抢占优先级FunctionalState NVIC_IRQChannelCmd; //使能/使能
} NVIC_InitTypeDef;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寄存器

3.NVIC总结

中断优先级设置步骤

1.系统运行后先设置中断优先级分组。调用函数

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

整个系统执行过程中,只设置一次中断分组

2.针对每个中断,设置对应的抢占优先级和响应优先级

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

3.如果需要挂起或解挂,查看中断当前工作状态,分别调用相关函数即可。

(资源源于正点原子)

stm32——中断优先级管理相关推荐

  1. STM32中断优先级管理

    中断优先级管理 首先NVIC_Init()设置系统的分组,根据分组可以确定抢占优先级和响应优先级各有几个位.其中分组2,抢占和相应各有两个位,所以各有0-3,4个状态,根据00.01.10.11的来即 ...

  2. 6.STM32中断优先级管理

    1.中断 stm32的芯片通常有90多个以上的中断,具有16级可编程的中断优先级. 2.中断管理方法 1.首先对STM32中断进行分组, 有组0~4.同时对每一个中断设置一个抢占优先级和一个响应优先级 ...

  3. 【STM32】NVIC中断优先级管理(中断向量表)

    STM32F1xx官方资料: <STM32中文参考手册V10>-第9章 中断和事件 Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有25 ...

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

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

  5. 【STM32】NVIC 中断优先级管理,抢占优先级,响应优先级,中断寄存器

    文章目录 抢占优先级和响应优先级 抢占 响应 NVIC 的优先级组 中断寄存器 ISER[8] ICER[8] ISPR[8] ICPR[8] IABR[8] IP[240] 中断优先级设置步骤总结 ...

  6. STM32外部中断与(NVIC)中断优先级管理

    文章目录 1.中断介绍 1.中断的概念 2.中断的产生 3.中断处理的流程 2.STM32内嵌向量中断控制器NVIC 1.NVIC控制器的寄存器 2.STM32中断配置 3.STM32外部中断EXIT ...

  7. stm32中断优先级分组

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

  8. 关于嵌入式学习随笔-6《NVIC中断优先级管理》

    1.中断技术概述 在单片机应用系统中,中断技术主要用于时时检测与控制,也就是要求单片机能感及时地响应中断请求源提出的服务请求,进行快速响应并及时处理,这些工作是由单片机片内的中断系统来实现的.当中断请 ...

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

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

最新文章

  1. yii cgridview 默认的筛选如何做成选择框
  2. MapReduce-流量统计求和-排序-JobMain代码和测试运行
  3. 依赖注入在 dotnet core 中实现与使用:1 基本概念
  4. 狗窝里的小日子- 3 ...
  5. FMI在仿真软件SkyEye中的应用
  6. 初学python之路-day15
  7. C#开发:openfiledialog的使用
  8. 【leetcode】963. Minimum Area Rectangle II
  9. c# Open Source
  10. 机械电子工程用不用学c语言,机械电子工程到底学什么 毕业以后能干什么
  11. 废粉盒在哪里_复印机提示“废粉盒满”“请及时更换废粉盒”
  12. 直播视频分辨率码率参考设置
  13. 硬盘扇区数据结构分析
  14. python+selenium环境安装及配置以及示例
  15. ubuntu20.04安装到u盘+配置美化
  16. 敏捷基本概念——三大角色五大会议
  17. 教你用 python 制作一张五彩斑斓的黑
  18. 华东交通大学2021年ACM“双基”程序设计竞赛 D-宝石个人解答(C+python)
  19. 删除Windows11和WIN10桌面图标小箭头
  20. kingston 101 金鼠U 盘 密码盘 显示不了 问题 [转] 留做记忆

热门文章

  1. 怎么保护MacBook的电池?Mac电池最大充电限制工具AlDente Pro来帮您
  2. 通过虚拟机模拟linux操作系统
  3. JavaGUI:多功能计算器(五)--Swing实现双语数据包+菜单切换(完整源码+EXE下载)
  4. 通过setTimeout 实现 setInterval
  5. 文献阅读-FCER1G与透明细胞癌中巨噬细胞的浸润相关并且通过调节肿瘤免疫产生不良预后
  6. 新型冠状病毒的信息汇总与分析 (形态,分类,基因组,进化,变异,流行病学)
  7. php标签打印机,PHP连接打印机
  8. 2021天梯赛L1-079 天梯赛的善良 题解
  9. Socket在iOS客户端上的简单实现 - 利用GCAsyncSocket框架
  10. CPU频率与内存频率的关系