本文使用“野火霸天虎_V2”作为硬件开发环境。开发环境为“STM32CubeIde”。
首先仍是通过stm32cubemx进行引脚初始化配置,根据野火官方提供的原理图可知除复位按键的另外两个按键的连接引脚为PA0和PC13,红灯和绿灯效果为PF6,PF7。
1.开始配置,按键检测脚设置为输出,LED与上一节设置相同。
2.创建源文件夹和相关的源文件
3.KEY.h与.c文件代码如下
/*
* KEY.h
*
* Created on: 2021年12月29日
* Author: 13450
*/
#ifndef __KEY_H
#define __KEY_H
#include "main.h"
typedef enum{
KEY_NONE=0,
KEY1,
KEY2
}KEYS;
#define KEY_WAIT_ALWAYS 0//作为函数ScanKeys的一个参数,表示一直等待按键的输入
//轮询的方式扫描按键,timeout=KEY_WAIT_ALWAYS时一直扫描,否则等待时间timeout,单位ms
KEYS ScanpressedKey(uint32_t timeout);
#ifdef LED_R_Pin//红灯控制
#define LED_R_Toggle() HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin)
#define LED_R_ON() HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_RESET)
#define LED_R_OFF() HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_SET)
#endif
#ifdef LED_G_Pin//绿灯控制
#define LED_G_Toggle() HAL_GPIO_TogglePin(LED_G_GPIO_Port,LED_G_Pin)
#define LED_G_ON() HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_RESET)
#define LED_G_OFF() HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET)
#endif
#endif/*__KEY_H*/
/*
* KEY.c
*
* Created on: 2021年12月29日
* Author: 13450
*/
#include "KEY.h"
//轮询扫描2个按键,返回按键值
//timeout的单位为ms,若timeout=0表示一直扫描,直到有按键按下
KEYS ScanPresssedKey(uint32_t timeout)
{
KEYS key=KEY_NONE;
uint32_t tickstart = HAL_GetTick();//当前计数值
const uint32_t btnDelay=20; //按键按下阶段的抖动,延时在采样时间(在霸天虎开发板中已做硬件消抖,所以软件即使不做消抖处理也可以)
GPIO_PinState keyState;
while(1)
{
#ifdef KEY_1_Pin //如果定义了宏kEY_1,就可以检测KEY_1键输入,低输入有效
keyState=HAL_GPIO_ReadPin(KEY_1_GPIO_Port,KEY_1_Pin);
if (keyState==GPIO_PIN_RESET)
{
HAL_Delay(btnDelay);//延期跳过前期抖动
keyState=HAL_GPIO_ReadPin(KEY_1_GPIO_Port,KEY_1_Pin);//采样
if(keyState ==GPIO_PIN_SET)
return KEY1;
}
#endif
#ifdef KEY_2_Pin //如果定义了宏kEY_2,就可以检测KEY_2键输入,低输入有效
keyState=HAL_GPIO_ReadPin(KEY_2_GPIO_Port,KEY_2_Pin);
if (keyState==GPIO_PIN_RESET)
{
HAL_Delay(btnDelay);//延期跳过前期抖动
keyState=HAL_GPIO_ReadPin(KEY_2_GPIO_Port,KEY_2_Pin);//采样
if(keyState ==GPIO_PIN_SET)
return KEY2;
}
#endif
if(timeout !=KEY_WAIT_ALWAYS)//没有按键按下是会计算超时,timeout时退出
{
if((HAL_GetTick()-tickstart)>timeout)
break;
}
}
return key;
}
然后在住程序中调用函数,通过选择分支来确定亮灯颜色
/* USER CODE BEGIN WHILE */
while (1)
{
KEYS curKey= ScanPresssedKey(KEY_WAIT_ALWAYS);//�?测按键输�?
switch(curKey)
{
case KEY1:
LED_R_Toggle();
break;
case KEY2:
LED_G_Toggle();
break;
}
HAL_Delay(200);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
4.烧录验证即可(如果两个灯都开启的话会展现出亮黄色,所以在同一时间只能有一个LED引脚输出电平为低,另一个电平相反)