GPIO 输入—按键检测
2024-08-25 23:14:54
这里要用到一定的模电知识。电容两端电压不能突变,电感两端电流不能突变。这里利用了电容的放电延时实现硬件消抖。按键按下会有抖动,波形有毛刺,使得高低电平显现不明显,而按键按下时,电容放电一下,马上又被充电,此时电容两端的电压不会突然变化,这个延时时间恰好可以达到消抖作用。
这里需要使用一个固件库函数:
/**
* @brief Reads the specified input port pin.
* @param GPIOx: where x can be (A..K) to select the GPIO peripheral for STM32F405xx/407xx and STM32F415xx/417xx devices
* x can be (A..I) to select the GPIO peripheral for STM32F42xxx/43xxx devices.
* x can be (A, B, C, D and H) to select the GPIO peripheral for STM32F401xx devices.
* @param GPIO_Pin: specifies the port bit to read.
* This parameter can be GPIO_Pin_x where x can be (0..15).
* @retval The input port pin value.
*/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
uint8_t bitstatus = 0x00; /* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
{
bitstatus = (uint8_t)Bit_SET;
}
else
{
bitstatus = (uint8_t)Bit_RESET;
}
return bitstatus;
}
在第一次使用这个函数的时候,我没有理解到位,一看到定义bitstatus=0x00,就以为返回的是个八位端口的值,其实这个返回值只有0或者1两种结果。
/**
* @brief GPIO Bit SET and Bit RESET enumeration
*/
typedef enum
{
Bit_RESET = 0,
Bit_SET
}BitAction;
在这个枚举中,可以知道,读取IO的数据只可能是0或者1。
最新文章
- valuestack,stackContext,ActionContext.之间的关系以及如何存取数值的
- Ubuntu下编译第一个C程序的成功运行
- chrome浏览器遇到的异常
- C#下的Redis 学习
- BZOJ_1028_[JSOI2007]_麻将_(模拟+贪心)
- 安装Cygwin
- Java数据结构和算法(十)——二叉树
- C#处理JavaScript引擎
- Android 启动APP时黑屏白屏的解决方案
- python语法_字符串
- QQ聊天框变成方框口口口口的解决办法
- Loadrunner进行HTTPS协议性能测试
- Python相关机器学习‘武器库’
- Gym 101194E / UVALive 7901 - Ice Cream Tower - [数学+long double][2016 EC-Final Problem E]
- hadoop 分布式机群搭建
- redis 的一主二从三哨兵模式
- Windows Phone本地数据库(SQLCE):11、使用LINQ查询数据库(翻译) (转)
- Linux学习16-CentOS安装gitlab环境
- zabbix install
- 48 (OC)* 适配iPad和iPhone、以及横竖屏适配。