stm32按键控制LED灯亮灭(中断法)

前言

用按键控制STM32上的LED灯亮灭,可以采用轮询法和中断法。轮询法需要不断检测按键的状态,消耗MCU;而中断法只是在按下的那一刻触发中断,控制灯亮灭。轮询法相对于更常规,容易操作。因此我们这里讲的用中断法。关于中断的概述,这里不作介绍,只讲操作,分析代码,可以的话,欢迎上车。
注意: 使用HAL库,不讲标准库的使用

1、创建工程

这里我们用两个按键KEY1,KEY2和LED1,LED2.它们在单片机电路原理图上的位置如下图所示:
在这里插入图片描述
打开STM32CubeMX,按下图分别配置好上述引脚:
在这里插入图片描述
中断触发类型分为:上升沿;下降沿;上升沿和下降沿都触发三种方式,这里我们选用下降沿,即按下按键,灯灭,松开灯亮。
在这里插入图片描述
配好NVIC:
在这里插入图片描述
配好RCC:
在这里插入图片描述
配好SYS
在这里插入图片描述
配时钟(以STM32F103系列为例,8M外部晶振)
在这里插入图片描述
工程管理与代码生成:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、keil5的主函数改写

进入到keil5后,只需要进行main.c的改写即可,在main主函数外加入下述代码。因为之前在STMCubeMX的配置已经生成了相关的配置代码。那具体该写些什么呢?先放上代码再做分析:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	
	switch(GPIO_Pin){
		case GPIO_PIN_0:
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
		break;
		case GPIO_PIN_1:
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET)
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
		break;
	}
}

上述是一个接口重写的代码。那为什么要这样写?这里就应该提到HAL库的优势之一:提供用户友好的API函数接口。我们这里采用的是中断法,只需要找到处理中断的那部分函数配置。如下图所示:
在这里插入图片描述
上图1部分是处理中断请求的函数;2部分是个虚函数,我们仔细看一下上图的那个绿色字体关于这个函数的作用解释。可以理解为:检测中断发生的事件。这两个部分合起来可以理解为:2部分检测是否发生了中断,检测到了交给1部分来处理。而且2部分是个虚函数,绿色字体表明它可以作为一个回调函数。回调函数不是由该函数的实现方直接调用,而是在特定事件或条件发生时由另外的一方调用,用于对该事件或条件的响应。这就是为什么我们会在main.c里面对2部分进行了重写。另外关于上述函数体里面的代码,其实都只是调用了生成配置代码中的函数再加上C语言的语法。相关函数原型如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结语

中断点灯就此结束,上述内容由我一个人整理,难免有疏漏。有问题欢迎留言讨论!

  • 12
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值