ESP32 GPIO函数相关介绍

本文详细介绍ESP32 GPIO库的各项功能,包括初始化、中断处理、电平设置、模式配置等,并提供实例解析。掌握这些函数,轻松操控ESP32的GPIO引脚进行嵌入式开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP32 GPIO函数库介绍

函数名称参数类型返回值主要功能注:
gpio_configgpio_config_t*返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误初始化GPIO
gpio_reset_pingpio_num_t总是返回ESP_OK将GPIO设置为默认状态,使能上拉同时关闭输入输出功能。常用于关闭ESP32与外设的连接
gpio_set_intr_typegpio_num_t 和gpio_int_type_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误设置GPIO中断触发类型,例如上升沿或下降沿等触发。
gpio_intr_enablegpio_num_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误使能GPIO中断功能
gpio_intr_disablegpio_num_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误关闭GPIO中断功能
gpio_set_levelgpio_num_t和uint32_t level。0为低电平,1为高电平。返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误设置GPIO的输出电平的高低
gpio_get_levelgpio_num_tint获得GPIO当前电平高低状态,返回值为0或1.当引脚未被初始化为输入或输出状态时总是返回0.
gpio_set_directiongpio_num_t和gpio_mode_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误设置GPIO的数据流通方向,例如仅输入、仅输出、输入和输出。
gpio_set_pull_modegpio_num_t和gpio_pull_mode_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误设置GPIO为上拉或下拉模式,仅适用于同时具有输入和输出功能的引脚,仅仅具有输入功能的引脚34-39不可以使用本函数进行配置。
gpio_wakeup_enablegpio_num_t和gpio_int_type_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误使能GPIO唤醒函数,仅支持高电平或低电平唤醒。
gpio_wakeup_disablegpio_num_t和gpio_int_type_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误关闭GPIO唤醒功能。
gpio_isr_registerfn函数指针,arg参数,intr_alloc_flags,gpio_isr_handle_t *handle中断函数执行后的返回地址。返回ESP_OK,ESP_ERR_INVALID_ARG参数错误,ESP_ERR_NOT_FOUND没有中断发现错误统一为所有GPIO注册一个中断服务函数,任何GPIO中断都会调用此函数。
gpio_pullup_engpio_num_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误使能GPIO上拉功能
gpio_pullup_disgpio_num_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误关闭GPIO上拉功能
gpio_pulldown_engpio_num_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误开启GPIO下拉功能
gpio_pulldown_disgpio_num_t返回ESP_OK或者ESP_ERR_INVALID_ARG参数错误关闭GPIO下拉功能
gpio_install_isr_serviceintr_alloc_flags用于给中断赋予权限返回ESP_OK,ESP_ERR_INVALID_ARG参数错误等开启中断服务程序,与gpio_isr_handler_add()配合使用,与gpio_isr_register()不兼容。
gpio_uninstall_isr_servicevoidvoid卸载ISR服务,释放相关资源。
gpio_isr_handler_addgpio_num_t,gpio_isr_t isr_handler中断服务函数,void *args函数的参数ESP_ERR_INVALID_STATE中断未被初始化,ESP_OK或者ESP_ERR_INVALID_ARG参数错误给相应GPIO添加对应的中断服务程序,
gpio_isr_handler_removegpio_num_tESP_ERR_INVALID_STATE中断未被初始化,ESP_OK或者ESP_ERR_INVALID_ARG参数错误为单个GPIO关闭中断服务程序
gpio_set_drive_capabilitygpio_num_t和gpio_drive_cap_t返回ESP_OK,ESP_ERR_INVALID_ARG参数错误为GPIO配置驱动能力,仅支持配置为输出模式的引脚。
gpio_get_drive_capabilitygpio_num_t,gpio_drive_cap_t *指针返回ESP_OK,ESP_ERR_INVALID_ARG参数错误获得单个引脚的驱动能力信息
gpio_hold_engpio_num_t返回ESP_OK,ESP_ERR_INVALID_ARG参数错误引脚状态保持使能,适用于输入和输出,使能后引脚状态强制锁定,高低电平状态不受外界影响。深度睡眠模式下无法使用此功能。
gpio_hold_disgpio_num_t返回ESP_OK,ESP_ERR_INVALID_ARG参数错误关闭引脚状态锁定功能,
gpio_deep_sleep_hold_envoidvoid使能深度睡眠状态下依然可以使用引脚状态锁定功能,gpio_hold_dis()函数可以关闭此功能。
gpio_deep_sleep_hold_disvoidvoid关闭深度睡眠状态下依然可以使用引脚状态锁定的功能
gpio_iomux_ingpio_num和signal_idx信号ID,可在soc/gpio_sig_map.h中查询void通过IO交换矩阵使引脚与内部外设相连接,仅可将引脚设置为外设的输入接口
gpio_iomux_outgpio_num,int func(外设功能号可在soc/io_mux_reg.h中查看)和bool oen_inv当需要反转输出是设置为Truevoid通过交换矩阵将GPIO引脚设置为外设的输出接口
gpio_force_hold_allvoidesp_err_t强制保持引脚数字状态
gpio_force_unhold_allvoidesp_err_t解除引脚保持状态
gpio_sleep_sel_engpio_num_tESP_OK启用SLP_SEL在lightsleep中自动更改GPIO状态。
gpio_sleep_sel_disgpio_num_tESP_OK关闭SLP_SEL在lightsleep中自动更改GPIO状态。
gpio_sleep_set_directiongpio_num_t和gpio_mode_t返回ESP_OK,ESP_ERR_INVALID_ARG参数错误在睡眠状态设置引脚的数据输送方向
gpio_sleep_set_pull_modegpio_num_t和gpio_pull_mode_t返回ESP_OK,ESP_ERR_INVALID_ARG参数错误在睡眠状态下设置引脚为上拉或下拉
gpio_deep_sleep_wakeup_enablegpio_num_t和gpio_int_type_t中断类型返回ESP_OK,ESP_ERR_INVALID_ARG参数错误使能GPIO深度睡眠状态下唤醒函数,用户无法在APP中使用,由SDK调用。
gpio_deep_sleep_wakeup_disablegpio_num_t返回ESP_OK,ESP_ERR_INVALID_ARG参数错误关闭深度睡眠状态下的唤醒函数
### ESP32 GPIO 中断服务函数 对于 ESP32GPIO 中断功能,在定义中断服务例程 (ISR) 函数时,需遵循特定的语法结构以便于当指定条件满足时能够被正确调用。通常情况下,此函数不执行耗时操作而是尽快处理引起中断事件并返回[^1]。 #### 定义与配置中断服务例程 为了设置一个有效的 GPIO 中断,首先要初始化对应的 GPIO 引脚,并为其分配相应的模式(输入/输出)。之后,通过 `gpio_install_isr_service` 初始化全局 ISR 服务,再利用 `gpio_set_intr_type` 设置具体的中断类型,最后绑定自定义的 ISR 处理程序给目标引脚: ```c #include "driver/gpio.h" void IRAM_ATTR gpio_isr_handler(void* arg){ uint8_t pin = (uint8_t)(uintptr_t)arg; // 执行快速响应代码... } // 配置GPIO作为输入端口 gpio_config_t io_conf; io_conf.intr_type = GPIO_INTR_DISABLE; //禁用中断 io_conf.mode = GPIO_MODE_INPUT; //设置为输入模式 io_conf.pin_bit_mask = (1ULL<<pin_num); //选择GPIO号 io_conf.pull_up_en = 0; //关闭上拉电阻 io_conf.pull_down_en = 0; //关闭下拉电阻 gpio_config(&io_conf); // 启动全局ISR服务 gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT); // 设定具体GPIO中断类型 gpio_set_intr_type(pin_num, GPIO_INTR_POSEDGE); // 绑定ISR处理器至对应GPIO gpio_isr_handler_add(pin_num, gpio_isr_handler, (void*)(intptr_t)pin_num); ``` 上述 C 语言代码展示了如何创建一个简单的上升沿触发的 GPIO 中断服务例程。这里需要注意的是,任何在 ISR 内部运行的操作都应该是非常迅速完成的任务;长时间运行的任务应该交由主线程或其他任务来处理。 另外值得注意的一点是在多管脚同时配置有相同类型的边沿敏感型中断的情况下,可能会遇到硬件无法精确识别哪个引脚引发了实际中断的问题。针对这种情况的一个解决方案是采用矩阵扫描的方式或者减少并发激活中断源的数量以提高可靠性[^2]。 #### 调试技巧 调试过程中可以借助日志打印、LED 指示灯或者其他外部设备辅助判断中断是否正常工作以及确认触发时机。确保编译选项开启了优化级别较低的支持调试信息生成的功能,这样可以在出现问题的时候更容易定位错误所在位置[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值