前言
当涉及到STM32基础的外部中断时,我们进入了一个引人入胜的领域,它允许微控制器与外部世界进行互动并实时响应各种事件。外部中断是STM32系列微控制器的一个强大功能,它允许我们在特定条件下中断当前的程序执行,以执行一些特殊的任务或处理来自外部世界的事件。
在这个系列的教程中,我们将深入研究STM32外部中断的基础知识和应用。我们将探讨以下关键主题:
1.什么是外部中断? 我们会解释外部中断的概念以及它在嵌入式系统中的作用。
2.STM32外部中断引脚 我们将了解如何配置和使用STM32微控制器上的外部中断引脚,包括选择引脚、配置触发方式和中断优先级。
3.编程STM32外部中断 我们将介绍如何使用STM32的HAL库或Cubemx来编程配置和管理外部中断。
4.外部中断的应用 我们将讨论一些常见的应用场景,包括按钮按下检测、传感器触发以及实时事件处理。
通过这个系列,你将能够掌握如何在STM32微控制器上利用外部中断来增强你的嵌入式系统的交互性和实时响应能力。无论你是初学者还是有一定经验的开发者,这个系列都将帮助你更好地理解和利用STM32的外部中断功能。让我们开始吧,一起探索外部中断的奥秘!
一、中断是什么
中断就像你在忙于一项任务时,突然听到电话铃响,于是你中断当前的工作,去接电话。在计算机和嵌入式系统中,中断是一种类似的概念。它是一种机制,允许计算机或微控制器在执行某个任务时,临时中止当前工作,处理一个重要事件,然后再返回原来的任务。
具体来说,中断是一种通信方式,用于向计算机或微控制器提供外部事件的通知。这些外部事件可以是各种事情,比如按下键盘上的按键、传感器检测到某个条件变化、网络数据到达等等。当一个中断事件发生时,计算机或微控制器会停下手头的工作,跳转到一个特定的处理程序(中断处理程序)来处理这个事件。一旦事件被处理完毕,计算机或微控制器会回到之前的工作状态,就像你挂断电话后又回到了之前的工作一样。
中断使得系统可以高效地响应外部事件,而不需要持续地检查这些事件是否发生。这对于实时控制和处理异步事件非常重要。因此,中断是计算机和嵌入式系统中一种重要的事件处理机制。
二、使用CubeMX配置你的第一个中断
1、我们可以点击一个GPIO,一般是按钮这些,然后设置为exit
2、设置按钮的上下拉模式:
3、把中断启用
4、选择中断触发方式
中断触发方式有上升沿和下降沿。
他们的是什么,我们该如何选择:
上升沿:
想象一下,你站在一个楼梯上,然后你开始往上爬。每当你迈过一级楼梯的边缘,这就好比一个信号从低电平(在楼梯下方)变成高电平(在楼梯上方)。这个变化点就是上升沿。所以,上升沿就是从低到高的变化,就像你从楼梯下爬到楼梯上一样。
在电子领域,上升沿通常表示电压信号从低电平变为高电平的瞬间。
下降沿:
现在,反过来想象一下,你站在楼梯上,然后你开始往下走。每当你走到一级楼梯的边缘,这就好比一个信号从高电平(在楼梯上方)变成低电平(在楼梯下方)。这个变化点就是下降沿。所以,下降沿就是从高到低的变化,就像你从楼梯上走到楼梯下一样。
在电子领域,下降沿通常表示电压信号从高电平变为低电平的瞬间。
综合起来,上升沿和下降沿描述的是信号电平的变化,就好比你在楼梯上下行时,每一级楼梯的变化一样。
他的选择:按下去如果是上拉:我们就需要下降沿,如果是下拉:我们就需要上升沿
最后,让我们生成代码!
三、代码分析CubeMX
/*Configure GPIO pin : PE4 */ GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI4_IRQn);
代码分析:
GPIO_InitStruct.Pin = GPIO_PIN_4;:指定要配置的GPIO针脚为GPIO_PIN_4,即针脚PE4。
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;:配置GPIO工作模式为中断触发模式,而且是下降沿触发(IT_FALLING,即在下降沿触发中断)。
GPIO_InitStruct.Pull = GPIO_PULLUP;:配置GPIO针脚上拉,意味着在没有外部信号时,该引脚被拉高(逻辑上是1)。
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);:使用上述配置初始化GPIOE中的指定针脚,即PE4。
/* EXTI interrupt init*/:这是一段注释,说明接下来要初始化外部中断(EXTI)的配置。
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);:设置外部中断EXTI4的中断优先级,此处设置为优先级0,亚优先级0。
HAL_NVIC_EnableIRQ(EXTI4_IRQn);:使能外部中断EXTI4的中断处理,即允许该中断触发时执行相应的中断服务程序。
四、中断函数
当中断产生后,他会进入一个函数中执行函数中的东西,函数原型如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
参数为触发中断的GPIO_Pin
我们需要实现他。
按键中断点灯示例代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { static char state = 0; HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, state); state = !state; }
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin):这是一个函数的声明,名称为HAL_GPIO_EXTI_Callback,接受一个参数GPIO_Pin,它表示触发中断的GPIO引脚的标识(通常是一个数字)。
{:这标志着函数的开始。
static char state = 0;:这行代码定义了一个静态(static)变量state,并将其初始化为0。静态变量在函数调用之间保持其值,即使函数调用完毕也不会丢失其值。
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, state);:这行代码调用了HAL库中的函数HAL_GPIO_WritePin,它用于控制GPIO引脚的电平状态。在这里,它将GPIOB引脚5的状态设置为state的值。这意味着,每次触发中断时,GPIOB的引脚5的状态会在0和1之间切换。
state = !state;:这行代码将state的值取反,所以如果state是0,它将变成1,反之亦然。这个操作确保了每次中断触发时,GPIO引脚的状态都会切换。
}:这标志着函数的结束。
总的来说,这个函数用于处理外部中断,每次触发中断时,它会将GPIO引脚的状态在0和1之间切换,从而实现了一种简单的状态切换操作。这种模式在许多应用中用于切换设备状态或控制LED等外部设备。
总结
对于中断的使用是非常简单的,只需要在cubemx里面配置一下,写一个函数实现,很快就可以实现中断的效果!