锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

STM32CubeMX+Keil+Proteus仿真实现外部中断控制LED灯

时间:2022-11-22 23:00:00 贴led专用连接器

本文说明

项目功能
一个按钮控制两个LED灯在两种状态下自由切换
一种是跑马灯,另一种是双闪

相关软件使用说明
STM32CubeMX Keil Proteus安装、使用、配置等、配置等相关
基本操作。详细介绍如下
STM32CubeMX Keil5 Proteus按键控制LED灯(入门文).

介绍外部中断

中断知识点

  1. ARM Cortex M3内核支持256个中断,包括16个中断和240个外设中断,256个中断优先级
  2. STM32的中断通道可能由多个中断源共享,这表明一个中断服务函数可能由多个中断源共享。因此,在中断服务函数的入口处,需要一个判断机制来确定哪个中断源触发了中断
  3. STM32有两个优先级:抢占优先级响应优先级
  4. Cortex M内核中有一种叫做内核的设备嵌套向量中断控制器(NVIC),它协调和控制中断。最重要的工作是控制中断使能确定中断优先级

STM32外部中断

  1. 外部中断(EXTI)是STM由于中断请求来自于32芯片实时处理外部事件的机制GPIO因此,端口的引脚被称为外部中断
  2. STM32芯片有16个外部中断源EXTI0–EXTI15.对应7个中断服务函数,其中EXTI0–EXTI四是专用,其他共用
  3. EXTI0连接引脚为:PA0–PG0,即每个端口0号引脚
    EXTI1连接引脚为:PA1–PG1.即每个端口的1号引脚等
  4. 外部中断的触发条件包括上升沿触发下降沿触发

基于STM32CubeMX外部中断的程序设计理念

  1. 在STM32CubeMX中指定引脚
  2. 设置GPIO_EXTI
  3. 设置中断触发条件
  4. 使能NVIC通道
  5. 重写该I/O引脚对应的中断回调函数

前4步在STM32CubeMX里面点一点就可以配置了,简单多了!

STM32CubeMX配置

1.指定引脚
选择PA1,PA2引脚做为LED灯的输出引脚
选择PB0引脚做为按键输入的引脚

2.将GPIO设置为GPIO_EXTI功能
右键PB0引脚,选择GPIO_EXTI0(PB0对应的连接引脚)

在这里插入图片描述
3.设置中断触发条件
在GPIO中配置PB0引脚模式外部中断,沿触发检测下降
同时设置上拉,
标签名称Key
选择时,看看英语是否对应


PA1和PA2引脚默认输出低电平,无上拉/下拉,高速输出,标签设置LED1和LED2

4.使能NVIC通道
在NVIC(内嵌向量中断控制器)"EXTI line0 interrupt",使能中断


然后设置晶振,配置时钟树,72MHz即可
最后输出生成项目代码。

Keil编辑代码逻辑

打开项目,让我们看看用户代码目录
由于在STM32CubeMX外部中断设置在中间,所以多了一个stm32f1xx_it.c文件


进入文件,找到函数EXTI0_IRQHandler()
该函数内部为外部中断服务函数,右键选择Go To Definition Of…"


这个函数可以看到if句子中有两个函数
其中HAL_GPIO_EXTI_CLEAR_IT()的作用是清除中断标志

我们需要注意的是回调函数HAL_GPIO_EXTI_Callback()
它被定义为虚函数 __weak void HAL_GPIO_EXTI_Callback(… )
作为用户,我们只需要调用重写这个虚拟函数

找到main.c粘贴我们的外部中断处理函数
注意主函数体外"Private user code"下的
/* USER CODE BEGIN 0 /
/
USER CODE END 0 */
写下我们的代码,如下图所示


设置变量EXTI_SIGN记录外部中断的次数
每次外部中断变量 1

int EXTI_SIGN = 0;                             //外部中断标志  void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) ////外部中断回调函数 { 
          EXTI_SIGN ; } 

然后我们判断变量EXTI_SIGN奇偶性切换LED灯的状态
在主函数中写入循环体的具体代码while(1)代码如下

  while (1)   { 
           ///程序功能使用外部中断按钮控制LED灯在两个状态之间切换(跑马灯和双闪)   if(EXTI_SIGN%2 == 0)   { 
            HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_RESET);    HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_RESET);
			HAL_Delay(100);
			HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_SET);
			HAL_Delay(100);			
		}
		else if(EXTI_SIGN%2 == 1)
		{ 
        
			HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_RESET);
			HAL_Delay(100);
			HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_SET);
			HAL_Delay(100);			
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

最后编译生成hex文件即可拿来仿真了

Proteus仿真

原理图如下

别忘记点击芯片选择hex文件,同时配置主频72MHz


点击左下角,仿真运行即可验证结果,这里就不展示了

总结

主要学习了外部中断的原理,然后用一个具体项目来实现外部中断

我是爱学习的诸葛铁锤,觉得有用的话点个赞哈,啾咪

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章