您尚未登录。

楼主 #1 2018-05-09 17:54:56

mkseven32
会员
注册时间: 2018-04-24
已发帖子: 57
积分: 57

ESP-ADF 添加按键外设流程 粗略理解分享

经过一级级的封装,ESP-ADF 几乎已经看不出底层如何配置硬件。在这里说说一些基本外设的添加流程.

目前开发包提供的外设主要有:WIFI,SD卡,按键,触摸,控制台

总体流程 如下:

阶段一:初始化外设=======》阶段二: 配置对应需要添加外设=========》阶段三: 启动外设

以下添加按键来进行  举例说明:

阶段一 工作:

esp_periph_config_t  periph_cfg = { 0 };
esp_periph_init(&periph_cfg);

esp_periph_config_t 结构体如下,按照个人的理解这个结构体 其实就是容器,它存储着一大堆句柄, 而每一个handle都是由配置的外设,经初始化后得到。

所以初始化的动作 就是清空这个容器

/**
 * @brief Common peripherals configurations
 */
typedef struct {
    void*                     user_context; /*!< peripherals context data */
    esp_periph_event_handle_t event_handle; /*!< The Peripheral events handle */
} esp_periph_config_t;

阶段二 工作:

periph_button_cfg_t btn_cfg = {
        .gpio_mask = GPIO_SEL_36 | GPIO_SEL_39
    };

esp_periph_handle_t button_handle = periph_button_init(&btn_cfg);

开始配置按键, 其实就是对periph_button_cfg_t 的结构体进行赋值, 而这个结构体对应每一个外设 都有特定的结构体。
按键的结构体 periph_button_cfg_t 的内容如下, 赋值完成后 就调用 初始化函数从而得到一个handle, 这个handle就是后面存在容器里的东西

/**
 * @brief   The Button peripheral configuration
 */
typedef struct {
    uint64_t gpio_mask;     /*!< GPIO Mask using for this Button peripheral, it is BIT(GPIO_NUM), ex: GPIO_SEL_36 | GPIO_SEL_36 */
    int long_press_time_ms; /*!< Long press duration in milliseconds, default is 2000ms */
} periph_button_cfg_t;

阶段三 工作:

esp_periph_start(button_handle);

直接调用esp_periph_start(); 函数 把刚刚初始化外设得到的handle 存进容器,也就是开启了外设。


其他信息备注:

按键目前支持 短按,短按释放,长按,长按释放四种识别。

/**
 * @brief      Peripheral button event id
 */
typedef enum {
    PERIPH_BUTTON_UNCHANGE = 0, /*!< No event */
    PERIPH_BUTTON_PRESSED,      /*!< When button is pressed */
    PERIPH_BUTTON_RELEASE,      /*!< When button is released */
    PERIPH_BUTTON_LONG_PRESSED, /*!< When button is pressed and kept for more than `long_press_time_ms` */
    PERIPH_BUTTON_LONG_RELEASE, /*!< When button is released and event PERIPH_BUTTON_LONG_PRESSED happened */
} periph_button_event_id_t;

最后在大while里面去等待 msg 的到来!

if (msg.source_type == PERIPH_ID_BUTTON
					  && msg.cmd == PERIPH_BUTTON_PRESSED
					  && msg.source == (void *)button_handle)
{
    if((int) msg.data == LYRAT_BUTTON_REC)
}

msg.source_type  -=====》外设类别 按键
msg.cmd  =====》 识别按键 动作
msg.source ====》 按键 的handle
msg.data  =====》 按键GPIO 定义宏, 这个LYRAT_BUTTON_REC 是我自己重新定义 的 #define LYRAT_BUTTON_REC    GPIO_NUM_36 这个是最接近底层的一句了。

至于消息如何传上来,如果设置开启消息传输 这些我还没整明白,希望后面有人可以补上!!!!

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn