如何使用STM32编写锁存开关功能?
How to code latch switch function using 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
提前谢谢大家。
代码有几个问题。没有记忆功能,你正在以最快的速度阅读按钮。
这是通过休眠一段时间来解决的,以考虑到人类的反应速度和按钮噪音。您还需要一个变量来存储以前的状态。
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
。具有值 1
和 0
的 int
可用于 C。
所做的是声明变量 state
并将其保存在堆内存中,因为 static
关键字。 (而不是当退出外部 if
语句的范围时会被销毁的堆栈内存)它被初始化为 false
然后当你按下按钮时更新。
可能的(粗略的)解决方案:
#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 EXTI),而不是不断地轮询状态。并且几乎总是需要在按钮引脚(RC 滤波器)上使用硬件去抖动 and/or 使用软件去抖动来防止错误检测到边缘。 - 另外:这个问题并不是真正的 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
提前谢谢大家。
代码有几个问题。没有记忆功能,你正在以最快的速度阅读按钮。
这是通过休眠一段时间来解决的,以考虑到人类的反应速度和按钮噪音。您还需要一个变量来存储以前的状态。
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
。具有值 1
和 0
的 int
可用于 C。
所做的是声明变量 state
并将其保存在堆内存中,因为 static
关键字。 (而不是当退出外部 if
语句的范围时会被销毁的堆栈内存)它被初始化为 false
然后当你按下按钮时更新。
可能的(粗略的)解决方案:
#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 EXTI),而不是不断地轮询状态。并且几乎总是需要在按钮引脚(RC 滤波器)上使用硬件去抖动 and/or 使用软件去抖动来防止错误检测到边缘。 - 另外:这个问题并不是真正的 STM32 / 硬件特定的,因此您可以通过在这些主题上更广泛地搜索网络来找到更一般的答案。