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号的中断;……;构成中断嵌套。
STM32学习笔记(2):外部中断的使用
STM32学习笔记(2):外部中断的使用2011年3月20日外部中断中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂。
今天就将来探讨一下关于STM32中的中断系统。
1基本概念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位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
项目6 NVIC和外部中断原理及应用
14
2023/4/12
EXTI功能框图
15
2023/4/12
STM32的中断控制器支持20个外部中断、事件请 求(也就是20条外部中断线),每个中断设有状态位, 每个中断/ 事件都有独立的触发和屏蔽设置。STM32 的20个外部中断对应着20路中断线,分别是 EXTI_Line0-EXTI_Line19。 线0~15:对应外部I/O口的输入中断; 线16:连接到PVD输出; 线17:连接到RTC闹钟事件; 线18:连接到USB唤醒事件; 线19:连接到以太网唤醒事件(只适用于互联型产品)。
▪ 编号3电路实际就是一个或门电路,它一个输入来自编号2电路,另外一个输入来
自软件中断事件寄存器(EXTI_SWIER)。EXTI_SWIER 允许我们通过程序控制就可 以启动中断/事件线,这在某些地方非常有用。我们知道或门的作用就是有“1” 就为“1”,所以这两个输入随便一个有效信号“1”就可以输出“1”给编号4 和编号6电路。
▪ 每一个中断都要在NVIC中挂号,NVIC收到外设的中断请求,会将
其中断请求发送给内核,内核收到NVIC的中断通知之后,就会去 判断是哪个中断发生,然后查找FLASH中断向量表去获取相应的 中断处理函数。
10
2023/4/12
11
2023/4/12
12
2023/4/12
▪ Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常
▪ 无论任何时刻,响应优先级都不会造成
中断嵌套,也就是说中断嵌套完全由占 先式优先级决定的。
7
2023/4/12
优先级分组
▪ STM32为了适应不同的优先级组合,设置了
GROUP的概念,组是一个大的框架,在组下分 别分配了占先优先级与副优先级。每一个中断 都有一个专门的寄存器(Interrupt Priority Registers)来描述该中断的占先式优先级及 副优先级。在这个寄存器中STM32使用4个二进 制位描述优先级(Cortex-M3 定义了8位,但 STM32只使用了4位)。NVIC优先级分组见表61。组别优先顺序(第0组优先级最强,第4组 优先级最弱)。整个系统执行过程中,只设置 一次中断分组,若随意改变会导致中断管理混 乱。
(stm32f103学习总结)—stm32外部中断
(stm32f103学习总结)—stm32外部中断⼀、外部中断介绍1.1 EXTI简介 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事 件/中断请求的边沿检测器。
EXTI的每根输⼊线都可单独进⾏配置,以选 择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或 边沿触发),还可独⽴地被屏蔽。
(stm32f103有19个)1.2 EXTI结构框图1.3 外部中断/事件线映射 STM32F10x的EXTI具有20个中断/事件线,如下:(stm32f103有19个以太⽹唤醒事件没有;stm32f107有20个) STM32F10x 的 EXTI 供外部 IO ⼝使⽤的中断线有 16 根,但是我们使⽤的 STM32F103 芯⽚却远远不⽌ 16 个 IO ⼝,那么 STM32F103 芯⽚怎么解决这个问题的呢? 因为 STM32F103 芯⽚每个 GPIO 端⼝均有 16 个管脚,因此把每个端⼝的 16 个 IO 对应那 16 根中断线 EXTI0-EXTI15 。
⽐如:GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 EXTI0-EXTI15,这样⼀来每个中断线就对应了最多 7 个 IO ⼝,⽐如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
但是中断线每次只能连接⼀个在 IO ⼝上,这样就需要通过 AFIO 的外部中断配置寄存器 1 的 EXTIx[3:0]位来决定对应的中断线映射到哪个GPIO 端⼝上,对于中断线映射到 GPIO 端⼝上的配置函数在stm32f10x_gpio.c 和 stm32f10x_gpio.h 中,所以使⽤到外部中断时要把这个⽂件加⼊到⼯程中,在创建库函数模板的时候我们默认已经添加。
EXTI 的 GPIO 映射图如图 18.1.3 所⽰:⼆、外部中断配置步骤 要使⽤外部中断我们就需要先配置它,通常都需经过这⼏步:(1)使能IO ⼝时钟,配置IO ⼝模式为输⼊(2)开启 AFIO 时钟,设置 IO ⼝与中断线的映射关系RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO 时钟void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); //设置IO ⼝与中断线的映射关系即哪个io ⼝哪⼀个管脚作为中断输⼊线GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //这⾥以配置GPIOA ⼝ GPIOA 的第0管脚作为中断输⼊线(3)配置中断分组(NVIC ),使能中断(4)初始化EXTI ,选择触发⽅式(5)编写EXTI 中断服务函数(中断函数固件库中已经定义必须使⽤下列函数名不能⾃⼰定义)EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler三、编写外部中断控制程序 要实现外部中断⽅式控制LED ,程序框架如下:(1)初始化对应端⼝的EXTI (第三部分中的1-4⼩步)1 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);2 typedef struct3 {4 uint32_t EXTI_Line; //中断/事件线5 EXTIMode_TypeDef EXTI_Mode; //EXTI 模式6 EXTITrigger_TypeDef EXTI_Trigger; //EXTI 触发⽅式7 FunctionalState EXTI_LineCmd; //中断线使能或失能8 }EXTI_InitTypeDef ;(2)编写EXTI中断函数(3)编写主函数1/*******************************************************************************2* 函数名 : My_EXTI_Init3* 函数功能 : 外部中断初始化4* 输⼊ : ⽆5* 输出 : ⽆6*******************************************************************************/7void My_EXTI_Init(void)8{9 NVIC_InitTypeDef NVIC_InitStructure;10 EXTI_InitTypeDef EXTI_InitStructure;1112 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能13 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择GPIO管脚⽤作外部中断线路14//EXTI0 NVIC 配置15 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道16 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级17 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //⼦优先级18 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能19 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器20//初始化EXTI 配置21 EXTI_InitStructure.EXTI_Line=EXTI_Line0;22 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;23 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;24 EXTI_InitStructure.EXTI_LineCmd=ENABLE;25 EXTI_Init(&EXTI_InitStructure);26}1/*******************************************************************************2* 函数名 : EXTI0_IRQHandler3* 函数功能 : 外部中断0函数4* 输⼊ : ⽆5* 输出 : ⽆6*******************************************************************************/7void EXTI0_IRQHandler(void)8{9 if(EXTI_GetITStatus(EXTI_Line3)==1) //判断EXTI中断标志位状态函数10 {11 //填写中断中需要完成的程序12 }13 EXTI_ClearITPendingBit(EXTI_Line3); //在结束中断服务函数前,清楚中断标志位1415 }。
Stm32中断优先级相关概念与使用笔记(NVIC)
Stm32中断优先级相关概念与使用笔记一、基本概念1.ARM cortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与中断控制核中断优先级控制的寄存器(NVIC、SYSTICK等)属于cortex_m3内核的部分。
STM32采用了cortex_m3内核,所以这些部分仍旧保留使用,但并不是完全使用的,只是使用了一部分。
2.STM32目前支持的中断共为84个(16个内核+68个外部),和16级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位,见后面解释)。
《参考最新101xx-107xx STM32 Reference manual, RM0008》。
以下主要对外部中断进行说明。
3.68个外部中断(通道)在STM32中已经固定的分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但在STM32中只有高4位有效),每4个通道的8位中断优先级控制字(PRI_n)构成一个32位的优先级寄存器(Priority Register)。
68个通道的优先级寄存器至少有是17个32位的寄存器,它们是NVIC寄存器的一部分。
4.这4bit的中断优先级控制位还要分成2组看,从高位开始,前面的定义抢先式优先级,后面为子优先级。
4bit的组合可以有以下几种形式:5.在一个系统中,通常只使用上面5种分配情况的一种,具体采用哪一种,需要在初始化时写入到一个32位寄存器AIRC(Application Interrupt and Reset Control Register)的第[10:8]这2个位中。
这3个bit位有专门的称呼:PRIGROUP(具体写操作后面介绍)。
比如你将0x05(上表的编号)写到AIRC的[10:8]中,那么也就规定了你的系统中只有4个抢先式优先级,相同的抢先式优先级下还可以有4个不同级别的子优先级。
6.AIRC中PRIGROUP的值规定了设置和确定每个外部中断通道优先级的格式。
STM32裸机开发—外部中断
STM32裸机开发—外部中断a. 初始化IO 口作为输入这一步需要设置你要作为外部中断输入的IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部硬件一定要上拉或下拉。
否则可能导致中断不停地被触发。
在干扰较大的地方,就算使用了上拉/下拉,也建议在外部硬件上设置上拉/下拉,这样可以在一定程度上防止外部干扰带来的影响。
*RCC_APB2ENR=0x00000019;//打开portb 和portc 的时钟和复用时钟*PORTA_CRL=0x44444844;//设置PA2 口为上拉/下拉输入模式由于还需要驱动液晶屏所以同时打开了PORTB 和PORTC 的时钟。
b. 开启IO 口复用时钟,设置IO 口与中断线的映射关系STM32 的IO 口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO 口与中断线的对应关系。
才能把外部中断与中断线连接起来。
从图中看到一共有19 条中断线(EXTIx),几号端口就是几号中断线。
这里PA2 显然就是EXTI2 线。
*AFIO_EXTICR1=0x00000000;//打开PA2 口的复用设置c. 开启与该IO 口相对的线上中断事件,设置触发条件这一步,我们要配置中断产生的条件,STM32 可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平和低电平触发。
这里要根据自己的实际情况来配置。
同时要开启中断线上的中断,这里需要注意的是,如果使用外部中断,并设置该中断的EMR 位的话,会引起软件仿真上不能转到中断,而硬件上是可以的。
而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。
建议不要配置EMR 位。
从图中可以看到,要进入NVIC interrupt controller 必须要设置中断屏蔽寄存器。
挂起请求寄存器从目前的理解来看应该是在硬件中断的时候接到中断事件就自动置1,中断被处理了就置0,可以通过写该寄存器来实现软中断,故在这里没有进行设置。
Stm32 学习笔记3--中断
Stm32 学习笔记3—外部中断1、外部中断程序编写方法①时钟(RCC)初始化②I/O端口初始化③EXTI 配置,在这里配置需要选择哪个引脚作为中断引脚④NVIC 配置,这也是比单片机多出来的部分,我们必须把NVIC 中对应的通道使能,并且设置优先级别⑤编写中断处理程序2、EXTI配置void exti_config(){EXTI_InitTypeDef EXTI_InitStructure;GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);/*设置PA0作为中断线路*//*EXTI_ClearITPendingBit(EXTI_Line0); */EXTI_InitStructure.EXTI_Line = EXTI_Line0; /*设置外部中断线0*/EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;/*设置线路为中断请求*/EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /*下降沿触发*/EXTI_InitStructure.EXTI_LineCmd = ENABLE;/*线路使能*/EXTI_Init(&EXTI_InitStructure);/*初始化中断*/}①EXTI_InitTypeDef 结构体EXTI_InitTypeDef定义于文件“stm32f10x_exti.h”:typedef struct {u32 EXTI_Line;EXTIMode_TypeDef EXTI_Mode;EXTIrigger_TypeDef EXTI_Trigger;FunctionalState EXTI_LineCmd;} EXTI_InitTypeDef;参数说明EXTI_Line16连接PVD输出,EXTI_Line17连接RTC报警事件,EXTI_Line18连接USB唤醒EXTI_LineCmd设为ENABLE或者DISABLE②函数GPIO_EXTILineConfig:选择GPIO管脚用作外部中断线路原型:void GPIO_EXTILineConfig(u8 GPIO_PortSource, u8 GPIO_PinSource)输入:GPIO_PortSource: 选择用作事件输出的GPIO端口原型:void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)输入:参见结构EXTI_InitTypeDef3、NVIC配置void nvic_config(){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/*配置主从优先级*/NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;/*外部中断线0*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /*抢断优先级*/NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; /*从优先级*/NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/*初始化NVIC*/}①NVIC_InitTypeDef structureNVIC_InitTypeDef定义于文件“stm32f10x_nvic.h”:typedef struct{u8 NVIC_IRQChannel;u8 NVIC_IRQChannelPreemptionPriority;u8 NVIC_IRQChannelSubPriority;FunctionalState NVIC_IRQChannelCmd;} NVIC_InitTypeDef;参数说明:NVIC_IRQChannel设置NVIC_IRQChannel中的先占优先级。
STM32中外部中断与外部事件
STM32中外部中断与外部事件这张图是一条外部中断线或外部大事线的暗示图,图中信号线上划有一条斜线,旁边标记19字样的注释,表示这样的线路共有19套。
图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测,通过编号3的或门进入中断“挂起哀求寄存器”,最后经过编号4的与门输出到NVIC 中断控制器;在这个通道上有4个控制选项,外部的信号首先经过边沿检测电路,这个边沿检测电路受升高沿或下降沿挑选寄存器控制,用户可以用法这两个寄存器控制需要哪一个边沿产生中断,由于挑选升高沿或下降沿是分离受2个平行的寄存器控制,所以用户可以同时挑选升高沿或下降沿,而假如惟独一个寄存器控制,那么只能挑选一个边沿了。
接下来是编号3的或门,这个或门的另一个输入是“软件中断/大事寄存器”,从这里可以看出,软件可以优先于外部信号哀求一个中断或大事,既当“软件中断/大事寄存器”的对应位为“1”时,不管外部信号如何,编号3的或门都会输出有效信号。
一个中断或大事哀求信号经过编号3的或门后,进入挂起哀求寄存器,到此之前,中断和大事的信号传输通路都是全都的,也就是说,挂起哀求寄存器中记录了外部信号的电平变幻。
外部哀求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断哀求,假如中断屏蔽寄存器的对应位为“0”,则该哀求信号不能传输到与门的另一端,实现了中断的屏蔽。
明了了外部中断的哀求机制,就很简单理解大事的哀求机制了。
图中红色虚线箭头,标出了外部大事信号的传输路径,外部哀求信号经过编号3的或门后,进入编号5的与门,这个与门的作用与编号4的与门类似,用于引入大事屏蔽寄存器的控制;最后脉冲发生器把一个跳变的信号改变为一个单脉冲,输出到芯片中的其它功能模块。
在这张图上我们也可以知道,从外部激励信号来看,中断和大事是没有分离的,只是在芯片内部分开,一路信号会向CPU产生中断哀求,另一路信号会向其它功能模块发送脉冲触发信号,其它功能模块如何相应这个触发信号,则由对应的模块自己打算。
- 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)用于清除中断标志。