STM32CubeMX笔记(3)--GPIO输入,按键KEY检测


1、STM32CubeMX引脚设置和代码生成

1.正点原子mini开发板KEY的电路图,正点原子mimi板的电路:WK_UP–PA0 KEY_0–PC5 KEY_1–PA15。根据电路图可以知道,需要将WK_UP的输入设置为下拉输入,将KEY_0KEY_0设置为上拉输入
注:高电平有效使用下拉输入;低电平有效使用上拉输入;

2.在STM32CubeMX软件中,配置相对应的引脚及引脚相关模式GPIO_Iutput,并在软件右侧对引脚进行详细配置,并在用户标签项User Label中填进WK_UP等标签备注。

(这个标签项有利于帮助我们查看各个引脚的使用情况及相关代码的宏定义,相关的宏定义会在生成的代码main.h中进行定义。)

3.在STM32CubeMX软件右上角,点击GEBERATE CODE项,生成代码。

在这里插入图片描述

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


2、新建KEY文件夹目录,放置程序文件

1.在HAL_TEST工程下的BSP文件夹内,新建KEY文件夹,用于放置我们写的检测按键KEY的相关程序代码。

2.在MDK软件中,新建key.ckey.h文件,并放置在HAL_TEST/BSP/KEY文件夹内,并根据STM32CubeMX笔记(2)–GPIO控制,点亮LED灯的相关操作链接key.ckey.h文件。


3、编写C文件,h头文件

key.hkey.h文件的编写如下:


1.key.h的编辑情况:

#ifndef __KEY_H
#define __KEY_H	 
#include "main.h"
#include "gpio.h"

#define KEY_WK_UP  HAL_GPIO_ReadPin(WK_UP_GPIO_Port, WK_UP_Pin)
#define KEY_0      HAL_GPIO_ReadPin(KEY_0_GPIO_Port, KEY_0_Pin)
#define KEY_1      HAL_GPIO_ReadPin(KEY_1_GPIO_Port, KEY_1_Pin)

#define KEY0_PRES 	1	//KEY0按下
#define KEY1_PRES	2	//KEY1按下
#define WKUP_PRES   3	//KEY_UP按下(即WK_UP/KEY_UP)

unsigned char KEY_Scan(unsigned char mode);
void key_text(void);

#endif 

2.key.c的编辑情况:

#include "KEY\key.h"
#include "LED\led.h"

/**************************************************************************
函数功能:KEY按键扫描
入口参数:mode: 0:不支持连续按;	1:支持连续按;
返回  值:1:KEY0按下;	2:KEY1按下;	3:WK_UP按下
说    明:注意此函数有响应优先级,KEY0>KEY1>WK_UP
**************************************************************************/
unsigned char KEY_Scan(unsigned char mode)
{
    
    	 
	static unsigned char key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY_0==0||KEY_1==0||KEY_WK_UP==1))
	{
    
    
		HAL_Delay(10);//去抖动 
		key_up=0;
		if(KEY_0==0)return KEY0_PRES;
		else if(KEY_1==0)return KEY1_PRES;
		else if(KEY_WK_UP==1)return WKUP_PRES;
	}else if(KEY_0==1&&KEY_1==1&&KEY_WK_UP==0)key_up=1;
 	return 0;// 无按键按下
}




/**************************************************************************
函数功能:KEY按键扫描检测函数
入口参数:mode: 0:不支持连续按;	1:支持连续按;
返回  值:1:KEY0按下;	2:KEY1按下;	3:WK_UP按下
说    明:搭配LED灯,用于测试按键输入
**************************************************************************/
void key_text(void)
{
    
    
	static unsigned char key=0;//按键键值
	
	key=KEY_Scan(1);	//得到键值,支持持续按着按键
	if(key)
	{
    
    						   
		switch(key)
		{
    
    				 
			case WKUP_PRES:	//控制LED闪烁三次
				led_bling_sum(3,500);
				break;
			case KEY1_PRES:	//控制LED灯,双灯持续亮着	 
				HAL_GPIO_WritePin(LED0_GPIO_Port,  LED0_Pin, (GPIO_PinState) 0);
				HAL_GPIO_WritePin(LED1_GPIO_Port,  LED1_Pin, (GPIO_PinState) 0);
				break;
			case KEY0_PRES:	//同时控制LED0,LED1翻转 
				HAL_GPIO_TogglePin(LED0_GPIO_Port,  LED0_Pin);
				HAL_GPIO_TogglePin(LED1_GPIO_Port,  LED1_Pin);
				break;
		}
	}else HAL_Delay(10);
	
}

4、添加相关函数,使用ST-Link烧录,测试按键

main.c文件中进行编辑,添加头文件#include "KEY\key.h",在white循环中添加key测试的相关c函数key_text()。切记,相关的代码要放在用户代码保护区中,避免重新使用STM32CubeMX生成代码是被覆盖删除。

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "LED\led.h"
#include "KEY\key.h"

/* USER CODE END Includes */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
		key_text();

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

猜你喜欢

转载自blog.csdn.net/weixin_44444810/article/details/120398167