1、硬件设备
STM32F103ZET3开发板
STLink
1、实现功能
上电初始化后,LED0灯灭;
当按键按下时LED0状态翻转;
3、原理图分析
LED灯原理在上节已经解释,这节不再赘述,这里共有两个按键分别为KEY0、KEY1,以KEY0为例当按键按下时,电流流向按键,然后接地,则 PE4 为低电平0。
当按键松开时,电流流向 PE4 ,则 PE4 是高电平 1。
因此实现按键控制LED可以有两种方法
1、扫描:读取PE4引脚的电平,当为低电平时LED状态发生反转
2、中断:按键按下,触发外部中断,则将LED2灯状态翻转。
3、CubeMX配置
这里不再详细阐释步骤,采用中断控制LED时,记得要开启中断使能,这里的优先级采用默认的抢占优先级0,子优先级0,其中优先级数越小代表该中断的优先级也就越高。
按键
配置RCC时钟源
3、程序编写
采用模块化编程方式,适合后续的程序调用和移植,也可以理解为函数封装
函数封装: 函数封装是指将一组相关的功能封装到一个函数中,以便重复使用。它可以帮助程序员更有效地编写代码,并减少重复代码的重复编写。
方法一:
key.c
#include "key.h"
#include "led.h"
void Key(void)
{
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4))
{
HAL_Delay(100);//按键消抖
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4))
Red_ON();
else Red_OFF();
}
}
key.h
#ifndef _KEY_H
#define _KEY_H
#include "main.h"
void Key(void);
#endif
main.c
直接在while后面加入
key();
方法二:
在main.c中直接增加中断回调函数,当检测到中断时执行中断回调函数,翻转LED0灯的状态。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//中断回调函数,当有中断发生时,将LED0灯进行翻转
{
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin); //sorry,忘记在上一章中定义LED翻转了,自己可以直接在后面定义的,如:#define LEDTOGGLE HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin)
}