完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件:esp32-Wroom-IE
SDK:esp-idf v4.4、esp-adf v2.4 逻辑需求: 1. GPIO_NUM_39作为GPIO输入中断,双边沿触发;GPIO_NUM_39,外部已下拉;当触发中断,则改变GPIO_NUM_32输出状态。Code: Select all void trigger_demo(void *arg) { static uint8_t demo_state = 0; demo_state = ~demo_state; gpio_set_level(GPIO_NUM_32, demo_state);}void board_pins_init(void) { gpio_isr_handle_t handle; gpio_config_t io_conf; memset(&io_conf, 0, sizeof(io_conf)); io_conf.mode = GPIO_MODE_INPUT; io_conf.pin_bit_mask = BIT64(GPIO_NUM_39); io_conf.pull_down_en = 0; io_conf.pull_up_en = 1; io_conf.intr_type = GPIO_INTR_ANYEDGE; gpio_config(&io_conf); gpio_install_isr_service(0); gpio_isr_handler_add(ALARM_INPUT_GPIO, trigger_demo, NULL); 2. 蓝牙,Code: Select all int app_bt_init(audio_board_handle_t board_handle){ esp_err_t err; if(is_inited) { ESP_LOGW(TAG, "app bt already had been initialized!"); return ESP_OK; } err = esp_bt_controller_mem_release(ESP_BT_MODE_BLE); if(err != ESP_OK) { ESP_LOGE(TAG, "bt controller mem release error:%d", err); goto init_err; } esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); err = esp_bt_controller_init(&bt_cfg); if(err != ESP_OK) { ESP_LOGE(TAG, "bt controller init error: %d", err); goto init_err; } err = esp_bt_controller_enable(ESP_BT_MODE_BTDM); if(err != ESP_OK) { ESP_LOGE(TAG, "bt controller enable error: %d", err); goto init_err; } err = esp_bluedroid_init(); if(err != ESP_OK) { ESP_LOGE(TAG, "bluedroid init error: %d", err); goto init_err; } err = esp_bluedroid_enable(); if(err != ESP_OK) { ESP_LOGE(TAG, "bluedroid enable error: %d", err); goto init_err; } /** 设置蓝牙可被连接,且可被发现 */ esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);} 在启动蓝牙的情况下,存在以下问题: 1. 当GPIO_NUM_39输入高电平,将会每1秒进入一次中断;当停止高电平输入,不会出现每1秒进入中断这种现象。 2. 当屏蔽上述esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);,则GPIO_NUM_39输入高,只触发一次中断。断开高电平,也是触发一次中断。GPIO双边沿中断逻辑正常。 请教下,设置蓝牙可被连接且发现,为什么会影响到GPIO中断?谢谢! |
|
相关推荐
1个回答
|
|
在您提供的代码和硬件描述中,ESP32蓝牙不断触发GPIO外部中断的原因可能有以下几点:
1. **外部信号干扰**:如果GPIO_NUM_39的外部信号受到电磁干扰,可能会导致误触发。请确保外部信号稳定且符合ESP32的输入电压范围。 2. **硬件连接问题**:检查GPIO_NUM_39的硬件连接是否正确,确保没有短路或接触不良的情况。 3. **GPIO配置问题**:在`board_pins_init`函数中,确保GPIO_NUM_39的配置正确。您需要设置GPIO为输入模式,并启用中断功能。以下是配置GPIO的示例代码: ```c gpio_config_t io_conf; io_conf.intr_type = GPIO_INTR_ANYEDGE; // 双边沿触发 io_conf.mode = GPIO_MODE_INPUT; io_conf.pin_bit_mask = (1ULL< io_conf.pull_up_en = 0; // 禁用上拉 gpio_config(&io_conf); ``` 4. **中断服务程序(ISR)问题**:确保ISR能够正确处理中断,并且在中断处理完成后释放中断。以下是注册和安装ISR的示例代码: ```c gpio_install_isr_service(0); gpio_isr_handler_add(GPIO_NUM_39, trigger_demo, NULL); // 注册ISR ``` 5. **软件逻辑问题**:检查`trigger_demo`函数中的逻辑是否正确。确保在中断触发时,GPIO_NUM_32的状态能够正确切换。 6. **电源问题**:检查ESP32的电源是否稳定,不稳定的电源可能会影响GPIO的正常工作。 7. **固件问题**:您使用的ESP-IDF版本可能存在已知的bug。尝试升级到最新版本的ESP-IDF,看看问题是否得到解决。 8. **硬件损坏**:如果以上方法都无法解决问题,可能是ESP32硬件本身存在问题。尝试更换一个新的ESP32模块,看看问题是否仍然存在。 综上所述,要解决ESP32蓝牙不断触发GPIO外部中断的问题,您需要从硬件连接、GPIO配置、中断服务程序、软件逻辑等方面进行排查。希望这些建议能帮助您找到问题的原因并解决它。 |
|
|
|
只有小组成员才能发言,加入小组>>
541浏览 6评论
454浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
434浏览 5评论
436浏览 4评论
409浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 03:25 , Processed in 1.210113 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号