STM32CUBEMX+MDK5实现按键以及LED灯

STM32CUBEMX+MDK5实现按键以及LED灯

  • 1 概述
    • 1.1 资源概述
    • 1.2 实现功能
  • 2 CUBEMX的配置
    • 2.1 GPIO口配置
      • 2.1.1 端口配置图
      • 2.1.2 端口资源汇总表
      • 2.1.3 通用GPIO口的配置
    • 2.2 时钟配置
      • 2.2.1时钟RCC配置图
      • 2.2.2晶振选择
    • 2.3 调试端口
    • 2.4 CUBEMX工程管理配置
    • 2.3 选择生成代码
  • 3 main函数增加代码
    • 3.1 端口初始化函数
    • 3.2 功能实现函数
  • 4 实验结果
    • 4.1 串口打印
    • 4.2 硬件实现

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 端口配置图

(部分引脚配置此次实验未用,但是不影响程序的编译,不会报错)
STM32CUBEMX+MDK5实现按键以及LED灯_第1张图片

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(用户标签),方便后续程序的移植。
STM32CUBEMX+MDK5实现按键以及LED灯_第2张图片

2.2 时钟配置

2.2.1时钟RCC配置图

使用外部HSE,PLL选择9倍频,系统时钟选择PLL,HCLK配置为72MHz,APB1设置为2分频。
STM32CUBEMX+MDK5实现按键以及LED灯_第3张图片

2.2.2晶振选择

选择外部晶振,高速晶振为8MHz,低速晶振为32.768KHz。
STM32CUBEMX+MDK5实现按键以及LED灯_第4张图片

2.3 调试端口

采用SW方式进行调试烧录。
STM32CUBEMX+MDK5实现按键以及LED灯_第5张图片

2.4 CUBEMX工程管理配置

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

2.3 选择生成代码

点击Generate code,生成软件代码,在之后的提示框中点击打开工程。
STM32CUBEMX+MDK5实现按键以及LED灯_第9张图片

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的字符
STM32CUBEMX+MDK5实现按键以及LED灯_第10张图片

4.2 硬件实现

将程序下载到开发板中,验证软件功能。全部功能实现完成。
通过按键将全部的灯点亮
STM32CUBEMX+MDK5实现按键以及LED灯_第11张图片
通过按键熄灭LED1和LED2
STM32CUBEMX+MDK5实现按键以及LED灯_第12张图片
硬件实现视频

STM32 按键和LED以及蜂鸣器实验(使用CUBEMX和MDK5)

你可能感兴趣的:(STM32开发学习笔记)