STM32CubeMX+Keil5按键操控LED

由于是记录学习过程,难免会有错漏,直接指出即可

STM32CubeMX+Keil5按键操控LED,使用的是STM32F103ZET6

首先按键本身性质需要处理,按键按下会有信号抖动,前沿抖动和后沿抖动,一般前后沿抖动都为5-10ms,如果不消除抖动,进行处理时会出现一次按键被识别成多次

其实电路里面就可以直接硬件消抖,硬件消抖是利用RC低通滤波滤掉,额,应该是用电容,效果好不好我也不知道,好像说效果不一定好,电容的选择也有影响,而且能应用的地方有限,最重要的问题是我这个板子上没有,所以选择软件解决

因为用按键控制LED,所以先看原理图确定引脚

LED引脚,由图可得LED0和LED1为可控LED,分别接着PB5和PE5,接地那个灯是电源灯,接电源即亮

按键(KEY)引脚,第一个按键(KEY_UP)连接的引脚WK_UP为PA0有唤醒功能,即可以把MCU从睡眠或低功耗模式中唤醒为正常模式,简单介绍一下,WK_UP给一个上升沿即可唤醒,在实际操作上即为按一下KEY_UP按键,至于怎么进入睡眠模式和其他更详细的,先不管,以后再说,说这么多的意思是,虽然可以用KEY_UP按键,但是我还是不用了

所以就用KEY0,KEY1,KEY2三个按键,分别连接的是PE4,PE3,PE2

很明显就和我一开始说的,根据原理图,这三个按键是直接接地,没有连接电容之类的可以硬件消抖,所以要从软件入手

打开STM32CubeMX进行引脚设置,先打开时钟

 选择debug方式,如果是使用板子的不要选择No Debug

设置LED的引脚PB5和PE5,设置为输出,为使LED不会接电就亮,初始电平为高

设置按键引脚PE4,PE3,PE2,设置为输入,因为按键另一边接地,所以按下按键就为低电平,所以内部上拉,设置为高电平,反之,如果按键接高电平的话,内部需要设置下拉,设置为低电平

判断一次按键电平然后延时一小会再判断一次,实现消除前沿抖动,选择导出

选择HAL库

导出然后打开,写入,实现的功能是按KEY0改变LED0亮灭,按KEY1改变LED1亮灭,按KEY2同时改变LED0和LED1亮灭

while (1)
  {
    /* USER CODE END WHILE */
		if(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)//检测到KEY0为低电平
		{
			HAL_Delay(10);//延时10ms
			if(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)//检测到KEY0还为低电平
			{
				while(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET);//KEY0按下后状态维持到松开
				HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//翻转LED0电平
			}
		}
		if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET)//检测到KEY1为低电平
		{
			HAL_Delay(10);//延时10ms
			if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET)//检测到KEY1还为低电平
			{
				while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET);//KEY1按下后状态维持到松开
				HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);//翻转LED1电平
			}
		}
		if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET)//检测到KEY2为低电平
		{
			HAL_Delay(10);//延时10ms
			if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET)//检测到KEY2还为低电平
			{
				while(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET);//KEY2按下后状态维持到松开
				HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//翻转LED0电平
				HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);//翻转LED1电平
			}
		}
    /* USER CODE BEGIN 3 */
  }

然后实现出来是这样


版权声明:本文为FortunaMajor原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。