ESP_IDF提供了一种硬件定时器使用接口,这在类似扫描按键这种应用上是个不错的选择,使用硬件定时器检测按键相比任务中扫描方式有两个优势
1.占用系统资源少
2.响应有保障,不丢按键操作
以下为实现示例:
包含头文件
#include "driver/hw_timer.h"
#define GPIO_KEY_PIN 13
引脚初台化
gpio_config_t io_conf;
//按键检测引脚初始化
io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pin_bit_mask = 1<
io_conf.pull_down_en = 0;
io_conf.pull_up_en = 1;//上接电阻打开
gpio_config(&io_conf);
硬件定时器安装
//硬件定时器,用于扫描按键输入
hw_timer_init(scan_timer,0);
hw_timer_alarm_us(5000,true); //5ms中断
定时器回调函数(即定时器执行内容),注意该函数是在中断中调用
//5ms定时器 按键输入检测
void scan_timer(void* parameter)
{
if(gpio_get_level(GPIO_KEY_PIN)==0) //按下
{
if(g_KeyScanCnt < 1000)
g_KeyScanCnt++;
}
else
{
if(g_KeyScanCnt > 3)
{
if(g_KeyScanCnt < 600)//短按
{
PostMessageFromISR(ID_MSG_KEY,0);//按键确认发送到处理任务
}
else //长按
{
PostMessageFromISR(ID_MSG_KEY,1);//按键确认发送到处理任务
}
}
g_KeyScanCnt=0;
}
}
|
|