STM32CUBEMX+MDK5实现按键以及LED灯

1 概述

1.1 资源概述

开发板:正点原子STM32F103 Nano开发板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型号:STM32F103RBT6
正点原子开发板

1.2 实现功能

使用KEY0~KEY3分别控制LED0到LED3的亮灭,KEY_UP控制LED4的亮灭.按一次按键对应的灯亮,再按一次对应的灯灭。另外长按KEY0可以实现蜂鸣器的鸣响。

2 CUBEMX的配置

2.1 GPIO口配置

2.1.1 端口配置图

(部分引脚配置此次实验未用,但是不影响程序的编译,不会报错)
芯片GPIO脚的配置

2.1.2 端口资源汇总表

查阅开发板的电路图确认实验用到的GPIO口配置资源如下。

GPIO 引脚 配置资源
LED0 PC0
LED1 PC1
LED2 PC2
LED3 PC3
KEYUP PA0
KEY0 PC8
KEY1 PC9
KEY2 PD2
BEEP PB8
USART1_TX PA9
USART1_RX PA10

2.1.3 通用GPIO口的配置

KEY_UP是输出高有效,因此初始化时,配置输入下拉。其余LED端口或者按键均是低有效,所以配置为上拉。这里定义User Label(用户标签),方便后续程序的移植。
在这里插入图片描述

2.2 时钟配置

2.2.1时钟RCC配置图

使用外部HSE,PLL选择9倍频,系统时钟选择PLL,HCLK配置为72MHz,APB1设置为2分频。
RCC时钟设置

2.2.2晶振选择

选择外部晶振,高速晶振为8MHz,低速晶振为32.768KHz。
晶振选择

2.3 调试端口

采用SW方式进行调试烧录。
SWD配置

2.4 CUBEMX工程管理配置

1、选择Advanced、MDK-ARM、V5。
工程配置
2、代码生成配置
勾选生成外设C文件和H文件。否则这些端口的配置都会存在于main函数中。
代码生成配置
3、高级设置
全部勾选HAL函数。HAL函数的全称是Hardware abstract layer(硬件抽象层),这里还可以选择LL即Low layer(底层),函数和HAL完全不一样,优点是直接操作底层,程序占用空间小。咨询ST原厂FAE工程师,后续新开发芯片均不在支持标准库函数,仅支持HAL和LL函数。比如最新的H7系列芯片,就没有标准库函数的支持。
在这里插入图片描述

2.3 选择生成代码

点击Generate code,生成软件代码,在之后的提示框中点击打开工程。
在这里插入图片描述

3 main函数增加代码

3.1 端口初始化函数

在生成的main函数中增加相应的功能函数,端口初始化函数,给各个GPIO口赋值初值,防止上电时状态不确定。写入串口打印函数,提示信息。

/* USER CODE BEGIN 2 */
 HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
 HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
 HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);
 HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_SET);
 HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET);
 HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_SET);
 HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_SET);
 HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_SET);//初始化LED灯的状态,全部为灭
 HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET);//初始化BEEP,不响
 
 uint8_t temp[]="Press a key\r\n ";//向串口输入提示信息

  /* USER CODE END 2 */

3.2 功能实现函数

在while(1)函数中增加下述函数,实现不间断的按键检测

while (1)
  {
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */

if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==RESET)//判定KEY0按键是否有按下
	  {
	  HAL_Delay(10);								//延时,用于按键消抖
		if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==RESET) //判定KEY0按键是否有按下
		{
			HAL_Delay(500);//判定KEY0按键是否长按
			if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==RESET) //KEY0按键被长按
			{
			HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET);//开启蜂鸣器
			HAL_Delay(1000);//开启蜂鸣器1000ms
		    HAL_UART_Transmit(&huart1,temp,sizeof(temp),50);//向串口输出提示信息
			HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET);//关闭蜂鸣器
			}
				  else 	 
				  HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);//KEY0按键为短按,LED0灯状态翻转
				  HAL_Delay(200);
				  HAL_UART_Transmit(&huart1,temp,sizeof(temp),50);
		}
	  }
						  else  if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==RESET)
						  {
						  HAL_Delay(10);
							  if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==RESET)
							  {
								  HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
									HAL_Delay(200);
								  HAL_UART_Transmit(&huart1,temp,sizeof(temp),50);
							  }
						  }
									 else   if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==RESET)
									  {
									  HAL_Delay(10);
										  if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==RESET)
										  {
											  HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
											  HAL_Delay(200);
											  HAL_UART_Transmit(&huart1,temp,sizeof(temp),50);
										  }
									  }
												 else   if(HAL_GPIO_ReadPin(KEYUP_GPIO_Port,KEYUP_Pin)==SET)
												  {
												  HAL_Delay(10);
													  if(HAL_GPIO_ReadPin(KEYUP_GPIO_Port,KEYUP_Pin)==SET)
													  {
														  HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
														  HAL_Delay(200);
														  HAL_UART_Transmit(&huart1,temp,sizeof(temp),50);
														 
													  }
										  }
			

  }
  /* USER CODE END 3 */

4 实验结果

4.1 串口打印

使用串口调试助手,按下一次按键后,串口会打印一个Press a key的字符
串口实验结果

4.2 硬件实现

将程序下载到开发板中,验证软件功能。全部功能实现完成。
通过按键将全部的灯点亮
按键全亮
通过按键熄灭LED1和LED2
熄灭LED1和LED2

发布了3 篇原创文章 · 获赞 0 · 访问量 99

猜你喜欢

转载自blog.csdn.net/weixin_46623350/article/details/105164712