STM32F407 NVIC 中断优先级管理 个人笔记
内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC)
设置中断向量的优先级并使能。
响应优先级& 抢占优先级
抢占优先级:一个中断A还在处理时,另一个中断B发生,B能否先处理?    答:如果B抢占优先级高就行。
响应优先级:抢占优先级相同时,中断A和中断B同时发生时,先处理哪个?     答:响应优先级高的哪个。
而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
中断优先级组
是指在寄存器SCB->AIRCR中,配置:
4个位当中,几位是抢占优先级,几位是响应优先级

注意:设置好后不要再改了!以免造成混乱
相关库函数
NVIC相关的库函数在FWLIB的misc.c中
中断优先级分组函数
(一般只调用一次!)
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
例如:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
中断初始化函数
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)  
其中 NVIC_InitTypeDef 是一个结构体,我们可以看看结构体的成员变量:
typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
NVIC_InitTypeDef 结构体中间有三个成员变量,这三个成员变量的作用是:
NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在 stm32f4xx.h 中定义的枚举类 型 IRQn
的成员变量中可以找到每个中断对应的名字。例如串口 1 对应 USART1_IRQn。
NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。
NVIC_IRQChannelSubPriority:定义这个中断的响应优先级别。
NVIC_IRQChannelCmd:该中断通道是否使能。
比如我们要使能串口 1 的中断,同时设置抢占优先级为 1,响应优先级位 2,初始化的方法是:
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 寄存器
编程步骤
最简单的应用中,只要
- 设置分组
 - 外设中断使能(函数名在外设的头文件中有)
 - 初始化
 - 写中断服务函数(函数名在setup巴拉巴拉中定义)
即可: 
//1.
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //可能在主函数
//2.
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);             //可能在初始化函数中
//3.
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 寄存器
//4.中断服务函数
void USART1_IRQHandler(void)
{
}
上面是一些常用的东西,下面是其他一些有的没的
支持的中断数量
- CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
 - STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。
STM32F40xx/STM32F41xx总共有92个中断。
STM32F42xx/STM32F43xx则总共有96个中断 - STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断和82个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这82个可屏蔽中断。
 
中断设置相关的寄存器
__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]; //中断激活标志位寄存器组
中断优先级控制寄存器组:IP[240]
Interrupt Priority Registers
240个8位寄存器
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
例如:NVIC_Init(&NVIC_InitStructure);
中断使能寄存器组:ISER[8]
8个32位寄存器(CM4内核支持256个中断)
每个位控制一个中断的使能
STM32F40x只有82个可屏蔽中断,所以只使用了其中的ISER[0]~ISER[2]。
ISER[0]的bit031分别对应中断0-31
ISER[1]的bit0-27对应中断32-63;
ISER[2]的bit0-17对应中断64~81;
STM32F407 NVIC 中断优先级管理 个人笔记的更多相关文章
- 【STM32】NVIC中断优先级管理
		
(1)NVIC中断优先级分组 1>,CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且 具有256级的可编程中断设置. 2>,STM32F4并没有使用CM4的内核 ...
 - stm32中断优先级管理与外部中断编程
		
stm32中断优先级管理与外部中断编程 中断优先级管理 外部中断编程 官方示例程序 exti.h #ifndef __EXTI_H #define __EXIT_H #include "sy ...
 - C++内存管理学习笔记(5)
		
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
 - C++内存管理学习笔记(6)
		
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
 - C++内存管理学习笔记(7)
		
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
 - Docker Image管理学习笔记,ZT
		
Docker Image管理学习笔记 http://blog.csdn.net/junjun16818/article/details/38423391
 - Linux内存管理学习笔记 转
		
https://yq.aliyun.com/articles/11192?spm=0.0.0.0.hq1MsD 随着要维护的服务器增多,遇到的各种稀奇古怪的问题也会增多,要想彻底解决这些“小”问题往往 ...
 - JVM自动内存管理学习笔记
		
对于使用 C.C++ 的程序员来说,在内存管理领域,他们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任.对于 Java 程 ...
 - Linux文件与目录管理(学习笔记)
		
本笔记为<鸟哥linux私房菜>第六章学习笔记 一.目录与路径 相对路径与绝对路径 绝对路径:一定由根目录 / 写起 正确度比较好 相对路径:不是由 / 写起 ...
 
随机推荐
- dubbo中Hessian方法重载问题处理
			
dubbo中Hessian方法重载,报出如下错误信息: 十一月 , :: 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Ser ...
 - poj2282The Counting Problem(组合)
			
链接 计算0-9每一个数字出现的次数 逐位进行处理 对于每一位取几时依次算下组合的情况 注意0的情况需要特殊处理一下 因为0000 00 这样都是等于0的 前面的几位是多余的 #include < ...
 - PHP设计模式 原型模式(Prototype)
			
定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...
 - 洛谷P2762 太空飞行计划问题(最大权闭合图)
			
题意 有$m$个实验,$n$中器材,每个实验需要使用一些器材 每个实验有收入,每个器材有花费 最大化收入 - 花费 Sol 最大权闭合图的经典应用 从$S$向每个实验连流量为该实验收入的边 从每个器材 ...
 - 【经验总结】VS2010下建立MFC程序
			
孙鑫的MFC教学视频非常不错,但是由于视频中孙鑫老师采用VC6.0版本,而现在 许多人都转向了使用VS,VS为我们生成了许多不需要的代码,这也导致在这节课的学习编程中总是遇到一些困难.那么,如何去掉这 ...
 - 响应式布局 max-device-width 与 max-width 的区别
			
闲来没事,研究了一下多屏适配和响应式布局的 CSS. 第一种写法 @media screen and (max-device-width: 320px) { } @media screen and ( ...
 - Load average in Linux的精确含义
			
Man 上的解释: load average System load averages is the average number of processes that are either in a ...
 - mac下elasticsearch安装部署
			
下载elaticsearch集成包 优势:封装了对插件的支持,且安装方式较简单 地址:https://github.com/medcl/elasticsearch-rtf 解压到指定目录后,获取该集成 ...
 - 基于jmeter和shell的接口性能自动化
			
基于jmeter和shell的接口性能自动化 1. 总体需求 由于性能测试中涉及的查询接口多,版本迭代频繁,版本更新后自动跑一轮查询业务的性能,可以及时发现一些开发修复bug触发的非预期的bug,利用 ...
 - DHCP server工作原理
			
1.CLIENT首先发出广播的DHCPDISCOVER报文,广播的目的是让DHCP SERVER能够收到这个请求报文.在这个报文中,CLIENT可以在"选项"字段中加入" ...