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外部中断回传参数
stm32外部中断回传参数摘要:1.STM32外部中断基本概念2.STM32外部中断配置方法3.外部中断触发方式及应用场景4.实例:STM32外部中断回传参数正文:一、STM32外部中断基本概念STM32外部中断,又称IO中断或事件控制器(EXTI),是STM32微控制器提供的一种中断机制。
它允许外部信号(如GPIO引脚状态变化)触发中断请求,进而实现程序的跳转和执行。
STM32外部中断具有较高的灵活性和可靠性,广泛应用于各种智能硬件和嵌入式系统中。
二、STM32外部中断配置方法1.选择合适的外部中断线:STM32外部中断共支持19个边沿检测器,可根据实际需求选择相应的外部中断线。
2.配置触发事件:每个外部中断线都可以独立地配置其触发事件,包括上升沿、下降沿或双边沿。
3.屏蔽中断请求:可通过挂起寄存器单独地屏蔽或启用外部中断请求。
4.配置中断优先级:根据需要调整中断优先级,确保关键任务能够及时响应。
三、外部中断触发方式及应用场景1.上升沿触发:当GPIO引脚电平从低电平变为高电平时,触发中断。
2.下降沿触发:当GPIO引脚电平从高电平变为低电平时,触发中断。
3.双边沿触发:当GPIO引脚电平发生上升或下降沿时,均触发中断。
4.应用场景:外部中断广泛应用于传感器数据采集、通信接收、按键触发等领域。
四、实例:STM32外部中断回传参数以下是一个简单的STM32外部中断回传参数的实例:1.配置GPIO引脚为输入模式,并连接到外部中断线。
2.配置外部中断触发方式(如上升沿触发)。
3.编写中断处理函数,并在其中读取GPIO引脚状态。
4.在主循环中,检查外部中断触发次数,并根据需要执行相应操作。
5.为了确保实时性,可以使用中断优先级和嵌套中断机制。
通过以上步骤,您可以充分利用STM32外部中断实现各种智能控制和监测功能。
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中断NVIC思维导图
STM32103系列中断NVIC 中断构成10个系统异常(系统中断)60个外部中断NVIC寄存器NVIC简介全称:嵌套向量中断控制器来源:cortex-M3 内核里的NVIC减去不需要的部分构成STM32的NVIC寄存器1.ISER中断使能寄存器2.ICER中断清除寄存器(也就是失能中断)3.ISPR中断使能悬起寄存器4.ICPR中断清除悬起寄存器5.IABR中断有效位寄存器6.IP中断优先级寄存器7.STIR软件触发中断寄存器黄色部分是常用的中断优先级优先级的定义优先级设定寄存器:NVIC->IPRx复位,NMI 和硬 fault是特殊的、不可设置的、优先级最高的,无论什么时候出现都会抢占最高级别作用:用来配置外部中断优先级寄存器说明寄存器宽度:8bit(如图所示:STM32系列有效的只有4bit)支持16级优先级别:0~15数值意义:数值越小,优先级就越高优先级分组优先级分组:SCB->AIRCR:PRIGROUP[10:8]优先级分组定义用于表达优先级的4bit,如果有中断发生,抢占式优先级高的先执行,如果抢占式优先级相同,就比较子优先级。
如果2者都相同,那就比较它们的硬件编号(编号小的优先级高)优先级分组的来源优先级分组抢占式优先级子优先级固件库中断配置需要用到的定义所在文件misc.c、misc.h、stm32f10x.h、st32f10x_it.c中断配置步骤使能外设某个中断11.开启比如定时器中断、串口中断,外部中断等相应外设中断的寄存器位2.使能NVIC寄存器中的使能寄存器设置中断优先级分组2对应的固件库函数:NVIC_PriorityGroupConfig(),在misc.c的文件中配置NVIC寄存器3初始化NVIC_InitTypeDef结构体将初始化后的NVIC_InitTypeDef结构体放入NVIC_Init()中,在misc.c的文件中4编写中断服务函数51.中断服务函数名称都在startup_stm32f10x_hd.s的汇编文件中已经设置好了2.在st32f10x_it.c文件中编写。
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的外部中断(库函数)在为某引脚配置中断前,同样要先初始化该引脚的配置,用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外部中断处理流程
STM32外部中断处理流程外部中断是指引发中断的事件来自于MCU外部的输入引脚或外设,需要通过配置寄存器和中断服务程序来处理外部中断。
在STM32系列MCU中,外部中断处理可分为以下几个步骤。
1.配置中断引脚要使用外部中断功能,首先需要配置中断引脚。
对于STM32,外部中断引脚由GPIO口提供,需要通过GPIO配置寄存器设置相关引脚的工作模式、上下拉和中断触发方式等。
具体配置方法可以参考芯片手册。
2.配置中断控制器外部中断的中断源需要连接到中断控制器(NVIC),通过配置NVIC的相关寄存器来使能外部中断。
NVIC是位于ARM Cortex-M内核内部的外设,用于管理和分配中断优先级。
3.编写中断服务程序(ISR)中断服务程序(Interrupt Service Routine, ISR)是用于处理中断事件的函数,当外部中断引发时,MCU会跳转到相应的ISR进行处理。
在编写ISR时,需要注意以下几点:-确定中断源:可以通过读取中断状态寄存器来判断是哪个外部中断引起的中断。
-处理中断事件:根据中断源的不同,进行相应的处理。
例如,可以读取输入引脚状态、处理外设状态等。
-清除中断标志位:要在ISR内部清除中断标志位,以允许MCU再次响应该外部中断。
具体方法是通过读取相应的寄存器或调用相关函数清除中断标志位。
4.配置中断优先级中断优先级用于确定ISR的响应顺序,优先级较高的中断先被处理。
在STM32中,中断优先级可以通过配置中断控制器的相关寄存器进行设置。
5.启用中断在完成上述步骤后,需要启用相应的中断引脚和中断控制器。
具体方法是通过设置GPIO寄存器来使能中断引脚,并通过设置NVIC寄存器来使能相关中断。
6.处理中断请求一旦发生外部中断事件,MCU就会跳转到相应的ISR进行中断处理。
在ISR中,可以根据需要调用其他的函数或执行其他的操作。
处理完成后,可以通过清除中断标志位和退出中断函数来结束中断处理。
stm32解决中断冲突的方法
stm32解决中断冲突的方法如何解决STM32中的中断冲突第一步:了解STM32中断机制STM32微控制器系列是STMicroelectronics开发的一系列32位ARM Cortex-M内核的微控制器。
STM32使用向量中断控制器(NVIC)来管理中断。
每个可中断源都有一个特定的中断优先级,并且可以通过调整优先级来控制中断的触发和处理顺序。
中断是STM32系统中非常重要的一部分,它允许微控制器在处理其他任务时根据需要对外部事件作出响应。
但是,在STM32中使用多个中断时可能会出现冲突的问题。
这可能导致一些中断无法触发或中断优先级错误。
为了解决这个问题,可以采取以下方法。
第二步:了解中断冲突的原因中断冲突可能是由于中断优先级设置错误、中断嵌套问题或中断间共享资源引起的。
中断优先级设置错误是指中断的优先级设置不正确,导致某些中断会被覆盖或延迟触发。
中断嵌套问题是指当一个中断正在处理时,另一个中断发生,导致中断无法正确触发。
中断间共享资源引起的冲突是指多个中断同时访问共享资源,导致数据错误或冲突。
第三步:调整中断优先级首先,调整中断的优先级是解决中断冲突的关键。
在STM32中,每个中断源都有一个特定的优先级,范围从0到15。
较低的数值表示更高的优先级,而较高的数值表示较低的优先级。
为了更好地控制中断触发和处理顺序,可以根据系统需求适当调整中断的优先级。
调整中断优先级可通过在NVIC中设置相关的中断控制器寄存器来实现。
有两个关键的寄存器需要设置:中断优先级寄存器(IPR)和中断使能寄存器(IER)。
中断优先级寄存器用于设置中断的优先级,而中断使能寄存器用于使能或禁用中断。
为了防止冲突,可以将高优先级的中断设置为较低的值(例如0或1),而将低优先级的中断设置为较高的值(例如14或15)。
这样可以确保高优先级的中断首先得到处理,从而避免了中断冲突。
第四步:正确处理中断嵌套另一个常见的中断冲突问题是中断嵌套。
STM32-NVIC中断优先级分组-中断优先级设置
STM32-NVIC中断优先级分组-中断优先级设置STM32-中断优先级管理NVIC1.NVIC中断优先级分组NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。
STM32F中⽂参考⼿册中搜索向量表可以找到相应的中断说明。
CM4/CM7 内核⽀持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
STM32F4/F7并没有使⽤CM4内核的全部东西,⽽是只⽤了它的⼀部分。
STM32F40xx/STM32F41xx总共有92个中断。
10个内核中断,82个可屏蔽中断。
STM32F42xx/STM32F43xx则总共有97个中断。
10个内核中断,87个可屏蔽中断。
STM32F76x总共118个中断,10个内核中断,108个可屏蔽中断。
STM32具有16级可编程的中断优先级,⽽我们常⽤的就是这些可屏蔽中断。
⼏⼗个中断,怎么管理?⾸先,对STM32中断进⾏分组,组0~4。
同时,对每个中断设置⼀个抢占优先级和⼀个响应优先级值。
分组配置是在寄存器SCB->AIRCR中配置: IP bit[7:4]有4位,2^4=16,所以说它们的优先级可以有16个值,这时候如果是2位抢占优先级,那么它的值可能为0、1、2、3。
也就是抢占优先级可以取0到3 。
⾸先进⾏分组来决定⼏位抢占优先级、⼏位响应优先级。
数越⼩它的优先级越⾼。
组AIRCR[10:8]IP bit[7:4]分配情况分配结果01110:40位抢占优先级,4位响应优先级11101:31位抢占优先级,3位响应优先级21012:22位抢占优先级,2位响应优先级31003:13位抢占优先级,1位响应优先级40114:04位抢占优先级,0位响应优先级抢占优先级 & 响应优先级区别:⾼优先级的抢占优先级是可以打断正在进⾏的低抢占优先级中断的。
抢占决定了是否能打断别⼈。
stm32定时器中断配置
stm32 定时器中断配置
stm32 中断
stm32 的Cortex 内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(excepTIon)和中断(terryp),并把它们用二个表管理起来,编号为0~15 的称为内核异常,而16 以上的则称为外部中断(外,相对内核而言),这个表就称为中断向量表。
而STM32 对这个表重新进行了编排,把编号从-3 至6 的中断向量定义为系统异常,编号为负的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断(NMI)、硬错误(Hardfault)。
从编号7 开始的为外部中断,这些中断的优先级都是可以自行设置的。
STM32 的中断如此之多,配置起来并不容易,因此,我们需要一个
强大而方便的中断控制器NVIC,NVIC 是属于Cortex 内核的器件。
stm32 中断配置
配置STM32 的中断只需要理解2 个内容,配置4 个变量即可。
STM32中断的详细介绍及使用流程
STM32中断的详细介绍及使用流程STM32是一款常用的32位微控制器系列,由STMicroelectronics (ST)研发,广泛应用于各种嵌入式系统中。
中断是STM32中非常重要的特性之一,本文将详细介绍中断的概念、分类、优点以及使用流程。
一、中断的概念中断是一种机制,允许外部硬件设备打断正常的程序运行,并立即执行一个称为中断服务例程(ISR)的特定函数。
中断通常由外部硬件引发,例如定时器溢出、外部触发事件等。
一旦中断发生,控制器将暂停当前正在执行的任务,转而执行ISR,当ISR执行完毕后,控制权将返回到原来的任务。
二、中断的分类1.外部中断:STM32的GPIO引脚可以配置为外部中断触发。
当配置为外部中断模式时,如果引脚上的输入信号满足特定条件(上升沿、下降沿等),将会触发一个外部中断,并执行ISR。
2.内部中断:STM32具有许多内置的模块,例如定时器、UART等,这些模块常常产生中断信号。
例如,定时器溢出中断可以用于周期性任务的处理。
三、中断的优点1.实时性:中断能够立即响应外部事件,极大提高了系统的实时性。
2.节约CPU资源:中断是一种事件驱动的方式,只有在需要处理的时候才会触发中断,节约了CPU资源。
3.模块化设计:通过使用中断,可以将复杂的任务分解为更小的块,实现模块化的设计。
四、中断的使用流程使用中断的流程通常包括以下几个步骤:1.初始化中断:配置相关的中断源和中断服务例程。
在STM32中,中断使用时需要开启并配置相关的寄存器。
2.注册中断服务例程:编写中断服务例程的函数,这是中断发生时将要执行的函数。
在STM32中,可以使用标准库提供的函数来注册中断服务例程。
3.启用中断:开启中断并配置相应的优先级,以确定中断发生时的处理顺序。
在STM32中,可以设置中断控制器的中断使能位和优先级。
下面以STM32CubeIDE为例,展示一个外部中断的使用流程:1. 打开STM32CubeIDE,创建一个新的工程,并选择相应的芯片型号。
stm32中断(NVIC与EXTI)
stm32中断(NVIC与EXTI) D部有4个从优先级(00 01 10 11)。
1.中断输入与悬起当中断输入脚被置为有效后,该中断就被“悬起”。
所谓“悬起”,也就是等待、就绪的意思。
即使后来中断源撤消了中断请求,已经被标记成悬起的中断也被记录下来。
当某中断的服务程序开始执行时,就称此中断进入了“活跃”状态,并且其悬起位会被硬件自动清除。
在一个中断活跃后,直到其服务例程执行完毕,并且返回后,才能对该中断的新请求予以响应。
当NVIC响应一个中断时,会自动完成以下三项工作,以便安全、准确地跳转到相应的中断服务程序:入栈:把8个寄存器的值压入栈。
当响应中断时,如果当前的代码正在使用PSP,则压入PSP(进程堆栈),否则就压入MSP(主堆栈)。
一旦进入了服务例程,就一直使用主堆栈。
在自动入栈的过程中,将寄存器写入堆栈的顺序与时间顺序无关,CM3会保证正确的寄存器被保存到正确的位置。
取向量:当数据总线(系统总线)进行入栈操作时,指令总线(I-Code总线)正在从向量表中找出正确的中断向量与对应的服务程序入口地址。
更新寄存器。
注意:①如果在某个中断得到响应之前,其悬起状态被清除了,则中断被取消。
②新请求在得到响应时,由硬件自动清零其悬起标志位。
③如果中断源咬住请求信号不放,该中断就会在其上次服务例程返回后再次被置为悬起状态。
④如果某个中断在得到响应之前,其请求信号以若干的脉冲的方式呈现,则被视为只有一次中断请求⑤如果在服务例程执行时,中断请求释放了,但是在服务例程返回前又重新被置为有效,则NVIC会记住此动作,重新悬起该中断。
2.中断返回当中断完成,返回主程序时,NVIC自动完成以下两步:①出栈:先前压入栈中的寄存器在这里恢复。
内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回先前的值。
②更新NVIC 寄存器:伴随着中断的返回,它的活动位也被硬件清除。
对于外部中断,倘若中断输入再次被置为有效,则悬起位也将再次置位,新一次的中断响应序列也会再次开始。
STM32外部中断(实现按键控制LED)
STM32外部中断(实现按键控制LED)引⾔“中断” 这个概念,指的是在单⽚机运⾏过程中,在指定条件发⽣时,停下当前所有⼯作,去执⾏中断处理函数内的内容。
就像我们在教室上课时,突然地震了,不出意外的话我们都需要停下⼿中学习任务,去进⾏⼀系列的避险动作。
这⼀节我们通过中断的⽅式,完成通过按键控制LED亮灭的操作。
准备环节中断相关知识STM32的中断控制器⽀持19个外部中断/事件请求。
这⼗九个外部中断为:线0~15:对应外部IO⼝的输⼊中断。
线16:连接到PVD输出。
线17:连接到连接到RTC时钟事件。
线18:连接到USB唤醒事件。
配置使⽤时,需要先将IO⼝与相应中断线的映射关系建⽴,再对其进⾏使⽤。
那映射关系是怎样的呢?GPIOx.0 ~ GPIOx.15(x = A,B,C,D,E,F,G)分别对应中断线0 ~ 15配置GPIO与中断线关系的函数是void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)eg:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);把GPIO作为EXTI外部中断时,需要打开AFIO时钟。
APIO时钟何时需要打开,具体可以参考这篇⽂章:嵌套向量中断控制器(NVIC)初始化完线上中断和中断条件等内容,还需要配置中断分组。
配置中断分组之前,我们需要先确定如何进⾏分组。
这⾥就需要⽤到NVIC。
关于NVIC的具体内容可查看这篇博⽂:。
编码环节步骤初始化IO⼝输⼊开启AFIO时钟设置IO⼝与中断线的映射关系初始化线上中断、设置触发条件等配置中断分组,并使能中断编写中断服务函数main.c(以下内容均省略头⽂件)int main(void){delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC终端分组2LED_Init();KEY_Init();EXTIX_Init(); //外部中断初始化LED1 = 0;}exti.h#ifndef __EXTI_H#define __EXIT_H#include "sys.h"void EXTIX_Init(void); //外部中断初始化#endifexti.cvoid EXTIX_Init(void){EXTI_InitTypeDef EXTI_InitStructure; //外部中断结构体初始化NVIC_InitTypeDef NVIC_InitStructure; //中断分组结构体初始化KEY_Init();RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //映射IO⼝与中断线//以下为配置中断线初始化EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线EXTI_InitStructure.EXTI_Line = EXTI_Line0; //中断线标号EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //触发⽅式EXTI_Init(&EXTI_InitStructure);//以下为中断优先级的配置NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //声明使⽤的中断是哪⼀个NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //设置抢占优先级为2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //设置⼦优先级为3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断NVIC_Init(&NVIC_InitStructure);}void EXTI0_IRQHandler(void) //中断服务函数{delay_ms(10); //软件去抖if(WK_UP==1){LED0 = !LED0;LED1 = !LED1;}EXTI_ClearITPendingBit(EXTI_Line0); //清除中断位}补充中断服务函数中断服务函数的名称是固定的,写错会导致⽆法中断。
(2)STM32使用HAL库操作外部中断——理论讲解
(2)STM32使⽤HAL库操作外部中断——理论讲解1.中断触发过程对主程序压栈——把中断服务函数的地址写⼊到程序计数器(PC)——执⾏中断服务函数2.中断向量表中断服务函数的地址在STM32的⼿册上的中断向量表中(如下是⼀部分):如上表所⽰,EXTI0中断服务函数的地址是0x00000058。
意思就是如果触发了外部中断那么就从0x00000058地址开始执⾏,这个地址的函数可以在HAL库的启动⽂件中找到。
很明显,EXTI0的中断服务函数的函数名是:EXTI0_IRQHandlerEXTI0~EXTI4是独⽴的,9~5共⽤中断源,15~10共⽤中断源,9~5和15~10的中断需要在中断函数中判断是哪个中断引脚。
3.HAL库中的中断服务函数。
这⾥我们要⽤PD10引脚触发外部中断,根据向量表,EXTI10的中断服务函数是:EXTI15_10_IRQHandler。
HAL库中代码是这样执⾏的:(1)⾸先是中断服务函数PD10外部中断触发之后程序计数器被写⼊0x000000E0(EXTI15_10_IRQHandler函数的地址)然后程序开始执⾏EXTI15_10_IRQHandler函数:EXTI15_10_IRQHandler函数只是调⽤了另⼀个函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);在这个函数中清楚中断标志位然后⼜调⽤了⼀个HAL_GPIO_EXTI_Callback(GPIO_Pin)函数。
根据函数名Callback也能看出来这⾥才是真正执⾏具体功能的函数,该函数需要⽤户在mian.c⽂件中重写:4.NVIC中断控制器步骤1-3说明了⼀个最基本的中断过程。
然⽽还有⼀个重要的概念没有讲到,NVIC中断控制器。
STM32⽀持中断嵌套,为了更好的更强⼤的实现中断嵌套,ST给出了⼀个NVIC中断控制器来专门管理中断。
我们都知道⾼优先级的中断能打断低优先级的中断优先执⾏,等⾼优先级中断执⾏完之后在返回去执⾏被打断的中断,这就是中断嵌套。
stm32外部中断实验原理
stm32外部中断实验原理STM32是意法半导体公司推出的一款32位单片机系列产品,具有高性能、低功耗和广泛的外设功能。
其中外部中断是其重要的功能之一,可以实现外部事件的异步处理,适用于各种实时应用。
外部中断的原理是通过外部引脚和STM32之间的触发信号来实现中断的触发和处理。
STM32支持多种中断模式,包括上升沿触发、下降沿触发、双边沿触发和低电平触发等。
如何使用外部中断呢?首先,在程序中需要使用到外部中断的引脚上要连接一个外部触发源,比如按键或传感器等。
然后,在程序中对该引脚进行配置,指定外部中断的触发方式。
接下来,在程序中编写中断处理函数,在中断触发时执行相应的处理逻辑。
最后,在启动中断之前,需要使能相应的中断,并配置优先级。
STM32外部中断是基于NVIC(Nested Vectored Interrupt Controller)的,它是ARM Cortex-M处理器的一部分。
它能够支持多重中断,并可配置中断优先级。
当一个外部中断触发时,会产生一个中断请求,然后被NVIC捕获,并根据优先级进行中断处理。
在硬件层面上,外部中断将通过外部中断控制器(EXTI)和GPIO控制器进行连接。
外部中断的引脚通过GPIO控制器配置为中断模式,并通过EXTI控制器与NVIC连接。
当外部触发源产生中断信号时,通过GPIO控制器将该中断信号传递给EXTI控制器,然后触发中断处理。
在软件编程方面,首先需要对GPIO和EXTI进行相应的初始化配置。
对于GPIO,我们需要设置引脚的模式、速度和上下拉等参数。
对于EXTI,我们需要设置中断触发方式(例如上升沿触发)和中断屏蔽(可以选择屏蔽或非屏蔽中断)等。
接着,使用STM32提供的库函数进行中断处理的配置。
首先,我们需要使用NVIC_Init函数来配置NVIC,使能相应的中断和设置中断优先级。
然后,使用EXTI_Init函数设置外部中断的触发方式和屏蔽等。
最后,编写中断处理函数,当外部中断触发时进行相应的处理。
STM32外部中断总结
STM32 外部中断配置总结一:触发方式STM32 的外部中断是通过边沿来触发的,不支持电平触发;二:外部中断分组STM32 的每一个GPIO 都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。
STM32 分组和对应中断处理函数分配:三:外部中断的配置过程配置触发源 -GPIO触发源为通过GPIO 端口输入,所以,要配置GPIO 的模式,输入方式,输入方式有以下几种:1.GPIO_Mode_AIN ,模拟输入(ADC 模拟输入,或者低功耗下省电)2.GPIO_Mode_IN_FLOATING ,浮空输入3.GPIO_Mode_IPD = 0x28,带下拉输入4.GPIO_Mode_IPU = 0x48,带上拉输入管脚 中断标志 中断处理函数分配PA0~PG0 EXTI0 EXTI0_IRQHandlerPA1~PG1 EXTI1 EXTI1_IRQHandlerPA2~PG2 EXTI2 EXTI2_IRQHandlerPA3~PG3 EXTI3 EXTI3_IRQHandler PA4~PG4 EXTI4 EXTI4_IRQHandler PA5~PG5 EXTI5 EXTI9_5_IRQHandler PA6~PG6 EXTI6 PA7~PG7 EXTI7 PA8~PG8 EXTI8 PA9~PG9 EXTI9 PA10~PG10 EXTI10 EXTI15_10_IRQHandler PA11~PG11 EXTI11 PA12~PG12 EXTI12 PA13~PG13 EXTI13 PA14~PG14 EXTI14 PA15~PG15 EXTI15●引脚与外部中断关联●外部中断AFIO时钟开启●外部中断配置这个主要是中断线路选择,中断触发方式,中断使能。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
外部中断的初始化过程:
1.初始化IO为输入(可以设置上拉,下拉,浮空)
2.开启IO复用时钟
3.开启与该IO相对的线上(详解下)
4.配置NVIC,使能中断
5.编写中断服务函数
外部中断:
Stm32中总共有19个外部中断
包括:
线0-15:IO输入中断(每条线上最多有7个IO,如GPIOA~GPIOG,但是每一条线每次只允许同时连接到一个IO)
线16:PVD
线17:RTC
线18:USB
关于优先级:
CM3中内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置
Stm32目前支持84个中断(16个内核+68个外部,注:不是指68个外部中断),16级可编程优先级(优先级设置寄存器中使用了4位)
注意:其中外部中断5-9和中断10-15向量存放在一起
优先级:
数值低的优先级要高于数值高的!!!!!!
上电复位后,系统默认使用的是组0;
一个系统只能使用一组优先级组,不可使用多个,优先级的设置不能超过组的范围,否则会产生不可预计的错误
1.高抢先级的中断可以打断低优先级的中断响应,构成中断嵌套
2.相同抢先级的中断不可以构成嵌套,系统会优先响应子优先级高的
3.当2(n)个相同抢先优先级和相同子优先级的中断出现,STM32首先响应中断通道所对应的中断向量地址低的那个中断
4.0号抢先优先级的中断,可以打断任何中断抢先优先级为非0号的中断;1号抢先优先级的中断,可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。
5.所有外部中断通道的优先级控制字PRI_n也都是0,68个外部中断通道的抢先优先级都是0号,没有子优先级的区分。
不会发生任何的中断嵌套行为,谁也不能打断当前正在执行的中断服务。
当多个中断出现后,则看它们的中断向量地址:地址越低,中断级别越高,STM32优先响应。