首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用STM32编写锁存开关函数?

如何使用STM32编写锁存开关函数?
EN

Stack Overflow用户
提问于 2021-01-15 14:32:12
回答 2查看 739关注 0票数 0

我正在寻找一个使用STM32获得锁存开关功能的代码。我尝试过的下面的代码是在stm32中工作的,但是只有一个按钮函数没有锁存器。

代码语言:javascript
复制
while (1)
{
      if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)== GPIO_PIN_RESET )
      {
          HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
      }
      else
      {
          HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);       
      }         
} 

有人能帮我使GPIOA,GPIO_PIN_5引脚高总是在第一个按钮和GPIOA,GPIO_PIN_5低总是在第二次按压?

该功能将类似于下面的视频https://www.youtube.com/watch?v=zzWzSPdxA0U

先谢谢大家。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-16 13:13:26

代码有几个问题。没有内存功能,您正在以最大速度读取按钮。

这是固定的睡眠一段时间,以考虑人类的反应速度和按钮噪音。您还需要一个变量来存储前一个状态。

代码语言:javascript
复制
while (1)
{
      if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)== GPIO_PIN_RESET )
      {
          static bool state = false;
          if(state == false)
          {
              state = true;
              HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
          }
          else
          {
              state = false
              HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
          }
          while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)== GPIO_PIN_RESET){} // wait for button to be released, otherwise it will keep toggling every 500ms 
      }
      delay_ms(500);
} 

这是C++代码,因为它使用bool。具有int值的10可用于C.

所做的是声明变量state并保存在堆内存中,因为static关键字。(外部if语句的作用域退出时将被销毁的堆栈内存)它被初始化为false,然后在按下按钮时更新。

票数 -1
EN

Stack Overflow用户

发布于 2021-01-16 23:50:32

可能的(粗)解决办法:

代码语言:javascript
复制
#include <stdbool.h>

#define BUTTON_DOWN() (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET)
#define LED(on) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, (on) ? GPIO_PIN_SET : GPIO_PIN_RESET)

static bool _pressed_before = false;
static bool _led = false;

/* somewhere in main loop */
{
    const bool pressed = BUTTON_DOWN();
    if (pressed && !_pressed_before) { /* button pressed? */
        _led = !_led; /* toggle LED state */
        LED(_led);
    }
    _pressed_before = pressed; /* remember state */
}

一些注意事项:

而不是不断轮询状态,您可以使用外部GPIO中断(搜索GPIO )。并且几乎总是有必要使用按钮引脚(RC滤波器)上的硬件脱扣和/或使用软件去噪来防止错误检测到的边缘。-而且:这个问题并不是真正的STM32 /硬件特定的,所以您可以通过更广泛地搜索这些主题的webs来找到更一般的答案。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65737973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档