1. MultiButton
MultiButton 是一个事件驱动型的按键驱动模块。作者的 github 仓库地址:
MultiButton 可以无限量扩展按键,支持按键事件的回调处理机制,可以让代码结构更加清晰。也可以调用获取按键事件接口,轮询按键事件。
支持的按键事件有:
事件 | 说明 |
---|---|
PRESS_DOWN | 按键按下,每次按下都触发 |
PRESS_UP | 按键弹起,每次松开都触发 |
PRESS_REPEAT | 重复按下触发,变量repeat计数连击次数 |
SINGLE_CLICK | 单击按键事件 |
DOUBLE_CLICK | 双击按键事件 |
LONG_PRESS_START | 达到长按时间阈值时触发一次 |
LONG_PRESS_HOLD | 长按期间一直触发 |
在STM32F407中移植MultiButton
MultiButton 使用起来非常简单,用户只需要提供一个读取按键电平的函数即可。可以在裸机中使用,也可以在 RTOS 中使用。大致的使用步骤:
- 定义一个按键对象
- 初始化按键按键对象,绑定按键的读取电平函数,提供按键的触发条件(是低电平触发还是高电平触发)
- 注册按键事件回调函数(如果不使用回调编程方法,可以不用注册)
- 启动按键
- 间隔 5-20ms 扫描按键处理函数,可以使用定时器中断每隔 5-20ms 扫描一次,或者使用 RTOS 创建间隔 5-20ms 的按键扫描任务。
移植前,先准备一份可以运行的工程源码,我直接使用 STM32CubeMX 生成了一份FreeRTOS的例程。例程可以保证初始化了自己板子上的按键 GPIO 口,以及可以打印输出串口(需要用到串口打印输出调试信息)。
下面添加 MultiButton 的应用层代码。
添加按键电平读取函数
uint8_t read_key0_gpio(void)
{
return HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin);
}
uint8_t read_key1_gpio(void)
{
return HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);
}
定义按键结构体,初始化按键
/* 定义两个按键结构体待使用 */
struct Button key0;
struct Button key1;
/* 第三个参数0,代表按键是低电平触发 */
button_init(&key0, read_key0_gpio, 0);
button_init(&key1, read_key1_gpio, 0);