使用STM32CubeMX新建小熊派的STM32L431RCT6工程实现按键控制LED(循环查询&外部中断)

作者介绍

刘懿宵,男,西安工程大学电子信息学院,2017级本科生。
专业:通信工程
电子邮件:yixiao_liu1999@163.com

开发板上的按键

在这里插入图片描述

确定按键引脚

根据原理图:
1)PC13为LED控制引脚;
2)PB2为KEY1引脚;
3)PB3为KEY2引脚。JTDO-TRACE SWO/PB3
在这里插入图片描述

循环查询实现按键

选择引脚和配置时钟

配置按键引脚PB2和PB3为输入模式通过读取引脚电平信号来判断按键是否按下。
配置LED引脚PC13为输出模式。
在这里插入图片描述

详细配置GPIO

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编写代码

# 代码编写说明
1、按键KEY1和按键KEY2对应的引脚PB2和PB3为GPIO输入模式。
2、按键KEY1按下,PB2查询到低电平时,蓝色LED灯亮。
3、按键KEY2按下,PB3查询到低电平时,蓝色LED灯灭。
4、调用函数有:
void HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_Delay(uint32_t Delay);
5、引脚定义名称:
#define LED_Pin GPIO_PIN_13 //LED灯引脚号PC13
#define LED_GPIO_Port GPIOC //LED灯端口GPIOC
#define KEY1_Pin GPIO_PIN_2 //按键KEY1引脚PB2
#define KEY1_GPIO_Port GPIOB //按键KEY1端口GPIOB
#define KEY2_Pin GPIO_PIN_3 //按键KEY2引脚PB3
#define KEY2_GPIO_Port GPIOB //按键KEY2端口GPIOB
# 按键代码编写实现
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)//查询按键KEY1低电平
		{
			HAL_Delay(10);//消抖
			if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)//查询按键KEY1低电平
			{
				HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);//灯亮
			}
		}
		if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)//查询按键KEY1低电平
		{
			HAL_Delay(10);//消抖
			if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)//查询按键KEY1低电平
			{
				HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);//灯灭
			}
		}

下载烧录

测试结果与编程相符

外部中断实现按键

选择引脚和配置时钟

配置按键引脚PB2和PB3为输入模式通过读取引脚电平信号来判断按键是否按下。
配置LED引脚PC13为输出模式。
在这里插入图片描述

详细配置GPIO

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

使能中断

在这里插入图片描述

在这里插入图片描述

编写代码

# 代码编写说明
1、按键KEY1和按键KEY2对应的引脚PB2和PB3为GPIO外部中断输入模式:
2、按键KEY1按下,PB2检测到外部中断信号输入,蓝色LED灯亮或灭。
3、按键KEY2按下,PB3检测到外部中断信号输入,蓝色LED灯灭或亮。
4、调用函数有:
1)在stm32l4xx_it.c文件中的EXTI2_IRQHandler(void);和EXTI3_IRQHandler(void);两个函数来点亮LED灯。由于这两个中断函数最终都是调用的 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);这个外部中断回调函数,所以可以把应用程序放在这回调函数中运行,集中管理代码。
2)void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
3)void HAL_Delay(uint32_t Delay);
# 按键代码编写实现
int main(void)函数中循环:
while(1)
{
	HAL_Delay(5000);//检测演示是否影响中断检测
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_PIN)
{
	if(GPIO_PIN==KEY1_Pin)//检测是否为外部中断2
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
	}
	if(GPIO_PIN==KEY2_Pin)//检测是否为外部中断3
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
	}
}

下载烧录

测试结果与编程相符

往期回顾

2021物联网开发学习自学历程记录汇总


版权声明:本文为qq_42754570原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。