基于STM32CubeMX&HAL库写代码之LED与按键

首先打开新建好的STM32CubeMX工程
新建工程的方法可以看我另一篇博文:基于STM32CuBeMX新建32工程

在这里插入图片描述

下面是我开发板的原理图
我用到的是LED1和KEY1
其中LED1对应的引脚是PE5,KEY对应的引脚是PE3
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样就配置完成了,点击右上角的GENERATE CODE生成代码
可在while循环里加入下面代码进行测试

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

    /* USER CODE BEGIN 3 */
        if(!HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3)) {				//检测按键是否按下
			HAL_Delay(10);										//延时消抖
			if(!HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3)){			//再次检测
				HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);			//LED电平转换
				while(!HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3));	//等待按键松开
			}
        }
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先你需要在STM32CubeMX中配置定时器和按键的GPIO口,然后生成代码。 在生成的代码中,你需要找到定时器的中断处理函数,在其中编控制LED闪烁的代码。具体地,可以设置一个变量来记录LED的闪烁速度,然后在定时器中断处理函数中根据按键状态更新这个变量的值,从而改变LED的闪烁速度。 以下是示例代码: ```c /* 定义三个LED的GPIO口 */ #define LED1_Pin GPIO_PIN_0 #define LED1_GPIO_Port GPIOA #define LED2_Pin GPIO_PIN_1 #define LED2_GPIO_Port GPIOA #define LED3_Pin GPIO_PIN_2 #define LED3_GPIO_Port GPIOA /* 定义三个按键的GPIO口 */ #define KEY1_Pin GPIO_PIN_3 #define KEY1_GPIO_Port GPIOB #define KEY1_EXTI_IRQn EXTI3_IRQn #define KEY2_Pin GPIO_PIN_4 #define KEY2_GPIO_Port GPIOB #define KEY2_EXTI_IRQn EXTI4_IRQn #define KEY3_Pin GPIO_PIN_5 #define KEY3_GPIO_Port GPIOB #define KEY3_EXTI_IRQn EXTI9_5_IRQn /* 定义LED闪烁速度变量和按键状态变量 */ uint32_t blink_speed = 1000; // 初始闪烁速度为1s uint8_t key1_pressed = 0; uint8_t key2_pressed = 0; uint8_t key3_pressed = 0; /* 定时器中断处理函数 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) // 如果是定时器2的中断 { static uint32_t cnt = 0; /* 每到闪烁速度的倍数时,翻转LED的状态 */ if (++cnt >= blink_speed) { cnt = 0; HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); } /* 检测按键状态并更新闪烁速度变量 */ if (key1_pressed) { blink_speed = 1000; // 闪烁速度为1s } else if (key2_pressed) { blink_speed = 500; // 闪烁速度为0.5s } else if (key3_pressed) { blink_speed = 250; // 闪烁速度为0.25s } } } /* 按键中断处理函数 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == KEY1_Pin) // 如果是按键1的中断 { key1_pressed = 1; key2_pressed = 0; key3_pressed = 0; } else if (GPIO_Pin == KEY2_Pin) // 如果是按键2的中断 { key1_pressed = 0; key2_pressed = 1; key3_pressed = 0; } else if (GPIO_Pin == KEY3_Pin) // 如果是按键3的中断 { key1_pressed = 0; key2_pressed = 0; key3_pressed = 1; } } ``` 在这个示例代码中,我们使用了定时器2和三个按键来控制三个LED的闪烁速度。当按下不同的按键时,闪烁速度变量会被更新,从而改变LED的闪烁速度。在定时器中断处理函数中,我们使用一个计数器来记录时间,并在到达闪烁速度的倍数时翻转LED的状态。需要注意的是,这里使用了静态变量来存储计数器的值,因为定时器中断处理函数会被不停地调用,每次调用都会重新定义一个局部变量,而无法记录上一次的计数器值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值