嵌入式- 按键中断控制LED灯

2024-02-10 01:09:41 浏览数 (1)

1. 实验目的

1.为按键K2和K3设置不同的中断优先级,K3优先级高于K2,并且K3可以打断正在执行的K2中断程序。

2.按键K2按下再弹起后,触发中断,LED3(D3)和LED4(D4)一直保持闪烁,亮灭间隔约1秒;再按下按键K3弹起后,触发高优先级中断,LED3(D3)和LED4(D4)呈现长亮(约10-20s),最后回到灯闪状态。

3.按键K3按下再弹起后,退出中断, LED3(D3)和LED4(D4)常灭。

按键中断控制LED灯是一种常见的嵌入式系统应用,通常用于微控制器(如STM32)的学习和开发。在这个应用中,当按键被按下时,会触发一个中断,然后在中断处理程序中控制LED灯的亮灭。

下面是一个简单的实现步骤:

  1. 初始化硬件:首先,你需要初始化你的硬件。这包括设置按键和LED灯的GPIO(通用输入输出)引脚,以及配置外部中断(EXTI)来检测按键的按下。
  2. 编写中断处理程序:当中断被触发时,你需要编写一个中断处理程序来控制LED灯的亮灭。在这个程序中,你可以检查LED灯的当前状态,然后切换它的状态(如果它是亮的,就熄灭它;如果它是灭的,就点亮它)。
  3. 主循环:在你的主循环中,你可以执行其他任务,而中断处理程序会在按键被按下时自动执行。

2. 实验原理

中断在嵌入式应用中占有非常重要的地位,几乎每个控制器都有中断功能。中断对保证紧急事件得到第一时间处理是非常重要的。我们设计使用外接的按键来作为触发源,使得控制器产生中断,并在中断服务函数中实现控制 LED 灯的任务。

轻触按键在按下时会使得引脚接通,通过电路设计可以使得按下时产生电平变化,见图

3. 主要仪器设备

GEC-STM32F429开发板和keil 5软件

4. 实验内容及步骤

1,首先用keil软件打开实验项目,确保可编译之后。

2,开发板使用usb连接线连接上电脑

3,然后使用点击load加载到开发板上。

4,修改代码

主函数非常简单,只有两个任务函数。LED_GPIO_Config 函数定义在 bsp_led.c 文件内,完成 LED 灯的 GPIO 初始化配置。EXTI_Key_Config 函数完成两个按键的 GPIO 和 EXTI配置。所以我们只需要修改stm32fsxx_it.c文件里面的代码即可,以下是修改后的代码。

代码语言:c复制
#include "stm32f4xx_it.h"
#include "./led/bsp_led.h"
#include "./key/bsp_exti.h"
#include <stdio.h>

int i = 0;
int key=0;
int key1=0;
void delay(int time){
		for(;i<time;i  );
		i = 0;
}

/** @addtogroup STM32F429I_DISCOVERY_Examples
  * @{
  */

/** @addtogroup FMC_SDRAM
  * @{
  */ 

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/******************************************************************************/
/*            Cortex-M4 Processor Exceptions Handlers                         */
/******************************************************************************/

/**
  * @brief  This function handles NMI exception.
  * @param  None
  * @retval None
  */
void NMI_Handler(void)
{
}

/**
  * @brief  This function handles Hard Fault exception.
  * @param  None
  * @retval None
  */
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {}
}

/**
  * @brief  This function handles Memory Manage exception.
  * @param  None
  * @retval None
  */
void MemManage_Handler(void)
{
  /* Go to infinite loop when Memory Manage exception occurs */
  while (1)
  {}
}

/**
  * @brief  This function handles Bus Fault exception.
  * @param  None
  * @retval None
  */
void BusFault_Handler(void)
{
  /* Go to infinite loop when Bus Fault exception occurs */
  while (1)
  {}
}

/**
  * @brief  This function handles Usage Fault exception.
  * @param  None
  * @retval None
  */
void UsageFault_Handler(void)
{
  /* Go to infinite loop when Usage Fault exception occurs */
  while (1)
  {}
}

/**
  * @brief  This function handles Debug Monitor exception.
  * @param  None
  * @retval None
  */
void DebugMon_Handler(void)
{}

/**
  * @brief  This function handles SVCall exception.
  * @param  None
  * @retval None
  */
void SVC_Handler(void)
{}

/**
  * @brief  This function handles PendSV_Handler exception.
  * @param  None
  * @retval None
  */
void PendSV_Handler(void)
{}

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{}

/******************************************************************************/
/*                 STM32F4xx Peripherals Interrupt Handlers                   */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
/*  available peripheral interrupt handler's name please refer to the startup */
/*  file (startup_stm32f429_439xx.s).                         */
/******************************************************************************/

/**
  * @}
  */ 
	
void shan(){
	while(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) == RESET){
			// LED1 取反		
			LED1_TOGGLE;
			delay(10000000);
			LED2_TOGGLE;
			//清除中断标志位
			EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
		}
	if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET){
		key  = 1;
		EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);
	}
}
void KEY1_IRQHandler(void)
{
  //确保是否产生了EXTI Line中断
	while(1){
	if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) 
	{
		key1  = 1;
		shan();
		if(key == 1){
			
			LED1_ON;
			LED2_ON;
			EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE); 
			delay(100000000);
			
			while(key%2!=0){
				shan();
			}
			EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
		}
	}
			//printf("weddcedc");
		if(key == 2 ){
			LED1_OFF;
			LED2_OFF;
			//KEY2_IRQHandler();	
			EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);  
		}
		//EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);	
	key = 0;
	}
}	


void KEY2_IRQHandler(void)
{
  //确保是否产生了EXTI Line中断
	if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) 
	{
		// LED2 取反		
		LED3_TOGGLE;
		//清除中断标志位
		EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     
	}  
}
/**
  * @}
  */ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞