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灯的亮灭。
下面是一个简单的实现步骤:
- 初始化硬件:首先,你需要初始化你的硬件。这包括设置按键和LED灯的GPIO(通用输入输出)引脚,以及配置外部中断(EXTI)来检测按键的按下。
- 编写中断处理程序:当中断被触发时,你需要编写一个中断处理程序来控制LED灯的亮灭。在这个程序中,你可以检查LED灯的当前状态,然后切换它的状态(如果它是亮的,就熄灭它;如果它是灭的,就点亮它)。
- 主循环:在你的主循环中,你可以执行其他任务,而中断处理程序会在按键被按下时自动执行。
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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!