HAL+M4学习记录_4

发布于:2024-10-10 ⋅ 阅读:(140) ⋅ 点赞:(0)

一、按键

记录学习使用HAL库读取板载按键输入键值

板载三颗按键,引脚配置如下
按键配置
其中K_UP按键按下为高电平,那么PA0引脚要配置为下拉模式;K0和K1按下为低电平,那么PE4和PE3引脚要配置为上拉模式。

二、通过按键控制LED

这里实现的功能是,按键K_UP按下同时点亮两个LED,再次按下熄灭两个LED;按键K0和K1分别按下,分别点亮LED1和LED2,再次分别按下,分别熄灭LED1和LED2。

代码如下

  • bsp_keys.c文件
/*
*********************************************************************************************************
*	                                   Module Description
*
*	独立按键驱动模块,板载三个按键K_UP、K0和K1,所接引脚分别是PA0、PE4和PE3
*	按键K_UP(WK_UP可作为待机唤醒选项)按下为高电平,设置为下拉输入模式
*	按键K0和按键K1按下为低电平,设置为上拉输入模式
*********************************************************************************************************
*/

#include "bsp.h"
									
/*
**********************************************************************************
*   @brief    按键硬件初始化,配置按键对应的GPIO
*   @param	  None
*   @return	  None
*   @note	  	
**********************************************************************************
*/
static void bsp_InitKeyHard()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	/* 打开GPIO时钟 */
	GPIO_CLK_ENABLE_K_UP();
	GPIO_CLK_ENABLE_K0();
	GPIO_CLK_ENABLE_K1();
	/* 配置K_UP为下拉输入,K0和K1为上拉输入 */
	GPIO_InitStructure.Mode 	= GPIO_MODE_INPUT;				// 输入模式
	GPIO_InitStructure.Speed 	= GPIO_SPEED_FREQ_VERY_HIGH;	// GPIO速度
	GPIO_InitStructure.Pin 		= GPIO_PIN_K_UP;				// K_UP引脚
	GPIO_InitStructure.Pull 	= GPIO_PULLDOWN;				// 下拉模式
	HAL_GPIO_Init(GPIO_PORT_K_UP, &GPIO_InitStructure);
	
	GPIO_InitStructure.Pin 		= GPIO_PIN_K0 | GPIO_PIN_K1;	// K0和K1引脚
	GPIO_InitStructure.Pull		= GPIO_PULLUP;					// 上拉模式
	HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
}

/*
**********************************************************************************
*   @brief    初始化按键驱动
*   @param	  None
*   @return	  None
*   @note	  	
**********************************************************************************
*/
void bsp_InitKey()
{
	bsp_InitKeyHard();
}

/*
**********************************************************************************
*   @brief    阻塞式按键扫描函数
*   @param	  None
*   @return	  键值,如下
*				K_UP按下返回3
*				K0按下返回1
*				K1按下返回2
*   @note	  
**********************************************************************************
*/
uint8_t bsp_ScanKey()
{
	uint8_t key_value 			= 0;			// 键值
	// K_UP按键检测
	if(K_UP_NOW == 1)
	{
		bsp_DelayMs(20);
		while(K_UP_NOW == 1);
		bsp_DelayMs(20);
		key_value = 3;
	}
	// K0按键检测
	if(K0_NOW == 0)
	{
		bsp_DelayMs(20);
		while(K0_NOW == 0);
		bsp_DelayMs(20);
		key_value = 1;
	}
	// K1按键检测
	if(K1_NOW == 0)
	{
		bsp_DelayMs(20);
		while(K1_NOW == 0);
		bsp_DelayMs(20);
		key_value = 2;
	}
	return key_value;
}

  • bsp_keys.h文件
#ifndef __BSP_KEYS_H
#define __BSP_KEYS_H

/* private define */
#define HARD_KEY_NUM			3											// 实体按键个数
// 按键引脚定义
#define GPIO_CLK_ENABLE_K_UP()	do{__HAL_RCC_GPIOA_CLK_ENABLE();}while(0)
#define GPIO_PORT_K_UP			GPIOA
#define GPIO_PIN_K_UP			GPIO_PIN_0

#define GPIO_CLK_ENABLE_K0()	do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define GPIO_PORT_K0			GPIOE
#define GPIO_PIN_K0				GPIO_PIN_4

#define GPIO_CLK_ENABLE_K1()	do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define GPIO_PORT_K1			GPIOE
#define GPIO_PIN_K1				GPIO_PIN_3
// 按键引脚当前电平
#define K_UP_NOW				HAL_GPIO_ReadPin(GPIO_PORT_K_UP, GPIO_PIN_K_UP)
#define K0_NOW					HAL_GPIO_ReadPin(GPIO_PORT_K0, GPIO_PIN_K0)
#define K1_NOW					HAL_GPIO_ReadPin(GPIO_PORT_K1, GPIO_PIN_K1)
// 键值定义
#define PRES_K_UP				3
#define PRES_K0					1
#define PRES_K1					2

/* public statement */
void bsp_InitKey();
uint8_t bsp_ScanKey();
#endif

  • main.c文件
#include "bsp.h"

/* public statement */
static void PrintInfo();

/* public define */
uint32_t key_num = 0;

int main()
{
	bsp_Init();
	//PrintInfo();			/* 打印开发板信息 */
	while(1)
	{
		key_num = bsp_ScanKey();
		if(key_num == 1)
		{
			bsp_LedToggle(1);
		}
		if(key_num == 2)
		{
			bsp_LedToggle(2);
		}
		if(key_num == 3)
		{
			bsp_LedToggle(1);
			bsp_LedToggle(2);
		}
	}
}

网站公告

今日签到

点亮在社区的每一天
去签到