零基础学STM32(八)-外部中断实验

本项目讲解所用工程均使用stm32f103C8T6芯片HAL库版本。

目录

原理讲解

初始化配置

代码书写


原理讲解

本节内容我们讲解外部中断实验,实验的效果和零基础学STM32(七)-按键控制LED灯实验效果一样,我们通过检测中断条件是否实现控制LED的点亮与熄灭,上一节的获取IO口的状态属于软件控制,而中断则属于硬件控制,具有高效性和便捷性,同时有效利用CPU资源。

什么是中断

中断是处理外部事件或内部异常的一种机制。

当发生某个约定好事件时,控制器可以暂停当前正在执行的任务,转而处理这个事件,处理完毕后再返回原来的任务。这种机制允许控制器高效地响应外部或内部事件,而无需持续检查这些事件的状态。举个简单的例子,我和小圣约好了中午一点去踢球,那么到了中午一点小圣就会停下手中的其他事儿和我去踢球。中午一点是中断约定好的“条件”,而踢球是达成中断后执行的任务。后续我们会出相关的讲解。

为什么需要学习中断

响应实时性:外部中断可以使得系统能够迅速响应外部事件,这对于需要实时处理的任务来说至关重要。

提高效率:通过外部中断,CPU不需要不断地轮询检查外部设备的状态,从而可以更有效地利用CPU资源,提高系统整体效率。

多任务处理:外部中断允许CPU在执行当前任务的同时,还能处理其他紧急任务,从而实现多任务处理

什么是中断源

中断源是指能够触发中断事件的硬件或软件实体。在中断驱动的系统中,中断源可以是一个硬件设备,也可以是一个软件产生的信号,它们能够向处理器发送中断请求(IRQ),请求处理器暂停当前正在执行的任务,转而执行相应的中断服务例程(ISR)来处理这个中断请求。

举一些常见例子:

外部中断(EXIT):如按钮按下、外部设备信号触发等,通过外部中断/事件控制器来管理。

定时器中断:当定时器计数达到预设值时,会产生中断。

串行通信中断:如UART、SPI、I2C等通信接口的数据接收完成或发送完成。

DMA中断:直接内存访问操作完成或出现错误时。

ADC中断:模拟数字转换完成时。

什么是中断控制器

中断控制器是一种硬件电路,在STM32中指的是NVIC,它的主要功能是管理计算机系统中的中断请求(IRQ)。中断控制器负责接收来自多个中断源的中断信号,对这些信号进行优先级排序、仲裁,并将它们转发给中央处理单元(CPU)或其他处理单元。这样,CPU就不需要不断地轮询各种设备以查看它们是否需要服务,而是可以响应中断控制器发出的中断,从而更高效地处理多个并发任务。

中断源与中断控制器的关系

中断发生:当某个中断源需要服务时,它会向中断控制器发送一个中断请求。

中断识别:中断控制器识别中断请求,并确定其优先级。

中断响应:中断控制器通知CPU有一个中断请求需要处理,通常通过引发一个硬件中断。

中断处理:CPU响应中断,暂停当前任务,保存上下文,并根据中断向量调用相应的中断服务例程(ISR)。

服务完成:中断服务例程执行完毕后,CPU恢复被中断的任务,并继续执行。

通过这种关系,中断源和中断控制器共同确保了计算机系统能够及时响应各种异步事件,而不会因为轮询或等待而降低系统性能。

初始化配置

 接下来我们利用Cubemx进行HAL库的初始化配置,建立工程的部分我们这里就直接快速完成,不了解的同学可以看我之前的新建工程部分零基础学STM32(二)-新建工程-CSDN博客

创建工程后,还是老步骤,我们首先配置时钟,将时钟设置为外部高速时钟

再配置相应时钟树,将总频设置为32MHz

设置完时钟树,我们初始化对应的IO口(最小板上的LED灯为PC13)用于控制高低电平的输出,这里我们将LED初始状态设置为高电平。

接下来配置外部中断,我们来简单了解一下需要配置的函数。

(中断)上升沿触发:检测到由低电平变为高电平的上升沿而触发相应的中断

(中断)下降沿触发:检测到由高电平变为低电平的下降沿而触发相应的中断

(中断)上升沿和下降沿触发:检测到由低电平变为高电平的上升沿或者检测到由高电平变为低电平的下降沿,而触发相应的中断

(事件)上升沿触发:检测到由低电平变为高电平的上升沿而触发相应的事件

(事件)下降沿触发:检测到由高电平变为低电平的下降沿而触发相应的事件

(事件)上升沿和下降沿触发:检测到由低电平变为高电平的上升沿或者检测到由高电平变为低电平的下降沿,而触发相应的事件

目的:事件上升沿触发是为了标志事件或驱动系统动作,而中断上升沿触发是为了让CPU及时响应并处理外部事件。

处理机制:事件上升沿触发可能不涉及CPU中断,而中断上升沿触发必然涉及CPU中断和ISR的执行。

响应级别:中断上升沿触发通常要求更快的响应时间,因为它涉及到硬件层面的中断机制

我们这里选择中断下降沿触发搭配上拉输入,按键默认状态为高电平,当按键按下时产生下降沿触发中断。

同时我们需要使能NVIC嵌套向量中断控制器。

紧接着输出工程,将必要的内容勾选和填写一下即可。注意!!!文件路径中不要出现中文

接下来打开工程即可

代码书写

我们打开GPIO的库文件,找到回调函数。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

 

在主函数上方编写回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_8)
 {
	while(GPIO_PIN_8 == 0);
	if (HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == 0 )
	{
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
	}
 }
}

然后编译,下载

实现的效果和上一节是一样的,但利用到的知识是不同的。

这一节的内容就到这儿。

作者:彧佑

物联沃分享整理
物联沃-IOTWORD物联网 » 零基础学STM32(八)-外部中断实验

发表回复