首页 > 解决方案 > 如何使用STM32编写锁存开关功能?

问题描述

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

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

谢谢大家。

标签: stm32gpio

解决方案


代码有几个问题。没有记忆功能,您正在以最大速度阅读按钮。

这是通过睡眠一段时间来解决的,以允许人类反应速度和按钮噪音。您还需要一个变量来存储先前的状态。

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带有值1并且0可用于 C.

所做的是声明一个变量state,并由于static关键字而将其保存在堆内存中。if(而不是退出外部语句的范围时将被破坏的堆栈内存)它被初始化为false然后在您按下按钮时更新。


推荐阅读