[STM32L5] 【STM32L562E-DK试用】2.按键检测

[复制链接]
1891|6
 楼主| yuyy1989 发表于 2025-1-19 19:29 | 显示全部楼层 |阅读模式
STM32L562E-DK预置了一个可编程按键,接在了PC13上,高电平触发
微信截图_20250119181808.png
打开之前创建的工程,由于之前选择的是开发板生成的工程,生成工程时已经将按键的初始化代码写进去了,不需要再重新写初始化代码,我们只需要调用即可。
先以轮询方式实现按键检测,按键轮询是间隔很短时间不断查询GPIO电平状态,判断电平是否有发生改变,从而得知是否有按键动作,需要注意的是按键在按下或释放的过程中,可能会伴随抖动,如图示意
微信截图_20250119181956.png
在这抖动过程中,会产生多次高低电平,如果不加处理会被识别为多次按键操作,因此为了避免误判需要进行去抖处理,一般软件上可以用延时来去抖
用轮询的方式写个按键检测程序,用按键控制2个LED的亮灭,代码实现如下
  1. void AppUserLoop(void)
  2. {
  3.     if(LL_GPIO_IsInputPinSet(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin))
  4.     {
  5.         LL_mDelay(20);
  6.         if(LL_GPIO_IsInputPinSet(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin))
  7.         {
  8.             LL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);
  9.             LL_GPIO_TogglePin(LED_RED_GPIO_Port,LED_RED_Pin);
  10.             while(LL_GPIO_IsInputPinSet(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin));
  11.         }
  12.     }
  13. }


在主循环中调用AppUserLoop,运行效果如下
WeChat_20250119192548 00_00_00-00_00_30.gif
接下来用中断方式实现按键检测,与上面的轮询方法不同,这种方式并不用一直查询GPIO的状态,按键状态改变时会产生中断,程序在检测到中断后再判断按键状态,接下来用STM32CubeMX配置这个按键的中断,双击工程目录中的这个.ioc文件打开STM32CubeMX
微信截图_20250119183111.png
选中PC13在右侧的pinout view中对应的引脚会闪烁
微信截图_20250119183428.png
用鼠标左键点击这个引脚,把它配置成中断模式,GPIO mode设置成上升沿检测
微信截图_20250119183843.png
切换到NVIC标签,使能中断
微信截图_20250119183920.png
点击GENERATE CODE,再重新打开MDK,可以看到中断初始化和中断处理方法都添加好了
微信截图_20250119184304.png 微信截图_20250119184315.png 微信截图_20250119184335.png
修改一下刚才的程序,增加一个标识,中断触发后标识置1,主循环中检测到标识被置1后再检测按键是否被按下,代码实现如下
  1. uint8_t user_button_int_flag = 0;
  2. void EXTI13_IRQHandler(void)
  3. {
  4.   /* USER CODE BEGIN EXTI13_IRQn 0 */

  5.   /* USER CODE END EXTI13_IRQn 0 */
  6.   if (LL_EXTI_IsActiveRisingFlag_0_31(LL_EXTI_LINE_13) != RESET)
  7.   {
  8.     LL_EXTI_ClearRisingFlag_0_31(LL_EXTI_LINE_13);
  9.     /* USER CODE BEGIN LL_EXTI_LINE_13_RISING */
  10.     user_button_int_flag = 1;
  11.     /* USER CODE END LL_EXTI_LINE_13_RISING */
  12.   }
  13.   /* USER CODE BEGIN EXTI13_IRQn 1 */

  14.   /* USER CODE END EXTI13_IRQn 1 */
  15. }
  16. void AppUserLoop(void)
  17. {
  18.     if(user_button_int_flag != 0)
  19.     {
  20.         user_button_int_flag = 0;
  21.         LL_mDelay(20);
  22.         if(LL_GPIO_IsInputPinSet(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin))
  23.         {
  24.             LL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);
  25.             LL_GPIO_TogglePin(LED_RED_GPIO_Port,LED_RED_Pin);
  26.         }
  27.     }
  28. }


改好后的运行效果和之前轮询模式一样,可以正常通过按键切换2个LED的状态,这里就不重复展示了


Stahan 发表于 2025-1-19 23:50 来自手机 | 显示全部楼层
这个屏幕看着不错啊
IntelCore 发表于 2025-1-20 14:51 | 显示全部楼层
消抖也是入门单片机必学的一个技术。
Amazingxixixi 发表于 2025-1-21 16:58 | 显示全部楼层
学习一下啊,还有好多需要学习的。
Amazingxixixi 发表于 2025-1-24 12:58 | 显示全部楼层
学习一下,提升技能,新年快乐
地瓜patch 发表于 2025-1-24 15:06 来自手机 | 显示全部楼层
屏幕好小啊
聪聪哥哥 发表于 2025-2-25 20:42 | 显示全部楼层
大佬 您好  帖子里面的 PDF是哪个啊,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

168

主题

826

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部