esp32外部中断学习笔记
思路:我使用的esp32开发板为简易的开发板,因为板上没有用户自己定义的键盘所以在使用中想要输入或者控制无法完成。研究发现在开发板上有的下载按钮是不是可以在进入系统后复用为一个按键呢。
实现:参考官方的例程对代码如下
首先宏定义参数:
#define KYE_0 0 //GPIO0检测 #define KEYS_SET (1ULL<<0) //GPIO位掩码 #define ESP_INTR_FLAG_DEFAULT 1 //中断标志 static xQueueHandle gpio_evt_queue =NULL; //消息队列
中断服务函数
static void IRAM_ATTR gpio_isr_handler(void* arg) //IRAM_ATTR 必须 { uint32_t gpio_num = (uint32_t) arg; //获取传过来的IO号 xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); //发送消息 }
IO配置
gpio_config_t key_conf; key_conf.mode=GPIO_MODE_INPUT; //输入模式 key_conf.intr_type=GPIO_INTR_POSEDGE; //上向沿 key_conf.pin_bit_mask=KEYS_SET; //前面宏定义的掩码位 key_conf.pull_down_en=0; //不下拉 key_conf.pull_up_en=0; //不上拉 同上(硬件已经下拉了) gpio_config(&key_conf); gpio_set_intr_type(KYE_0,GPIO_INTR_ANYEDGE); //中断触发为下升和下降 注意:前面已经定义了。这里只是表明可能通过函数来修改 gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t)); //创建消息 gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT); //安装中断服务驱动 gpio_isr_handler_add(KYE_0, gpio_isr_handler, (void*) KYE_0); //把KEY_0添加到中断服务表中。注意 后面的参数KEY_0
消息接收:在main函数中等待消息:
if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { //注意后面的:portMAX_DELAY 等待时间超过这个时间就会跳过。但是这里是死等 printf("GPIO[%d] 中断, 状态: %d\n", io_num, gpio_get_level(io_num)); }
实验结果:
完整代码: