目录
一、实验目的
1.1掌握STM32F103ZET6单片机的外部中断配置与使用方法。
1.2学习如何通过外部中断实现按键控制LED点亮和熄灭。
1.3提升对嵌入式系统中断处理的理解与应用能力。
1.4学习如何通过外部中断实现按键控制蜂鸣器。
二、实验原理
2.1 外部中断简介
外部中断是一种在特定事件发生时立即响应的机制。通过配置STM32F103ZET6的GPIO引脚为外部中断模式,当检测到按键按下时,触发中断服务程序来实现点亮或熄灭LED灯。
2.2 按键原理图
2.3 蜂鸣器原理图
2.4 主要流程
2.4.1GPIO配置:
将按键连接到STM32F103ZET6的外部中断引脚,将LED连接到输出引脚。
2.4.2外部中断配置:
配置按键引脚为外部中断模式,并设置中断触发条件(如下降沿触发)。
2.4.3中断服务函数:
在中断服务函数中实现LED灯的点亮和熄灭逻辑。
三、实验步骤
3.1硬件连接
①将按键连接到STM32F103ZET6的外部中断引脚(例如:PA0),同时连接上拉电阻,以确保按键松开时电平稳定。
②将LED连接到STM32F103ZET6的GPIO输出引脚(例如:PB5),并通过电阻限流。
3.2软件配置
①项目文件结构
sys.h:系统配置相关的头文件。
delay.h:延时函数相关的头文件。
usart.h:串口通信相关的头文件。
led.h:LED相关的头文件,定义LED初始化和操作的函数。
main.c:主程序文件,控制LED的点亮和熄灭。
②编写代码
③下载程序并运行
将代码编译并下载到STM32F103ZET6开发板中,按下按键,观察LED灯的点亮和熄灭效果。
四、实验代码
4.1 main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "exti.h"
#include "beep.h"
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //初始化与LED连接的硬件接口
BEEP_Init(); //初始化蜂鸣器IO
EXTIX_Init(); //初始化外部中断输入
LED0=0; //先点亮红灯
while(1)
{
printf("OK\r\n");
delay_ms(1000);
}
}
4.2 led.c
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
}
4.3 delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "sys.h"
void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);
#endif
4.4 led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5
void LED_Init(void);//初始化
#endif
4.5 key.h
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
//#define KEY0 PEin(4) //PE4
//#define KEY1 PEin(3) //PE3
//#define WK_UP PAin(0) //PA0 WK_UP
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)
#define KEY0_PRES 1 //KEY0按下
#define KEY1_PRES 2 //KEY1按下
#define WKUP_PRES 3 //KEY_UP按下(即WK_UP/KEY_UP)
void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8); //按键扫描函数
#endif
4.6 beep.h
#ifndef __BEEP_H
#define __BEEP_H
#include "sys.h"
//蜂鸣器端口定义
#define BEEP PBout(8) // BEEP,蜂鸣器接口
void BEEP_Init(void); //初始化
#endif
五、实验结果展示
采用外部中断的按键控制
六、心得体会
通过此次实验,我们熟悉了STM32F103ZET6的外部中断配置和使用方法,并成功实现了通过按键控制LED的点亮和熄灭。心得如下:
6.1响应速度:外部中断响应速度快,当按键按下时能够立即触发中断服务函数,执行相应的操作,实现了按键控制LED的快速响应。
6.2资源占用:使用外部中断实现按键控制,占用了外部中断资源,但中断处理效率高,适用于需要快速响应的场景。
6.3编程技巧:通过本次实验,我们掌握了外部中断的配置方法和中断服务函数的编写,提高了编程技巧和对中断机制的理解。
6.4调试技巧:在调试过程中,通过设置断点和观察变量值,能够有效发现和解决问题,如中断未触发、按键抖动等。
本实验通过结合硬件连接和软件编程,成功实现了基于STM32F103ZET6的外部中断按键控制LED点亮和熄灭。
在实现了按键控制LED亮灭效果的基础上,我使用KEY1控制LED1翻转,采用WKUP按键实现对蜂鸣器的控制,采用KEY0实现LED1与LED2同时翻转。(如视频展示)
通过该实验,不仅巩固了对单片机中断功能的理解,还提高了实际动手能力和调试技巧,为后续更复杂的嵌入式开发打下了坚实基础。