STM32中断系统概述

中断的基本概念

日常生活中的中断

在这里插入图片描述

处理器中的中断

在处理器中,中断是一个过程,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中止当前程序的执行,转而去为处理紧急的事件,待处理完毕后再返回被打断的程序处继续往下执行。中断在计算机多任务处理,尤其是即时系统中尤为重要。比如uCOS,FreeRTOS等。
中断能提高CPU的效率,同时能对突发事件做出实时处理。实现程序的并行化,实现嵌入式系统进程之间的切换。

中断处理过程

在这里插入图片描述

STM32F4中断的体系结构

在这里插入图片描述

NVIC的主要功能

中断管理;
支持异常及中断向量化处理;
支持嵌套中断。

中断管理

Cortex-M4 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有256 级的可编程中断优先级设置。但 STM32F4 并没有使用 Cortex-M4 内核的全部东西,而是只用了它的一部分。
Cortex-M4处理器中,每一个外部中断都可以被使能或者禁止,并且可以被设置为挂起状态或者清除状态。
在这里插入图片描述
ISER: 使能中断
ICER: 清除中断使能
ISPR: 挂起中断,若中断产生但没有立即执行,它就会被挂起
ICPR: 清除挂起,中断处理完成后应该清除挂起,表示已处理
IABR: 每个外部中断都有一个活跃状态位,当处理器正在处理时,该位会被置1
IP: 用于设置中断的优先级

中断和异常向量表

STM32F407中断和异常向量:
CM4 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断。STM32F407实际上只使用了10个内部异常和82个外部中断。
当异常或中断发生时,处理器会把PC设置为一个特定地址,这一地址就称为异常向量。每一类异常源都对应一个特定的入口地址,这些地址按照优先级排列以后就组成一张异常向量表。
向量化处理中断的好处:
传统的处理方式需要软件去完成。采用向量表处理异常,处理器会从存储器的向量表中,自动定位异常的程序入口。从发生异常到异常的处理中间的时间被缩减。
在这里插入图片描述
注:中断和异常的区别:
中断是微处理器外部发送的,通过中断通道送入处理器内部,一般是硬件引起的,比如串口接收中断。
而异常通常是微处理器内部发生的,大多是软件引起的,比如除法出错异常,特权调用异常等待。不管是中断还是异常,微处理器通常都有相应的中断/异常服务程序

嵌套中断

STM32F4中断的优先级

3个固定的优先级,都是负值,不能改变;
16个可编程优先级,用4个bit位表示;
优先级越小优先级越高。
在这里插入图片描述
在 NVIC 有一个专门的寄存器:中断优先级寄存器 NVIC_IPRx(在 F407 中,x=0…81)用来配置外部中断的优先级,IPR宽度为 8bit,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数 CM4芯片都会精简设计,以致实际上支持的优先级数减少,在 F407 中,只使用了高 4bit。

STM32F4中断的优先级分组

IPR中的4 位,又分为抢占优先级和响应优先级。抢占优先级在前,响应优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。这里简单介绍一下 STM32F4 的中断分组:STM32F4 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。
注意:工程开发中应当首先确定中断优先级分组,之后就不要再做修改了。
在这里插入图片描述
抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
同一时刻发生的中断,优先处理优先级较高的中断。
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
抢占优先级相同就看响应优先级,同样数值越小优先级越高。
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。如果同时发生则优先处理编号较小的那个。

外部中断控制器EXTI

STM32F4中断的体系结构

在这里插入图片描述

外部中断控制器EXTI

在 STM32F407中,共有最多 23 中断 / 事件线可用:
GPIO 口连接到 16 个外部中断 / 事件线
在这里插入图片描述

系统配置控制器 (SYSCFG)

该器件具有一组配置寄存器。系统配置控制器的主要用途如下:
● 重映射存储器到代码起始区域。
● 管理连接到 GPIO 口的外部中断。
● 管理系统的可靠性特性。
SYSCFG 外部中断配置寄存器 1-4 (SYSCFG_EXTICR1—4)
在这里插入图片描述

按键中断实验

CubeMX配置

按键硬件连接: 按键一个引脚接GND,另一个引脚接STM32的IO口。
参数配置:
在这里插入图片描述
GPIO mode: 可选择上升沿、下降沿、上升沿和下降沿触发;
GPIO Pull-up/Pull down: 给对应的IO口设置上拉,即保持高电平,按键一端接地,当按键按下时IO口变低电平。
在这里插入图片描述
打开相应的外部中断。
注意:由于软件部分使用了系统定时器函数HAL_Delay()来按键消抖,所以系统定时器的优先级要低于按键外部中断优先级,否则进入中断时会卡死在消抖处。(我用CubeMX建立工程时系统定时器的优先级默认最低的)

实验程序设计

直接重写外部中断回调函数HAL_GPIO_EXTI_Callback()即可:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == KEY_Pin)
    {
		HAL_Delay(20);
		if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET)
		{
		  printf("KEY is Down!\n");
		}
		if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET)
		{
		  printf("KEY is UP!\n");
		}
    }
	
	if(GPIO_Pin == KEY0_Pin)
    {
		HAL_Delay(20);
		if(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)
		{
		  printf("KEY0 is Down!\n");
		}
		if(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_SET)
		{
		  printf("KEY0 is UP!\n");
		}
    }
}
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  
  printf("This is key0_exti test!\n");
  while (1)
  {
  }
}

在这里插入图片描述

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐