STM32简记之NVIC和外部中断
STM32F4——NVIC中断优先级及外部中断

STM32F4——NVIC中断优先级及外部中断NVIC 中断优先级一、简介:CM4 内核可以支持256 个中断,包括16 个内核中断和240 个外部中断,256 级的可编程中断设置。
对于STM32F4 没有用到CM4 内核的所有东西,只是用到了一部分,对于STM32F40 和41 系列共有92 个中断,其中有10 个内核中断和82 个可屏蔽中断,常用的为82 个可屏蔽中断。
二、相关寄存器:ISER[8]中断使能寄存器组,用来使能中断,每一位控制一个中断,由于上面已经说明了控制82 个可屏蔽的中断,因此利用ISER[0~2]这三个32 位寄存器就够了。
一下的几个寄存器同理。
ICER[8]中断除能寄存器组,用来消除中断。
ISPR[8]中断挂起控制寄存器组,用来挂起中断。
ICPR[8]中断解挂控制寄存器组,用来解除挂起。
IABR[8]中断激活标志寄存器组,对应位如果为1 则表示中断正在被执行。
IP[240]中断优先级控制寄存器组,它是用来设置中断优先级的。
我们只用到了IP[0]~IP[81],每个寄存器只用到了高4 位,这4 位又用来设置抢占优先级和响应优先级(有关抢占优先级和响应优先级后面会介绍到),而对于抢占优先级和响应优先级各占多少位则由AIRCR 寄存器控制,相关设置如下图所示:关于抢占优先级和响应优先级的理解,可以将它们简单的理解为两个级别,抢占优先级的级别要比响应优先级的级别高,简单的理解为一个为长辈的一个为晚辈的,晚辈要让着长辈,因此抢占优先级的中断可以打断响应优先级的中断,而同级别的中断就得有个先来后到的了,先来的先执行。
三、相关库函数应用1、中断优先级分组函数:voidNVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup),用来设置设置中断优。
stm32库函数学习篇---NVIC与外部中断

stm32库函数学习篇---NVIC与外部中断实现功能:外部中断线0(PA0)与线15(PA15)分别连接到两个按钮,一个按钮用于产生上升沿,另一个用于产生下降沿,两个中断函数里均对PA8口连接的led灯取反,同时PD2连接的led灯随意延时取反指示程序运行。
这次我用了官方提供的例程来构建自己的工程,这样可以省下不少时间,而且减少了出错率,调试起来容易多了。
首先是stm32中断与外部中断的概念。
ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。
STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。
STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。
68个通道的优先级控制字至少构成17个32位的优先级寄存器。
4bit的中断优先级可以分成2部分,从高位看,前面定义的是抢占式优先级,后面是响应优先级。
4bit一共可以分成5组。
第0组:所有4bit用于指定响应优先级;第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
1、当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
stm32外部中断实验报告-STM32实例外部中断实验

stm32外部中断实验报告_STM32实例外部中断实验上⼀篇⽂章我们介绍了 STM32F10x 的中断,这次我们就来学习下外部中断。
本⽂中要实现的功能与按键实验⼀样,即通过按键控制LED,只不过这⾥采⽤外部中断⽅式进⾏控制。
学习时可以参考《STM32F10x 中⽂参考⼿册》-9 中断和事件章节。
外部中断介绍EXTI 简介STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事件/中断请求的边沿检测器。
EXTI 的每根输⼊线都可单独进⾏配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独⽴地被屏蔽。
EXTI 结构框图EXTI 框图包含了 EXTI 最核⼼内容,掌握了此框图,对 EXTI 就有⼀个全局的把握,在编程的时候思路就⾮常清晰。
从图中可以看到,有很多信号线上都有标号 9 样的“20”字样,这个表⽰在控制器内部类似的信号线路有 20 个,这与 STM32F10x 的 EXTI 总共有20 个中断/事件线是吻合的。
因此我们只需要理解其中⼀个的原理,其他的 19个线路原理都是⼀样的。
EXTI 分为两⼤部分功能,⼀个产⽣中断,另⼀个产⽣事件,这两个功能从硬件上就有所差别,这个在框图中也有体现。
从图中标号 3 的位置处就分出了两条线路,⼀条是 3-4-5 ⽤于产⽣中断,另⼀条是 3-6-7-8⽤于产⽣事件。
下⾯我们就来介绍下这两条线路:(1)⾸先看下产⽣中断的这条线路(1-2-3-4-5)1.标号 1 为输⼊线,EXTI 控制器有 20 个中断/事件输⼊线,这些输⼊线可以通过寄存器设置为任意⼀个 GPIO,也可以是⼀些外设的事件,这部分内容我们会在后⾯专门讲解。
输⼊线⼀般是存在电平变化的信号。
2.边沿检测电路,EXTI 可以对触发⽅式进⾏选择,通过上升沿触发选择寄存器和下降沿触发选择寄存器对应位的设置来控制信号触发。
边沿检测电路以输⼊线作为信号输⼊端,如果检测到有边沿跳变就输出有效信号 1 给红⾊框 3 电路,否则输出⽆效信号 0。
学习笔记:STM32外部中断

学习笔记:STM32的外部中断(库函数)在为某引脚配置中断前,同样要先初始化该引脚的配置,用GPIO_Init()函数初始化,不同的是,由于是外部中断,所以输入模式要设置上拉输入。
假设外部中断引脚为PE.2,则该引脚初始化配置的程序为:IOIO口作为外部中断输入是复用功能,因此在此基础上还需要对另一个时钟信号进行初始化。
这是IO口作为复用功能时需要进行初始化的时钟,另外,要注意的是,做一般功能使用的IO口只需要调用第一个函数即可,而作为复用功能的IO口,两个函数都要调用,两者缺一不可,否则不能正常使用。
STM32的每个IO都可以作为外部中断的中断输入口,这点也是STM32的强大之处。
STM32F103的中断控制器支持19个外部中断/事件请求。
每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
STM32F103的19个外部中断为:线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
从上面可以看出,STM32供IO口使用的中断线只有16个,但是STM32的IO口却远远不止16个,那么STM32是怎么把16个中断线和IO口一一对应起来的呢?于是STM32就这样设计,GPIO的管脚GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线0~15。
这样每个中断线对应了最多7个IO口,以线0为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
而中断线每次只能连接到1个IO口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO上了。
下面我们看看GPIO跟中断线的映射关系图:在库函数中,配置GPIO与中断线的映射关系是通过函数GPIO_EXTILineConfig()来实现的:void GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource)该函数将端口与中断线映射起来,使用示例是:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);将中断线2与GPIOE映射起来,那么很显然是GPIOE.2与EXTI2中断线连接了。
STM32 中断与嵌套NVIC 快速入门

STM32 中断与嵌套NVIC 快速入门*//====================================================// STM32 中断与嵌套NVIC 快速入门// netjob 2008-8-1//====================================================STM32中断与嵌套NVIC快速入门我也是靠看这本书才弄懂的:Cortex-M3 权威指南Joseph Yiu 著宋岩译其实很简单。
//CM3 有最多240个中断(通常外部中断写作IRQs),就是软件上说的 IRQ CHANAELx(中断通道号x) 每个中断有自己的可编程的中断优先级【有唯一对应的中断优先级寄存器】.由于CM3支持硬件中断嵌套,所以可以有 256 级的可编程优先级和 256级中断嵌套【书上称:抢占(preempt)优先级】所以大家可以设:IRQ CHANAEL 0 通道 = 2 中断优先级 WWDG 窗口定时器中断IRQ CHANAEL 1 通道 = 0 中断优先级 PVD 联到EXTI的电源电压检测(PVD)中断IRQ CHANAEL 3 通道 = 255 中断优先级 RTC 实时时钟(RTC)全局中断IRQ CHANAEL 6 通道 = 10 中断优先级 EXTI0 EXTI线0中断.....IRQ CHANAEL 239 通道 = (0<x<255) 中断优先级 ..这个实在是太恐怖了!是的,其实CM3 并没有这样做。
实在的芯片例如STM32等就只有设计来可用才64级可编程优先级和8级中断嵌套。
对 64级中断就是说:( INT0 到 INT63)这个大家比较好理解,其它的64···239就不用了。
IRQ CHANAEL 0。
IRQ CHANAEL 63而8级中断嵌套这又是何解呢?是这样的,上面说一个【中断】对应一个【中断优先级寄存器】,而这个寄存器是 8 位的。
STM32学习笔记之二_中断

STM32中中断的理解一、什么是中断中断是指在计算机执行程序的过程中,当出现异常情况或者特殊请求时,计算机停止现行的程序的运行,转而对这些异常处理或者特殊请求的处理,处理结束后再返回到现行程序的中断处,继续执行原程序。
中断处理过程:(1)保护被中断进程现场。
为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态字PSW和程序计数器PC等的值。
(2)分析中断原因,转去执行相应的中断处理程序。
在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。
(3)恢复被中断进程的现场,CPU继续执行原来被中断的进程。
二、什么是中断服务程序处理中断事件的程序被称为中断服务程序。
三、什么是中断向量中断向量就是中断服务程序的入口地址。
四、什么是中断向量号中断号也叫中断类型号,或者中断请求号。
中断是指在CPU运行期间,被CPU内部或外部事件所打断、暂停当前程序的执行而转去执行一段特定的处理内部或外部时间程序的过程。
外部设备进行I/O操作时,会随机产生中断请求信号。
这个信号中会有特定的标志,使计算机能够判断是哪个设备提出中断请求,这个信号就叫做中断号。
五、什么是中断向量地址中断向量地址就是内存中存放中断服务程序入口地址的地址。
六、什么是中断向量表CPU是根据中断向量号获取中断向量值,即对应中断服务程序的入口地址值。
因此为了让CPU由中断向量号查找到对应的中断向量,就需要在内存中建立一张查询表,即中断向量表。
七、STM32中中断发生时系统找到对应中断服务执行的过程(1)根据中断设发生备确定对应的中断向量号。
(3)执行中断服务程序。
以ALIENTEK Mini STM32开发板范例代码中的定时器中断实验为例来说明。
(1)根据中断设发生备确定对应的中断向量号。
在main.c中:TIM3_Int_Init(4999,7199);在timer.c中:void TIM3_Int_Init(u16 arr,u16 psc){...NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断号...}在stm32f10x.h中:typedef enum IRQn{...TIM3_IRQn = 29, /*!< TIM3 global Interrupt */...}根据以上三个文件可以确定,定时器TIM3对应的中断向量号为TIM3_IRQn,而TIM3_IRQn = 29,所以,定时器TIM3对应的中断向量号为29。
stm32中的中断嵌套控制器

stm32中的中断嵌套控制器Stm32中断嵌套控制器总结(参考了STM32自学笔记)NVIC 全称为Nest Vector Interrupt Controller,人们一般称之为“嵌套中断向量控制器”同这个SysTick定时器一样,NVIC属于ARM Cortex –M3内核的内部设备之一,与基于此内核的控制器并无直接联系,就是说任何一款基于ARM Cortex –M3内核的微控制器都有NVIC。
NVIC的作用如其名——是用来管理中断嵌套的,既然提及嵌套一词,先得清楚一下中断的一些概念。
中断响应:当某个中断来临的时候,会将某个中断标志位置位,当CPU查询到响应的中断的时候,就会自动跳转到相应的中断向量表中去,从而执行响应的中断函数。
中断优先级:优先级又分为两种:查询优先级和执行优先级这里可能初学者不太好理解,但是学过51系列单片机的朋友应该不会那样的陌生。
51 单片机中有个中断优先级控制寄存器IP ,可以设某一中断为高优先级中断或者是低优先级的中断,这就是所谓的执行优先级,但是当我们把外部中断0和外部中断1都设为高优先级中断的时候,而这两个中断又同时发生的时候,我们应该执行哪个中断呢,这就取决于中断向量表中中断向量的位置了。
如51单片机中的中断向量表中顺序如下:外部中断0 0x03T0溢出中断0x0b外部中断1 0x13T1溢出中断0x1b串行口中断0x23上表中的顺序,也就是查询优先级了,所以应该是外部中断0先执行了而在STM32中又多出了点名堂:它把执行优先级又分成了先占优先级和次占优先级(1)拥有较高先占优先级的中断可以打断先占优先级较低的中断(类似于前面所说的执行优先级)(2)如先占优先级相同,则看次占优先级谁高,先执行谁。
(3)如先占优先级相同,次占优先级也相同,则执行查询优先级较高的。
(4)无论任何时刻,次占优先级,查询优先级都不会造成中断嵌套,也就是说中断嵌套都是由先占优先级决定的。
STM32外部中断以及中断优先级

外部中断(zhōngduàn)的初始化过程:1.初始化IO为输入(shūrù)(可以设置上拉,下拉,浮空)2.开启(kāiqǐ)IO复用(fù yònɡ)时钟3.开启(kāiqǐ)与该IO相对的线上(详解下)4.配置NVIC,使能中断5.编写中断服务函数外部中断:Stm32中总共有19个外部中断包括:线0-15:IO输入中断(每条线上最多有7个IO,如GPIOA~GPIOG,但是每一条线每次只允许同时连接到一个IO)线16:PVD线17:RTC线18:USB关于(guānyú)优先级:CM3中内核(nèi hé)支持256个中断(zhōngduàn)(16个内核(nèi hé)+240外部(wàibù))和可编程256级中断优先级的设置Stm32目前(mùqián)支持84个中断(zhōngduàn)(16个内核(nèi hé)+68个外部(wàibù),注:不是(bù shi)指68个外部中断),16级可编程优先级(优先级设置寄存器中使用了4位)注意:其中(qízhōng)外部中断5-9和中断(zhōngduàn)10-15向量存放(cúnfàng)在一起优先级:数值(shùzí)低的优先级要高于数值高的!!!!!!上电复位后,系统默认(mòrèn)使用的是组0;一个系统只能使用一组优先级组,不可使用多个,优先级的设置不能超过组的范围,否则会产生不可预计的错误1.高抢先级的中断可以打断低优先级的中断响应,构成中断嵌套2.相同抢先级的中断不可以构成嵌套,系统会优先响应子优先级高的3.当2(n)个相同抢先优先级和相同子优先级的中断(zhōngduàn)出现,STM32首先响应中断通道所对应的中断向量地址(dìzhǐ)低的那个中断4.0号抢先优先级的中断,可以(kěyǐ)打断任何中断抢先优先级为非0号的中断(zhōngduàn);1号抢先优先级的中断(zhōngduàn),可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32简记之NVIC和外部中断
Posted on 2013/06/20 by M
1
之前用stm32也就是用些内部资源或者耍耍前辈留下来的库,最近在写SPWM波的时候才知道自己对于中断这方面的欠缺,更暴漏了我学东西不打基础的恶习,所以打算重新整理下资料,原因有二:1、通过这种方式能加深记忆。
2、方便以后查看。
因为只追求自己看得懂所以总结的比较简洁,所以称之为简记。
步骤如下:
1、系统初始化,如系统时钟初始化,使之进入72MHZ主频;
程序启动时已调用SystemInit()函数将主频改为72MHZ。
2、 GPIO配置,务必注意打开GPIO时钟时,一定打开AFIO时钟。
在使用引脚的重映射功能和外部中断时需要使用AFIO时钟。
3、 EXTI配置,在这里配置需要选择哪个引脚作为中断引脚。
EXTI_InitTypeDef EXTI_InitStructure;
定义一个EXTI初始化结构体
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
设置中断线:EXTIL_Line1为中断线1
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
模式:这里有两个模式,一个是中断模式,也就是事件,具体区别如下:
“事件:是表示检测有一某件触发事件发生了。
中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中。
事件可以触发中断,也可以不触发中断有可能被更优先的中断屏蔽,事件不会事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒).事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号”
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
设置触发中断方式:
EXTI_Trigger_Falling 设置输入线路下降沿为中断请求
EXTI_Trigger_Rising 设置输入线路上升沿为中断请求
EXTI_Trigger_Rising_Falling 设置输入线路上升沿和下降沿为中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
定义选择中断线的新状态
EXTI_Init(&EXTI_InitStructure);
根据EXTI_InitStructure中指定的参数初始化外设 EXTI 寄存器。
4、NVIC配置,这也是比单片机多出来的部分,我们必须把NVIC中对应的通道使能,并且设置优先级别。
NVIC(嵌套中断向量控制器),用于管理中断优先级。
比如在英语四级考试期间,饭堂特殊情况,监考老师优先打饭(抢占优先级),但是监考老师与监考老师之间也要排队(响应优先级),也就是说监考老师可以直接来抢断学生打饭的位置,但是监考老师与监考老师之间必须排队,不能抢断。
STM32中指定优先级的寄存器为4位,其定义如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
可以通过void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)来设定。
例如:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) //设置位第1组
配置外部中断1优先级:
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn ; //配置中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //改中断NVIC的新状态
NVIC_Init( &NVIC_InitStructure );//按照结构体内容定义该通道NVIC
5、编写中断函数。
在启动文件(startup_stm32f10x_hd.s)中找到中断函数名称,将其加在stm32f10x_it.c内,例如:
void EXTI2_IRQHandler(void)
{
delay_init();
delay_ms(580);
flag = !flag;
if ( flag )
{
GPIO_SetBits(GPIOE, GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
最后一句EXTI_ClearITPendingBit(EXTI_Line2)用于清除中断标志。