我正在寻找一个使用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
先谢谢大家。
发布于 2021-01-16 13:13:26
代码有几个问题。没有内存功能,您正在以最大速度读取按钮。
这是固定的睡眠一段时间,以考虑人类的反应速度和按钮噪音。您还需要一个变量来存储前一个状态。
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,然后在按下按钮时更新。
发布于 2021-01-16 23:50:32
可能的(粗)解决办法:
#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来找到更一般的答案。
https://stackoverflow.com/questions/65737973
复制相似问题