stm32 - 如何使用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
. int
带有值1
并且0
可用于 C.
所做的是声明一个变量state
,并由于static
关键字而将其保存在堆内存中。if
(而不是退出外部语句的范围时将被破坏的堆栈内存)它被初始化为false
然后在您按下按钮时更新。
推荐阅读
- c# - 想要生成一个新的日期时间,它不在使用c#的日期时间间隔列表中
- docker - 如何在 docker 中停止 .net 核心应用程序?
- c# - FirstUnmatchedIndex 使用 CurrentCultureIgnoreCase
- makefile - assimp 编译错误:DirectX_D3DX9_LIBRARY not found 虽然安装了directX
- jenkins - 使用 Multibranch Pipeline Jenkins 作业,是否可以在不重新运行现有分支构建的情况下运行分支索引
- prolog - DTProbLog 查询
- windows - Windows 10 如何猜测 1080p 显示器的物理尺寸?
- python - Django dict键,for循环中的值不起作用
- java - 如何防止快速双击复选框?
- tabulator - 如何将新行添加到 Tabulator 表中?