完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言
最近开发用到了ESP32,乐鑫已经对接口进行比较深度的封装,但是还是看了下外设的参考手册,摘取了一部分结合自己的理解给记录下来。 如有异议,欢迎指正 概述 ESP32芯片具有34个物理GPIO。每个pad都可用作一个通用IO,或连接内部的外设信号。IO_MUX、RTC_IO_MUX和GPIO交换矩阵用于将信号从外设传输至GPIO pad,这些模块共同组成了芯片的IO控制。 备注:这34个物理GPIO pad的序列号为:0-19, 21-23, 25-27, 32-39。其中GPIO6-GPIO11已经作为模组上SPIFlash使用【无法复用】,GPIO34-39仅作为输入管脚,其他的可作为输入输出管脚 GPIO交换矩阵结构图 数字IO口通过IO_MUX复用器来选择通用IO口还是复用外设功能,然后进过GPIO matrix交换矩阵来关联到具体的外设中 图中也可以配置不进过交换矩阵,这样可以提高引脚的高频特性【如高速率 UART SPI SDIO】 GPIO配置的流程 配置外设信号寄存器GPIO_FUNC_IN_SEL_CFG,选择需要配置的PIN脚 设置GPIO_ENABLE_DATA使能寄存器 配置IO_MUX寄存器,配置IO功能(上下拉、输入输出) 备注: 同一个引脚可以同时绑定多个内部信号 可以通过寄存器GPIO_FUNC_IN_INV_SEL对信号进行取反,在一些应用中很实用 当某个外设不绑定GPIO时,例如SPI中的MOSI不使用,可以配置GPIO_FUNC_IN_SEL为0x38或0x30,保证外设的正常运行 Strapping Pins 设计中需要避免外设管脚直接影响ESP Strapping引脚电平状态,strapping引脚会直接影响上电逻辑 RTC IO_MUX低功耗IO功能 当管脚被配置成RTC GPIO时,能在系统处于Deep-Sleep睡眠模式下保持电平值,也可以实现在低功耗模式下的唤醒 PS:测试发现,ESP32在低功耗上面表现并不是很优异 Light-Sleep模式管脚功能 当 ESP32 处于 Light-sleep 模式时管脚可以有不同的功能。如果某一 GPIO pad 的 IO_MUX 寄存器中 SLP_SEL位置为 1,芯片处于 Light-sleep 模式下将由另一组不同的寄存器控制 pad。 如果 SLP_SEL 置为 0,则芯片在正常工作和 Light-sleep 模式下,管脚的功能一样。 Pad Hold特性 每个 IO pad(包括 RTC pad)都有单独的 hold 功能,由 RTC 寄存器控制。pad 的 hold 功能被置上后,pad 在 置上 hold 那一刻的状态被强制保持,无论内部信号如何变化,修改 IO_MUX 配置或者 GPIO 配置,都不会改变 pad 的状态。应用如果希望在看门狗超时触发内核复位和系统复位时或者 Deep-sleep 时 pad 的状态不被改变, 就需要提前把 hold 置上。 IO_MUX Pad列表 设计硬件前,可以查看IO的复用功能来进行合理的配置 RTC_MUX管脚清单 代码例程 打开idf目录下的gpio_example_main,路径esp-idfexamplesperipheralsgpiomain 代码讲解 开发可移植例程代码,具体可看注释 GPIO18 GPIO19配置为输出,通过接口gpio_set_level配置输出电平 GPIO4 GPIO5配置成输入中断使能,外部中断入口gpio_isr_handler #define GPIO_OUTPUT_IO_0 18 #define GPIO_OUTPUT_IO_1 19 #define GPIO_OUTPUT_PIN_SEL ((1ULL《《GPIO_OUTPUT_IO_0) | (1ULL《《GPIO_OUTPUT_IO_1)) #define GPIO_INPUT_IO_0 4 #define GPIO_INPUT_IO_1 5 #define GPIO_INPUT_PIN_SEL ((1ULL《《GPIO_INPUT_IO_0) | (1ULL《《GPIO_INPUT_IO_1)) #define ESP_INTR_FLAG_DEFAULT 0 static xQueueHandle gpio_evt_queue = NULL; static void IRAM_ATTR gpio_isr_handler(void* arg) { uint32_t gpio_num = (uint32_t) arg; xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);//中断后发送io消息 } static void gpio_task_example(void* arg) { uint32_t io_num; for(;;) { if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) //收到消息打印对应引脚的电平 { printf(“GPIO[%d] intr, val: %dn”, io_num, gpio_get_level(io_num)); } } } void app_main(void) { gpio_config_t io_conf; //disable interrupt io_conf.intr_type = GPIO_PIN_INTR_DISABLE; //set as output mode io_conf.mode = GPIO_MODE_OUTPUT;//输出模式 //bit mask of the pins that you want to set,e.g.GPIO18/19 io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;//配置输出 //disable pull-down mode io_conf.pull_down_en = 0;//禁用下拉 //disable pull-up mode io_conf.pull_up_en = 0;//禁用上拉 //configure GPIO with the given settings gpio_config(&io_conf);//进行配置 //interrupt of rising edge io_conf.intr_type = GPIO_PIN_INTR_POSEDGE;//上升沿中断 //bit mask of the pins, use GPIO4/5 here io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;//配置输入 //set as input mode io_conf.mode = GPIO_MODE_INPUT;//输入模式 //enable pull-up mode io_conf.pull_up_en = 1;//使能上拉 gpio_config(&io_conf); //change gpio intrrupt type for one pin gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE); //create a queue to handle gpio event from isr gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));//创建队列 //start gpio task xTaskCreate(gpio_task_example, “gpio_task_example”, 2048, NULL, 10, NULL);//创建任务 //install gpio isr service gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);//安装中断服务 //hook isr handler for specific gpio pin gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);//GPIO4中断回调注册 //hook isr handler for specific gpio pin gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void*) GPIO_INPUT_IO_1);//GPIO5中断回调注册 //remove isr handler for gpio number. gpio_isr_handler_remove(GPIO_INPUT_IO_0);//移除测试 //hook isr handler for specific gpio pin again gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);//重新添加测试 int cnt = 0; //1秒闪烁 while(1) { printf(“cnt: %dn”, cnt++); vTaskDelay(1000 / portTICK_RATE_MS); gpio_set_level(GPIO_OUTPUT_IO_0, cnt % 2); gpio_set_level(GPIO_OUTPUT_IO_1, cnt % 2); } } |
|
|
|
只有小组成员才能发言,加入小组>>
4498个成员聚集在这个小组
加入小组3332 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4260 浏览 1 评论
4287 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 07:45 , Processed in 0.578941 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号