STM32 中断优先级理解

合集下载

STM32 中断优先级理解

STM32 中断优先级理解

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

但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分。

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

而我们常用的就是这68 个可屏蔽中断,但是STM32 的68 个可屏蔽中断,在STM32F103 系列上面,又只有60 个(在107 系列才有68 个)。

在MDK 内,与NVIC 相关的寄存器,MDK 为其定义了如下的结构体:点击(此处)折叠或打开1.typedef struct2.{3.vu32 ISER[2];4.u32 RESERVED0[30];5.vu32 ICER[2];6.u32 RSERVED1[30];7.vu32 ISPR[2];8.u32 RESERVED2[30];9.vu32 ICPR[2];10.u32 RESERVED3[30];11.vu32 IABR[2];12.u32 RESERVED4[62];13.vu32 IPR[15];14.} NVIC_TypeDef;STM32 的中断在这些寄存器的控制下有序的执行的。

只有了解这些中断寄存器,才能了解STM32 的中断。

下面简要介绍这几个寄存器:ISER[2]:I SER 全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。

上面说了STM32F103 的可屏蔽中断只有60 个,这里用了 2 个32 位的寄存器,总共可以表示64 个中断。

而STM32F103 只用了其中的前60 位。

ISER[0]的bit0~bit31 分别对应中断0~31。

ISER[1]的bit0~27 对应中断32~59;这样总共60 个中断就分别对应上了。

你要使能某个中断,必须设置相应的ISER 位为1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。

STM32的中断优先级别理解20210524

STM32的中断优先级别理解20210524

STM32的中断优先级别理解20210524
理解:
1、STM32 总共有4个bit⽤来描述中断的种类,4个bit⼀共有5种组合【抢占式优先级别+副优先级(响应优先级)】,分组就决定了抢占优先级占⽤的bit数。

组0也就是表⽰0个bit为抢占优先级。

2、抢占式优先级别⾼的可以打断低优先级别的⼯作,相同抢占优先级的不能相互打断。

3、副优先级⾼的中断来临是,序号低的优先处理【响应】。

前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):
NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4
前提条件2:“组”优先级别>“抢”占优先级别>“副”优先级别
前提条件3:同⼀组优先级别中,不同的抢占级别之间,其中⼀抢占级别正在做事,另外抢占级别不能打断他;(即”同⼀组优先级下的中断源间,没有中断嵌套“)
前提条件4:不同组优先级别间,依据优先级强弱,优先级别⾼的组的中断源可以打断优先级别低的组的正在做的事情;(即:不同组优先级间,可以中断嵌套)
对于上⾯的理解:
STM32中,每个设备都可以配置不同的中断组,抢占优先级,响应优先级。

具体举例:
项⽬需要2个串⼝,但是不是两个串⼝同时使⽤,只是随机使⽤其中⼀个,程序对2个串⼝的优先级需要配置;
要求两个串⼝⼯作的时候不能相互打断,最好也不鞥你被其他程序打断,那么可以把2个串⼝都设置成 NVIC_PriorityGroup_0 分组0【0个bit表⽰抢占优先级】,副优先级可以分别设置为1,2。

STM32-INT

STM32-INT

STM32中断(转载)分类:STM32 2011-12-15 17:07 277人阅读评论(0) 收藏举报STM32中断优先级相关概念与使用笔记上海华东师范大学通信工程系ma-chao一、基本概念1.ARM cortex_m3 内核支持256 个中断(16 个内核+240 外部)和可编程256 级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK 等)也都属于cortex_m3 内核的部分。

STM32 采用了cortex_m3 内核,所以这部分仍旧保留使用,但STM32并没有使用cortex_m3 内核全部的东西(如内存保护单元MPU 等),因此它的NVIC 是cortex_m3 内核的NVIC 的子集。

2.STM32 目前支持的中断共为84 个(16 个内核+68 个外部),和16 级可编程中断优先级的设置(仅使用中断优先级设置8bit 中的高4 位,见后面解释)。

《参考最新101xx-107xx STM32 Reference manual, RM0008》。

3.以下主要对“外部中断通道”进行说明。

对于cortex_m3 内核所支持的240 个外部中断,我在这里使用了“中断通道”这个概念,因为尽管每个中断对应一个外围设备,但该外围设备通常具备若干个可以引起中断的中断源或中断事件。

而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请中断。

因此,下面关于中断优先级的概念都是针对“中断通道”的。

当该中断通道的优先级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断,都享有相同的通道中断优先级。

至于该设备本身产生的多个中断的执行顺序,则取决于用户的中断服务程序。

4.STM32 可以支持的68 个外部中断通道,已经固定的分配给相应的外部设备。

每个中断通道都具备自己的中断优先级控制字节PRI_n(8 位,但在STM32 中只使用 4 位,高4 位有效),每 4 个通道的8 位中断优先级控制字(PRI_n)构成一个32 位的优先级寄存器(PriorityRegister)。

STM32中断优先级

STM32中断优先级

STM32抢占优先级、响应优先级的详细讲解说明:stm32的优先级以寄存器的4位数据来表示的,因此2^4=16只能表示16级中断嵌套。

如上图所示:NVIC_PriotityGroup_0:即4位全部用于响应优先级(子优先级);因此,抢占优先级0级中断嵌套;响应优先级共有16即0—15级中断嵌套;NVIC_PriotityGroup_1:即1位用于响应优先级,3位用于响应优先级;因此,抢占优先级0下面共有2^3=8级中断嵌套;抢占优先级1下面共有2^3=8级中断嵌套;NVIC_PriotityGroup_2:即2位用于响应优先级,2位用于响应优先级;因此,抢占优先级总共有2^2=4个分别为:抢占优先级0至3且每个抢占优先级下面都有2^2=4个响应优先级。

NVIC_PriotityGroup_3:即3位用于响应优先级,1位用于响应优先级;因此,抢占优先级总共有2^3=8个分别为:抢占优先级0至7且每个抢占优先级下面都有2^1=2个响应优先级。

类似的,NVIC_PriotityGroup_4:即4位用于响应优先级,0位用于响应优先级;因此,抢占优先级16即0—15优先级中断嵌套;响应优先级共有0级中断嵌套;注意:响应优先级相等时,抢占优先级越小,中断级别越高抢占优先级相等时,响应优先级越小,中断级别越高举个栗子:void NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC_PriorityGroup_2即表明抢占优先级可有0—3级中断嵌套;响应优先级可设0—3级中断嵌套。

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置串口中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPrior ity = 0;//0即表明抢占优先级0;即为NVIC_PriorityGroup_2抢占优先0—3级中级别最高的优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//0即表明响应优先级0;即为NVIC_PriorityGroup_2响应优先0—3级中级别最高的优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}总结:如上程序中串口1中断抢占优先级0,响应优先级0;其即为NVIC_PriorityGroup_2中中断优先级别最高,能够打断其它正在执行的中断。

STM32中断中设置的先占式优先级与从优先级

STM32中断中设置的先占式优先级与从优先级

STM32中断中设置的先占式优先级与从优先级STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。

具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:所有8位用于指定响应优先级最高1位用于指定抢占式优先级,最低7位用于指定响应优先级最高2位用于指定抢占式优先级,最低6位用于指定响应优先级最高3位用于指定抢占式优先级,最低5位用于指定响应优先级最高4位用于指定抢占式优先级,最低4位用于指定响应优先级最高5位用于指定抢占式优先级,最低3位用于指定响应优先级最高6位用于指定抢占式优先级,最低2位用于指定响应优先级最高7位用于指定抢占式优先级,最低1位用于指定响应优先级这就是优先级分组的概念。

--------------------------------------------------------------------------------Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级第4组:所有4位用于指定抢占式优先级可以通过调用STM32的固件库中的函数选择使用哪种优先级分组方式,这个函数的参数有下列5种: NVIC_PriorityGroup_0 => 选择第0组NVIC_PriorityGroup_1 => 选择第1组NVIC_PriorityGroup_2 => 选择第2组NVIC_PriorityGroup_3 => 选择第3组NVIC_PriorityGroup_4 => 选择第4组接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:// 选择使用优先级分组第1组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;NVIC_Init(&NVIC_InitStructure);--------------------------------------------------------------------------------要注意的几点是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

stm32中断程序

stm32中断程序

stm32中断程序STM32是一款非常强大的微控制器系列,它的应用范围非常广泛,包括智能家居、汽车电子、医疗器械等等。

在STM32中,中断是非常重要的一个概念。

本文将详细介绍STM32中的中断程序。

一、中断的基本概念中断是指在程序执行过程中,某些硬件或软件条件满足时,CPU通过改变程序的执行顺序,转去执行相应的处理程序,处理完毕后再返回原程序继续执行。

换句话说,中断是指CPU在执行主程序时,暂停执行当前的指令序列,执行一段中断处理程序,处理完毕后再返回原处继续执行主程序。

二、STM32的中断控制器STM32的中断控制器是NVIC(Nested Vectored Interrupt Controller),它集成在Cortex-M3内核中。

NVIC可以处理中断请求,也可以管理中断优先级,它可以同时处理256个中断请求,并支持嵌套中断。

三、中断向量表中断向量表是一个表格,它里面存放着中断处理程序的入口地址。

在STM32中,中断向量表是存放在Flash中的,被称为向量表区或者中断向量表区。

向量表区的大小是固定的,为48字节(即12个中断)或者1024字节(即256个中断),它的起始地址是0x08000000或者0x00000000(取决于Flash的底层硬件设计)。

四、中断服务程序的编写中断服务程序可以分为两个部分:中断处理和中断返回。

中断处理是指具体的中断处理代码,中断返回则是指恢复现场并退出中断的代码。

在STM32中,中断服务程序的函数原型如下:void EXTIx_IRQHandler(void)其中,x表示中断源的编号,范围从0到15。

EXTI表示是外部中断。

在开发STM32中断程序之前,需要实现中断控制器的配置。

步骤如下:(1)设置中断向量表的首地址在开发环境中,中断向量表的首地址已经被定义好了。

如果在自定义的应用程序中需要重新设置中断向量表的首地址,可以使用以下代码:NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);其中,NVIC_VectTab_FLASH表示中断向量表的首地址存储在Flash中,0x10000表示中断向量表的起始地址。

STM32中断优先级彻底讲解

STM32中断优先级彻底讲解

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

二:优先级推论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十一位用作选定积极响应优先级这就是优先级分组的概念。

STM32中断优先级彻底讲解

STM32中断优先级彻底讲解

STM32中断优先级彻底讲解一:综述STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。

二:优先级判断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位用于指定响应优先级这就是优先级分组的概念。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分。

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

而我们常用的就是这68 个可屏蔽中断,但是STM32 的68 个可屏蔽中断,在STM32F103 系列上面,又只有60 个
(在107 系列才有68 个)。

在MDK 内,与NVIC 相关的寄存器,MDK 为其定义了如下的结构体:
点击(此处)折叠或打开
1.typedef struct
2.{
3.vu32 ISER[2];
4.u32 RESERVED0[30];
5.vu32 ICER[2];
6.u32 RSERVED1[30];
7.vu32 ISPR[2];
8.u32 RESERVED2[30];
9.vu32 ICPR[2];
10.u32 RESERVED3[30];
11.vu32 IABR[2];
12.u32 RESERVED4[62];
13.vu32 IPR[15];
14.} NVIC_TypeDef;
STM32 的中断在这些寄存器的控制下有序的执行的。

只有了解这些中断寄存器,才能了解STM32 的中断。

下面简要介绍这几个寄存器:
ISER[2]:I SER 全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。

上面说了STM32F103 的可屏蔽中断只有60 个,这里用了 2 个32 位的寄存器,总共可以表示64 个中断。

而STM32F103 只用了其中的前60 位。

ISER[0]的bit0~bit31 分别对应中断0~31。

ISER[1]的bit0~27 对应中断32~59;这样总共60 个中断就分别对应上了。

你要使能某个中断,必须设置相应的ISER 位为1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。

具体每一位对应哪个中断,请参考stm32f10x_nvic..h 里面的第36 行处。

ICER[2]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。

该寄存器组与ISER 的作用恰好相反,是用来清除某个中断的使能的。

其对应位的功能,也和ICER 一样。

这里要专门设置一个ICER 来清除中断位,而不是
向ISER 写0 来清除,是因为NVIC 的这些寄存器都是写 1 有效的,写0 是无效的。

ISPR[2]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。

每个位对应的中断和ISER 是一样的。

通过置1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。

写0 是无效的。

ICPR[2]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。

其作用与ISPR 相反,对应位也和ISER 是一样的。

通过设置1,可以将挂起的中断接挂。

写0 无效。

IABR[2]:全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。

这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。

在中断执行完了由硬件自动清零。

对应位所代表的中断和ISER 一样,如果为1,则表示该位所对应的中断正在被执行。

IPR[15]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。

这个寄存器组相当重要!STM32 的中断分组与这个寄存器组密切相关。


为STM32 的中断多达60 多个,所以STM32 采用中断分组的办法来确定中断的优先级。

IPR 寄存器组由15 个32bit 的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示15*4=60 个可屏蔽中断。

刚好和STM32的可屏蔽中断数相等。

IPR[0]
的[31~24],[23~16],[15~8],[7~0]分别对应中断3~0,依次类推,总共对应60 个外部中断。

而每个可屏蔽中断占用的8bit 并没有全部使用,而是只用了高 4 位。

这 4 位,又分为抢占优先级和子优先级。

抢占优先级在前,子优先级在后。

而这两个优先级各占几个位又要根据SCB->AIRCR 中的中断断分组设置来决定。

这里简单介绍一下STM32 的中断分组:STM32 将中断分为 5 个组,组0~4。

该分组的设置是由SCB->AIRCR 寄存器的bit10~8 来定义的。

具体的分配关系如表
通过这个表,我们就可以清楚的看到组0~4 对应的配置关系,例如组设置为3,那么此时所有的60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。

每个中断,你可以设置抢占优先级为0~7,响应优先级为 1 或0。

抢占优先级的级别高于响应优先级。

而数值越小所代表的优先级就越高。

这里需要注意两点:第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。

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

使用库函数实现以上中断分组设置以及中断优先级管理,使得我们以后的中断设置简单化。

NVIC 中断管理函数主要在misc.c 文件里面。

首先是中断优先级分组函数NVIC_PriorityGroupConfig,这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。

比如我们设置整个系统的中断优先级分组值为2(2 位抢占优先级,2 位响应优先级”),那么方法是:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
设置好了系统中断分组,那么对于每个中断又怎么确定他的抢占优先级和响应优先级呢?下面看一个重要的函数为中断初始化函数NVIC_Init,其函数申明为:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
其中NVIC_InitTypeDef 是一个结构体,可以看看结构体的成员变量:点击(此处)折叠或打开
1.typedef struct
2.{
3.uint8_t NVIC_IRQChannel;//定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到每个中断对应的名字。

例如 USART1_IRQn。

4.uint8_t NVIC_IRQChannelPreemptionPriority;//定义这个中断的抢占优先级别。

5.uint8_t NVIC_IRQChannelSubPriority;//定义这个中断的子优先级别。

6.FunctionalState NVIC_IRQChannelCmd;//该中断是否使能。

7.} NVIC_InitTypeDef;
比如我们要使能串口 1 的中断,同时设置抢占优先级为1,子优先级位2,初始化的方法是:点击(此处)折叠或打开
ART_InitTypeDef USART_InitStructure;
2.NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
3.NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
4.NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2
5.NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ 通道使能
6.NVIC_Init(&NVIC_InitStructure);。

相关文档
最新文档