外部中断的使用

 

 

一,项目目的

该项目打算利用外部中断,来控制一盏小灯打断另一盏持续闪烁的小灯。

 

 

二,新建工程进行初始化配置

点击蓝色星星选择我们收藏的STM32F103C8T6型号芯片

将引脚配置如下,PA7和PA6是LED小灯的输出引脚,配置为GPIO_Output输出模式,PA2为按键引脚,设置为GPIO_EXTI2外部中断事件线2。

点击左边GPIO,为选中的引脚配置具体的模式及参数

如图可以看到,我们选择PA2为EXTI2,所以这里出现了关于外部中断的配置,模式配置从上到下分别为,上升沿触发中断,下降沿触发中断,上升沿和下降沿都触发中断,在我们小学二年级就学过,当我们按下按键时,会给单片机输入一个低电平,所以当然我们这里需要将外部中断设置为下降沿触发。

对于PA7和PA6的引脚配置保持不变。

之后点击NVIC对外部中断线2进行优先级配置,将底下的EXTI line2选项勾选

最后使用快捷键Ctrl+S保存设置等待自动初始化代码即可。

 

 

三,代码部分实现基本功能

1,实验思路

先初始化PA7上的小灯,使其以1000ms的速率持续闪烁,之后通过判断位于PA2引脚上的按键电平来点亮PA6上的小灯,期间PA7上的小灯不再按照正常顺序闪烁,而是直接熄灭。这便需要运用到外部中断,当按键按下时跳出PA7小灯的循环闪烁程序,直接执行点亮PA6小灯的代码。

2,代码部分

每隔1000ms翻转一次PA7小灯电平

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_Delay(1000);

找到STM32CubeIDE为我们生成的中断服务程序,双击stm32f1××_it.c文件进入中断程序代码的执行文档

找到右边大纲最后一个EXTI2_IRQHandler(void),这就是软件为我们生成的执行EXTI2事件线的中断服务程序,没有大纲的话,直接下滑也可以找到这个函数,我们就要在这里书写我们的中断程序。

之后在EXTI2_IRQHandler(void)函数里,写以下代码

HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6);
}

通过读取按键按下的低电平来翻转PA6LED灯的电平实现亮灭。

3,注意事项

但需要注意的是,由于在中断服务程序里加入了延时函数进行对按键的软件消抖,但延时函数的优先级要比中断服务程序低,为了使延时函数生效,所以需要更改优先级。

我们来到之前勾选EXTI line2的位置,将他的优先级改的比Time base要低即可。

 

 

四,实验现象分析

现象可以看出,当按下按键时,位于PA7的红灯不再闪烁,位于PA6的蓝灯常亮,符合实验预期。

 

 

五,实验小结

本项目使用了外部中断,并对优先级也进行了配置,代码依旧是非常简单的点灯,只是将对于PA6的翻转电平部分放入了中断服务程序中,利用按下按键触发低电平执行中断服务程序达到给PA6翻转电平并阻止PA7小灯闪烁的的目的。通过这个小项目,希望大家可以学会利用STM32CubeIDE来进行对外部中断及优先级的初始化。需要学习的还有很多,小项目也有很多需要改进的部分,希望以后可以写出更加厉害的代码,也能写出更好的文章!!!

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐