中断机制许可系统对实时事宜做出及时相应,而不必用循环去等待特定事宜的发生。
2. 中断在嵌入式系统中的浸染和主要性在嵌入式系统中,特殊是在实时系统中,对一些事宜的即时相应至关主要。例如:传感器数据的读取、定时器溢出、外部输入旗子暗记等都是须要及时处理的事宜。
利用中断可以确保系统能够在这些事宜发生时立即作出相应,而不会由于等待而造成延迟或丢失数据。
3. STM32中断的概述STM32系列微掌握器供应了丰富的中断支持,包括但不限于外部中断、定时器中断、串口中断和DMA中断等。STM32F10x芯片有84个中断通道,包括16个内核中断和68个可屏蔽中断,在《STM32F10x中文参考手册》第65页有向量表进行了详细先容,摘录如下:
4. 中断的优先级
在STM32系列微掌握器中,中断优先级决定了当多个中断同时发生时,哪一个中断将被优先处理。
4.1 中断优先级级别中断优先级常日是一个整数,STM32F103利用中断优先级掌握字节的高4位,0为最高优先级,15为最低优先级。STM32系列微掌握器常日将中断分为多个组,每个组有自己的优先级范围。例如,对付外部中断,可以有4个组,每个组可以有16个优先级。
4.2 中断优先级分类以下是几种常见的中断优先级分类办法:
(1)硬件优先级硬件优先级是指微掌握器硬件供应的中断优先级机制。在STM32系列微掌握器中,中断的硬件优先级常日是一个数字,数字越小,优先级越高。例如,优先级0是最高优先级,15是最低优先级。开拓者可以根据须要为每个中断设置不同的硬件优先级。
(2)相应速率优先级相应速率优先级是根据中断须要被多快地相应来确定的。一些紧急事宜可能须要立即得到处理,因此这些中断会被分配更高的优先级,以确保系统能够及时相应。例如,定时器溢出中断可能比普通外部中断更加紧急,因此可以为定时器中断分配更高的优先级。
(3)主要性优先级主要性优先级是根据中断对系统功能的主要性来确定的。一些关键的系统功能可能须要被优先处理,以确保系统的正常运行。例如,系统故障中断可能比其他一样平常中断更加主要,因此可以为系统故障中断分配更高的优先级。
(4)任务优先级任务优先级是根据中断所实行的任务的主要性来确定的。系统中可能存在多个任务,这些任务有不同的优先级。中断的优先级可以根据所实行的任务的主要性来确定,以确保系统能够优先处理主要任务。
4.3 中断优先级设置在STM32中,中断优先级的设置是通过NVIC(Nested Vectored Interrupt Controller,嵌套向量中断掌握器)进行的。
NVIC属于M3内核的一个外设,掌握着芯片的中断功能。ARM给NVIC预留的功能比较多,而M3内核进行了裁剪。
中断掌握器干系的寄存器在固件库的core_cm3.h 文件NVIC构造体里定义,常见的寄存器有:
NVIC_ISERx 利用中断寄存器NVIC_ICERx 禁用中断NVIC_ISPRx 设置中断挂起NVIC_ICPRx 打消中断的挂起状态NVIC_IPRx 设置中断优先级NVIC_STIR 用于软件触发中断NVIC_ICSR 供应了一些中断干系的状态和掌握位我们可以通过NVIC接口函数来配置中断的优先级,常用的函数包括NVIC_SetPriority()和NVIC_SetPriorityGrouping()等。通过这些函数,可以将不同中断设置为不同的优先级,并根据实际需求进行灵巧配置。
4.4 中断优先级规则在设置中断优先级时,须要遵照一定的规则,以确保系统的精确性和稳定性:
优先级较低的中断可以被较高优先级的中断抢占。换句话说,当一个中断正在实行时,如果发生了优先级更高的中断,系统会立即转去实行更高优先级的中断做事程序。优先级相同的中断,先被触发的中断会先被处理。即如果多个中断同时发生,并且优先级相同,则先触发的中断会先得到处理。二、STM32中断编程1. 利用能外设某个中断(1)使能中断(2)配置中断触发条件2. 设置中断优先级分组初始化 NVIC_InitTypeDef 构造体:
typedef struct{ uint8_t NVIC_IRQChannel;// 中断源设置 uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占优先级 uint8_t NVIC_IRQChannelSubPriority; // 相应优先级 FunctionalState NVIC_IRQChannelCmd; // 中断使能或失落能}1234567
NVIC_IRQChannel中断源可以在 stm32f10x.h 头文件中查到:
3. 编写中断做事函数void EXTI0_IRQHandler(void){ // 处理外部中断0发生时的事宜 // 例如,读取外部输入引脚状态、打消中断标志等 // 打消中断挂起标志位 EXTI_ClearITPendingBit(EXTI_Line0);}
中断做事的函数名称在启动文件中定义,建议不要修正:
三、外部中断1. 观点外部中断是STM32系列微掌握器中的一种中断类型,它许可外部事宜(如外部输入引脚状态的变革)触发中断,从而使系统能够实时相应外部的输入旗子暗记。外部中断常用于处理外部设备的输入,如按钮、传感器等。
2. EXTI外部中断线路管理器(External Interrupt/Event Controller,EXTI)是STM32系列微掌握器中的一个主要外设,用于管理外部中断和事宜的触发和处理。
STM32F10x EXTI包含多达19个用于产生事宜/中断要求的边沿检测器。
EXTI许可外部事宜(例如GPIO引脚状态的变革)触发中断,可以选择类型(中断或事宜)和相应的触发事宜(上升沿触发、低落沿触发或边沿触发),从而实现对外部输入旗子暗记的实时相应。还可以独立地屏蔽EXTI中断。
下面是部分EXTI中断向量表:
除了EXTI, 其余 RTCAlarm、USB唤醒、PVD电源检测中断、ETH_WKUP 等外部中断。
3. EXTI 框图4. EXTI中断/事宜线路
EXTI线路
解释
EXTI 线 0~15
对应外部IO 口的输入中断
EXTI 线 16
连接PVD输出
EXTI 线17
连接到RTC闹钟事宜
EXTI 线 18
连接到USB唤醒事宜
EXTI 线19
连接到以太网唤醒事宜,联网型芯片
5. 外部中断利用步骤使能外部中断:通过配置外部中断线路管理器(EXTI)和GPIO外设,使能外部中断功能; // 使能外部中断线0 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // 外部中断0 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01; // 抢占优先级为1 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01; // 相应优先级为1 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct);
开启AFIO 时钟,设置IO口与中断线映射关系;配置中断分组,使能中断;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 选择优先级分组办法,这里选择分组2
初始化EXTi,选择触发办法;初始化利用 EXTI_InitStruct 函数;
// 初始化外部中断线路管理器(EXTI) EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line = EXTI_Line0; // 利用外部中断线0 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 设置为中断模式 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发 EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 使能外部中断线0 EXTI_Init(&EXTI_InitStruct);
编写EXTI中断做事函数EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI5_10_IRQHandler6. 示例
本实例利用的开拓板 GPIO 按键电路:
对付开拓板的K1、K2、K3 利用低落沿触发,KEY_UP 利用上升沿触发。对应的引脚:
KEY_UP:GPIOA GPIO_Pin0 引脚KEY_LEFT:GPIOE GPIO_Pin2 引脚KEY_RIGHT:GPIOE_GPIO_Pin4 引脚KEY_DOWN:GPIOE_GPIO_Pin3 引脚(1)exti_utils.h#ifndef __exti_utils_h__#define __exti_utils_h__#include "stm32f10x.h"void custom_exti_init(void);#endif
(2)exti_utils.c
#include "exti_utils.h"#include "stdio.h"#include "sys_tick_utils.h"#include "led_utils.h"#include "key_utils.h"/ @brief 外部中断初始化/void custom_exti_init(void) { // 开启AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // GPIO 引脚映射到 EXTI 中断线 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // GPIOE 映射到 EXTI 中断线 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2); GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3); GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); // 配置外部中断0的优先级 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02; // 抢占优先级为1 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x03; // 相应优先级为3 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02; // 抢占优先级为1 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02; // 相应优先级为2 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02; // 抢占优先级为1 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x1; // 相应优先级为1 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02; // 抢占优先级为1 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0; // 相应优先级为0 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); // 初始化外部中断线路管理器(EXTI) EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line = EXTI_Line0; // 外部中断线0 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发 EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 使能外部中断线0 EXTI_Init(&EXTI_InitStruct); EXTI_InitStruct.EXTI_Line = EXTI_Line2; // 外部中断线2 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; // 低落沿触发 EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 使能外部中断线0 EXTI_Init(&EXTI_InitStruct); EXTI_InitStruct.EXTI_Line = EXTI_Line3; // 外部中断线2 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; // 低落沿触发 EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 使能外部中断线0 EXTI_Init(&EXTI_InitStruct); EXTI_InitStruct.EXTI_Line = EXTI_Line4; // 外部中断线2 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; // 低落沿触发 EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 使能外部中断线0 EXTI_Init(&EXTI_InitStruct);}/ @brief 外部中断0中断做事函数/void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { delay_ms(10); if (key_up_value == 1) { led_lightn(0); EXTI_ClearITPendingBit(EXTI_Line0); // 打消中断标志位 return; } }}/ @brief 外部中断2中断做事函数/void EXTI2_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line2) != RESET) { delay_ms(10); if (key_left_value == 0) { led_lightn(2); EXTI_ClearITPendingBit(EXTI_Line2); // 打消中断标志位 return; } }}/ @brief 外部中断3中断做事函数/void EXTI3_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line3) != RESET) { delay_ms(10); if (key_down_value == 0) { led_lightn(1); EXTI_ClearITPendingBit(EXTI_Line3); // 打消中断标志位 return; } }}/ @brief 外部中断4中断做事函数/void EXTI4_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line4) != RESET) { delay_ms(10); if (key_right_value == 0) { led_lightn(3); EXTI_ClearITPendingBit(EXTI_Line4); // 打消中断标志位 return; } }}
本示例的功能,在按下按键后,分别利用LED显示 0,1,2,3。
六、定时器中断1. 简介STM32F1系列微掌握器供应了多种定时器模块,包括:
2个 基本定时器(TIM6和TIM7):用于天生大略的定时中断,适用于一些大略的定时任务。4个 通用定时器(TIM2至TIM5):具有更多的功能和配置选项,可以实现更繁芜的定时任务和PWM输出等功能。2个 高等定时器(TIM1、TIM8):功能最为丰富的定时器,可以用于高等的PWM掌握、编码器接口、脉冲捕获等运用。通用定时器常日挂接在APB1;高等定时器常日挂载在AHB上。2. 通用定时器简介STM32F1的通用定时器包含一个 16位 自动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。通用定时器支持多种事情模式,包括定时器模式、定时器中断模式、PWM输出模式、输入捕获模式和输出比较模式等。
利用定时器预分频器和RCC时钟掌握器预分频器,脉冲长度和波形周期可以在几个微秒至几个毫秒间调度。通用定时器框图:
(1)时基单元通用定时器的时基单元是指定时器的基本计时单元,它决定了定时器计数的频率和精度。时基单元包括 :
计数器寄存器(TIMx_CNT),16位;预分频器寄存器(TIMx_PSC),16位,在1~65535之间取值;自动装载寄存器(TIMx_ARR)。预分频系数用来将定时器的时钟频率降落到一个得当的范围,以适应详细的运用需求,它的值是一个正整数,常日可以通过以下公式来打算:
[ \text{实际频率} = \frac{\text{时钟源频率}}{\text{预分频系数}} ]
(2)计数器模式根据所选的计数器模式,定时器的计数器将以不同的办法进行计数。
在向上计数模式下,计数器从0开始递增;在向下计数模式下,计数器从自动重装载值开始递减;在中心对齐模式和双边沿对齐模式下,计数器的溢出值为自动重装载值的一半。不同的计数器模式适用于不同的运用处景,可以根据详细的需求选择得当的模式来实现相应的功能。
(3)时钟选择通用定时器的时钟决定了定时器的计数速率和精度。在STM32微掌握器中,通用定时器可以选择多种时钟源,包括内部时钟源和外部时钟源。
常见的时钟源:
内部时钟源(Internal Clock Source):内部时钟源是由微掌握器内部的时钟模块供应的时钟旗子暗记,常日为主时钟(HCLK)或高速内部时钟(HSI)。内部时钟源具有稳定性好、可靠性高的优点,适用于大多数运用处景。外部时钟源(External Clock Source):外部时钟源是由外部晶振或外部时钟旗子暗记供应的时钟旗子暗记,常日通过外部引脚输入到微掌握器内部。外部时钟源具有精度高、抗滋扰能力强的特点,适用于对时钟精度有较高哀求的运用处景。(4)输入通道通用定时器包含4个独立通道(TIMx_CH1-4),每个通道对应芯片的引脚,如下图所示:
(5)捕获通道捕获通道是通用定时器(TIM)中用于捕获外部事宜(如输入脉冲)韶光戳的通道。在捕获模式下,定时器可以监视一个外部旗子暗记的边沿触发,并记录下此时计数器的值,从而得到外部事宜的韶光戳信息。捕获通道常日用于丈量脉冲宽度、频率、周期等运用处景,其紧张特点:
外部事宜捕获:捕获通道许可定时器监视外部旗子暗记的变革,如上升沿或低落沿,以捕获外部事宜的韶光戳。多通道支持:通用定时器常日支持多个捕获通道,每个通道可以独立地捕获外部事宜的韶光戳。精确度高:由于定时器的高精度计数器和硬件触发机制,捕获通道可以实现很高的韶光精度和稳定性。(6)定时器级联如果利用外部旗子暗记掌握定时器,可实现多个定时器互连(利用一个定时器掌握另一个定时器)。
(7)定时器中断通用定时器(TIM)在STM32微掌握器中可以产生多种类型的中断,常见的中断包括:
更新中断(Update Interrupt):当定时器的计数器溢出或者自动重装载值被加载到计数器时,会产生更新事宜,从而触发更新中断。更新中断是定时器最基本的中断类型,用于处理定时器计数周期结束时的事宜。比较/捕获中断(Compare/Capture Interrupt):定时器可以配置为输出比较模式或输入捕获模式,在这些模式下,当计数器的值与比较值相等或者外部事宜触发捕获时,会产生比较/捕获事宜,从而触发比较/捕获中断。比较/捕获中断用于处理定时器与外部事宜的干系操作。触发中断(Trigger Interrupt):定时器可以配置为外部时钟模式或触发输入模式,在这些模式下,当外部触发事宜到来时,会产生触发事宜,从而触发触发中断。触发中断用于处理外部触发事宜的干系操作。DMA要求中断(DMA Request Interrupt):当定时器的更新、比较或捕获事宜发生时,可以产生DMA要求,从而触发DMA要求中断。DMA要求中断用于处理DMA传输干系的操作。3. 定时韶光打算公式定时器定时韶光的公式可以通过以下办法进行打算:
4. 配置步骤
通用定时器的配置步骤常日包括以下几个关键步骤:
(1)选择定时器模块首先确定要利用的通用定时器模块,常日有 TIM1、TIM2、TIM3、TIM4 等可供选择,根据详细的需求选择得当的定时器模块。
(2) 初始化时钟// 使能TIM4时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
(3)初始化定时器参数
须要初始化自动重装值,分频系数,计数办法等。
// 定时器配置 TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Prescaler = 36000 - 1; // 预分频系数,1~65535,实际值会自动加1 TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_InitStruct.TIM_Period = 1000; // 自动重装载值,即定时器周期 TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频 TIM_InitStruct.TIM_RepetitionCounter = 0; // 重复计数器,高等计数器利用 TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
这里打算的定时韶光为:
个中的频率是APB1总线频率2。
(4)设置定时器中断类型,并使能// 定时器配置 TIM_TimeBaseInitTypeDef TIM_InitStruct; // 此处配置定时器的参数,如预分频系数、计数器模式、自动重装载值等 // 初始化定时器 TIM_TimeBaseInit(TIM2, &TIM_InitStruct); // 使能更新中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
(5)使能
// 使能定时器 TIM_Cmd(TIM2, ENABLE);
(6)配置中断优先级
// 配置定时器中断优先级 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct);
(7)中断做事函数
void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // 处理定时器更新中断事宜 // 打消中断标志位 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); }}
5. 示例
本示例通过定时器中断掌握LED闪烁。
(1)timx_utils.h#ifndef __TIMX_UTILS_H__#define __TIMX_UTILS_H__#include "stm32f10x.h"void timx_init(u16 preriod, u16 psc);void timx_init_ms(u16 ms);#endif
(2)timx_utils.c
#include "timx_utils.h"#include "led_utils.h"#include "stm32f10x.h"/ @brief 初始化定时器 @param preriod: 自动重装载寄存器周期值 @param prescaler: 时钟预分频数/void timx_init(u16 preriod, u16 prescaler){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseStructure.TIM_Period = preriod; TIM_TimeBaseStructure.TIM_Prescaler = prescaler; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 初始化 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); // 中断使能 TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); // 使能定时器 TIM_Cmd(TIM4, ENABLE); // 中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);}/ @brief 初始化定时器 @param ms: 定时器中断韶光/void timx_init_ms(u16 ms){ // 直接调用 timx_init 函数 timx_init(ms2, 36000-1);}static u8 n=0;void TIM4_IRQHandler(void){ if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { led_lightn(n); n++; if(n>9){ n=0; } TIM_ClearITPendingBit(TIM4, TIM_IT_Update); }}
(3)main.c
#include "gpio_utils.h"#include "stm32f10x.h"#include "sys_tick_utils.h"#include "led_utils.h"#include "exti_utils.h"#include "timx_utils.h"// 主函数int main(void){ GPIO_Configuration(); //调用GPIO配置函数sys_tick_init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 定时器的时钟频率是72MHz,预分频系数是36000,// 以是定时器的时钟频率是72MHz/36000=2KHz,周期是1000,// 以是定时器的周期是1000/2KHz=0.5stimx_init_ms(1000);led_all_off(); while (1) //无限循环 {delay_ms(10); }}
七、中断嵌套1. 观点
中断嵌套是指在一个中断做事程序(ISR)中许可发生另一个中断的情形。大略来说,便是当一个中断正在处理时,如果发生了另一个中断,系统能够暂时中断当前的中断处理流程,转而处理新的中断要求,待新的中断处理完成后再返回连续处理原来的中断。
在嵌套中断系统中,常日存在多个中断优先级,每个中断都有其自己的优先级,高优先级的中断可以抢占正在实行的低优先级中断。这样可以确保高优先级的事宜能够得到及时处理,提高了系统对紧急事宜的相应能力。
2. 中断的实现办法中断嵌套的实现常日须要硬件和软件的支持。
硬件须要供应支持多级中断优先级的中断掌握器,如STM32系列微掌握器中的嵌套向量中断掌握器(NVIC)。软件方面则须要编写得当的中断做事程序,并在个中实现中断优先级的管理和中断处理的逻辑。本文代码开源地址:https://gitee.com/xundh/stm32_arm_learn