• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

STM32 CubeMx HAL库外部断检测按键,定时器延时消抖

武飞扬头像
Joseph Wen
帮助1

        常见的单片机按键检测的方式多是在while(1)中以轮询的方式检测按键是否被按下,在进行延时消抖(10ms左右),防止误检测。这样做会长时间的占用单片机的CPU资源,不是一种高效的按键检测方式。我们可以采用外部中断加定时器的方式实现按键检测而又不会长时间占用CPU

        STM32 常规的按键检测流程:

  1.  
    while(1)
  2.  
    {
  3.  
    if(KEY==0)
  4.  
    {
  5.  
    HAL_Delay(10); //延迟10ms再次检测,若还是低电平,代表按键被按下
  6.  
    if(KEY==0)
  7.  
    {
  8.  
    printf("key be pressed!!!\r\n");
  9.  
    }
  10.  
    }
  11.  
    }

        STM32 HAL库外部中断 定时器检测按键的基本思路:外部中断设置下降沿触发,当按键按下单片机检测到下降沿后进入外部中断回调函数→在外部中断回调函数中打开定时器中断(定时时常设置为10ms)→在定时器中断回调函数中检测外部中断IO口电平,若依旧为低电平,代表按键被按下

具体操作步骤:

        1.CubeMx配置

IO口PB1设置为外部中断上升沿触发模式,上拉

学新通

使用定时器1,时钟源选择内部时钟,预分频系数199、向上计数模式,计数值2399。

 学新通

 这里补充一下定时器计数时间的计算公式:Tout=(arr 1)*(psc 1)/Tclk,本例程中APB1外设时钟频率为48MHZ,故Tclk=1/48000000 所以Tout=(200*2400)/48us =10ms

        2.单片机程序

  1.  
    //当按键按下,单片机检测到下降沿后进入此外部中断回调函数
  2.  
    //在外部中断回调函数中开启定时器1
  3.  
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  4.  
    {
  5.  
    if(GPIO_Pin==KEY_GPIO_PIN)
  6.  
    {
  7.  
    HAL_TIM_Base_Start_IT(&htim1);
  8.  
    }
  9.  
     
  10.  
    }
  11.  
     
  12.  
    //定时时间10ms到了进入此中断回调函数中
  13.  
    //在此回调函数中判断IO口电平状态,如果以就为低电平,代表按键被按下
  14.  
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  15.  
    {
  16.  
    if(htim==(&htim1))
  17.  
    {
  18.  
    HAL_TIM_Base_Stop_IT(&htim1);
  19.  
    if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==0)
  20.  
    printf("key be pressed!!!\r\n");
  21.  
    }
  22.  
     
  23.  
     
  24.  
    }
学新通

总结一下,实现用外部中断检测按键,定时器延时消抖的关键步骤:

  1. 设置外部中断触发方式,计算预分频系数psc、计数值大小arr来确定时时间。
  2. 在外部中断回调函数中打开定时器,让其计数。
  3. 定时器溢出回调函数中,关闭定时器,再次检测按键IO口电平值。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgabgfa
系列文章
更多 icon
同类精品
更多 icon
继续加载