嵌入式系统学习笔记之“按键控制之外部中断式”——STM32(三)

目录

一、实验目的

二、实验原理

        2.1 外部中断简介

        2.2 按键原理图

        2.3 蜂鸣器原理图

        2.4 主要流程

         2.4.1GPIO配置:

         2.4.2外部中断配置:

         2.4.3中断服务函数:

三、实验步骤       

3.1硬件连接

3.2软件配置

四、实验代码

        4.1 main.c

        4.2 led.c

        4.3 delay.h

        4.4 led.h

        4.5 key.h

        4.6 beep.h

五、实验结果展示

六、心得体会


一、实验目的

        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同时翻转。(如视频展示)

        通过该实验,不仅巩固了对单片机中断功能的理解,还提高了实际动手能力和调试技巧,为后续更复杂的嵌入式开发打下了坚实基础。

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式系统中,中断可以被用于控制 LED亮灭。在嵌入式系统中,LED 可以通过控制引脚的电平来实现亮灭的控制。而中断可以在特定的事件发生时,中断CPU的正常执行流程,来处理该事件。因此,我们可以通过中断的方实现LED 的控制。 首先,需要确定某个事件,例如按下按钮,来触发中断。当按钮被按下时,可以通过外部硬件电路将按钮事件与一个特定的中断引脚相连。当按钮被按下时,中断引脚的电平会发生变化,从而触发中断。 在中断处理程序中,我们可以编写代码来控制 LED亮灭。例如,在按钮中断触发后,中断处理程序可以将 LED 控制引脚的电平设置为高电平,从而让 LED 亮起。 同时,还需要注意中断的优先级和中断屏蔽。在嵌入式系统中,不同的中断可能有不同的优先级,而高优先级的中断可以打断低优先级的中断。因此,我们可以根据实际需求设置 LED 控制中断的优先级,确保它能够在需要的时候最先被处理。 此外,还可以使用中断屏蔽来控制中断的触发。通过设置中断屏蔽寄存器,可以选择性地屏蔽某些中断。这样,在某些特定的情况下,我们可以选择不触发 LED 控制中断,从而避免不必要的中断处理。 综上所述,嵌入中断可以用于控制 LED亮灭。通过设置按键事件的中断引脚和编写中断处理程序,我们可以实现在特定事件触发时控制 LED亮灭。同时,合理设置中断的优先级和中断屏蔽,可以确保中断按照预期的方进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值