经过一级级的封装,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 这个是最接近底层的一句了。
至于消息如何传上来,如果设置开启消息传输 这些我还没整明白,希望后面有人可以补上!!!!
离线