esp32 ble开启后,导致GPIO39中断不正常

prayer
Posts: 4
Joined: Sun Jan 05, 2020 2:37 am

esp32 ble开启后,导致GPIO39中断不正常

Postby prayer » Sun Jan 05, 2020 2:48 am

问题:BLE开启后,GPIO39如果配置为输入并且开启中断,中断会被一直触发,有知道怎么解决的吗?

背景:
IDF版本: ESP-IDF v4.0-beta1-134-gef17d8bba-dirty
硬件:ESP32 WROVER-B 8Mflaash
GPIO39硬件电路已外接上拉电阻,如果注释掉BLE部分代码,GPIO39中断触发是正常的。
关键代码:
在demo例程ble_spp_server的基础上添加GPIO39的GPIO初始化和中断初始化函数
  1. static void IRAM_ATTR gpio_isr_handler(void* arg)
  2. {
  3.     uint32_t gpio_num = (uint32_t) arg;
  4.     BaseType_t xHigherPriorityTaskWoken;
  5.     xHigherPriorityTaskWoken = pdFALSE;
  6.     ets_printf("GPIO39 interrupt %d  \r\n",gpio_num);
  7. }
  8.  
  9. void gpio39_test(void)
  10. {
  11.     gpio_config_t io_conf;
  12.     //input
  13.     //disable interrupt
  14.     io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
  15.     //bit mask of the pins, use GPIO4/5 here
  16.     io_conf.pin_bit_mask = 1ULL<<39;
  17.     //set as input mode    
  18.     io_conf.mode = GPIO_MODE_INPUT;
  19.     //disable pull-down mode
  20.     io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
  21.     //disable pull-up mode
  22.     io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
  23.     gpio_config(&io_conf);
  24.     gpio_set_intr_type(39, GPIO_INTR_ANYEDGE);
  25.     gpio_install_isr_service(0);
  26.     //hook isr handler for HALL gpio pin
  27.       gpio_isr_handler_add(39, gpio_isr_handler, (void*) 39);
  28.  
  29.  
  30. }
  31. void app_main(void)
  32. {
  33.     gpio39_test();
  34.     esp_err_t ret;
  35.     esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
  36.  
  37.     // Initialize NVS
  38.     ret = nvs_flash_init();
  39.     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  40.         ESP_ERROR_CHECK(nvs_flash_erase());
  41.         ret = nvs_flash_init();
  42.     }
  43.     ESP_ERROR_CHECK( ret );
  44.  
  45.     ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));
  46.  
  47.     ret = esp_bt_controller_init(&bt_cfg);
  48.     if (ret) {
  49.         ESP_LOGE(GATTS_TABLE_TAG, "%s enable controller failed: %s\n", __func__, esp_err_to_name(ret));
  50.         return;
  51.     }
  52.  
  53.     ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
  54.     if (ret) {
  55.         ESP_LOGE(GATTS_TABLE_TAG, "%s enable controller failed: %s\n", __func__, esp_err_to_name(ret));
  56.         return;
  57.     }
  58.  
  59.     ESP_LOGI(GATTS_TABLE_TAG, "%s init bluetooth\n", __func__);
  60.     ret = esp_bluedroid_init();
  61.     if (ret) {
  62.         ESP_LOGE(GATTS_TABLE_TAG, "%s init bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
  63.         return;
  64.     }
  65.     ret = esp_bluedroid_enable();
  66.     if (ret) {
  67.         ESP_LOGE(GATTS_TABLE_TAG, "%s enable bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
  68.         return;
  69.     }
  70.  
  71.     esp_ble_gatts_register_callback(gatts_event_handler);
  72.     esp_ble_gap_register_callback(gap_event_handler);
  73.     esp_ble_gatts_app_register(ESP_SPP_APP_ID);
  74.  
  75.     spp_task_init();
  76.  
  77.     return;
  78. }

prayer
Posts: 4
Joined: Sun Jan 05, 2020 2:37 am

Re: esp32 ble开启后,导致GPIO39中断不正常

Postby prayer » Mon Jan 06, 2020 4:43 am

补充设置:
menuconfig ---> Component config ---> Bluetooth ---> Bluetooth controller ---> MODEM SLEEP Options --->
[*] Bluetooth modem sleep
Bluetooth Modem sleep mode (ORIG mode(sleep with low power clock))
Bluetooth low power clock (main crystal)

GYC-Espressif
Posts: 5
Joined: Tue Dec 31, 2019 9:57 am

Re: esp32 ble开启后,导致GPIO39中断不正常

Postby GYC-Espressif » Mon Jan 06, 2020 1:55 pm

你好,我用你的代码尝试了在 SPP 例程中添加了 GPIO39 的中断程序,但是并没有发生你提到的中断会被一直触发的情况,当引脚碰到其他地方时确实会多次触发中断,这是因为引脚采集到了毛刺信号。BLE 工作时会发送射频信号,这个操作的顺时电流较大,我建议你首先检查一下你的电路供电是否稳定,再检查该引脚是否受到其他电信号的干扰,如果有示波器可以显示在示波器上观察一下是否外部引入了毛刺信号。

prayer
Posts: 4
Joined: Sun Jan 05, 2020 2:37 am

Re: esp32 ble开启后,导致GPIO39中断不正常

Postby prayer » Tue Jan 07, 2020 3:06 am

GYC-Espressif wrote:
Mon Jan 06, 2020 1:55 pm
你好,我用你的代码尝试了在 SPP 例程中添加了 GPIO39 的中断程序,但是并没有发生你提到的中断会被一直触发的情况,当引脚碰到其他地方时确实会多次触发中断,这是因为引脚采集到了毛刺信号。BLE 工作时会发送射频信号,这个操作的顺时电流较大,我建议你首先检查一下你的电路供电是否稳定,再检查该引脚是否受到其他电信号的干扰,如果有示波器可以显示在示波器上观察一下是否外部引入了毛刺信号。
可以把我上面的补充设置加进去,就会出现了

GYC-Espressif
Posts: 5
Joined: Tue Dec 31, 2019 9:57 am

Re: esp32 ble开启后,导致GPIO39中断不正常

Postby GYC-Espressif » Tue Jan 07, 2020 3:49 am

我在验证的时候已经添加了您的补充设置。

prayer
Posts: 4
Joined: Sun Jan 05, 2020 2:37 am

Re: esp32 ble开启后,导致GPIO39中断不正常

Postby prayer » Tue Jan 07, 2020 4:44 am

我这边又重新用ESP32_DevKitc_V4测试了一遍,如果GPIO39悬空什么都不接确实不会持续进入中断,但如果上面接根杜邦线就能看到中断被持续触发。另外我之前的问题出现条件是外接了上拉电阻,我估计可能和这个有关。

huagui
Posts: 1
Joined: Sat Jan 15, 2022 5:15 am

Re: esp32 ble开启后,导致GPIO39中断不正常

Postby huagui » Sat Jan 15, 2022 5:16 am

关闭bluetooth modem sleep试试

xiangmoshujing
Posts: 1
Joined: Thu Feb 24, 2022 7:10 am

Re: esp32 ble开启后,导致GPIO39中断不正常

Postby xiangmoshujing » Thu Feb 24, 2022 7:14 am

我用wroom也遇到了类似情况,io39连了红外接收,开启ble,可以看到红外接收头的灯在拼命闪,说明有信号
红外也识别不了数据
关了蓝牙,才正常

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: esp32 ble开启后,导致GPIO39中断不正常

Postby ESP_XuLZ » Mon Feb 28, 2022 2:56 am

我这边按照 prayer 提供的 GPIO39 配置代码确实会触发多次中断,但有无开启蓝牙的现象是一样的,这是因为引脚采集到了毛刺信号; 你 GPIO39 配置的代码是怎样的,并且是否可以使用示波器抓下 GPIO39 的波形?配置其他普通GPIO引脚在 蓝牙开启或者关闭时 是否触发中断的表现也不同?并且 IO39 的外置电路原理图是否可以发我们看下

Strive
Posts: 5
Joined: Fri Mar 18, 2022 9:24 am

Re: esp32 ble开启后,导致GPIO39中断不正常

Postby Strive » Wed Apr 27, 2022 6:11 am

ESP_XuLZ wrote:
Mon Feb 28, 2022 2:56 am
我这边按照 prayer 提供的 GPIO39 配置代码确实会触发多次中断,但有无开启蓝牙的现象是一样的,这是因为引脚采集到了毛刺信号; 你 GPIO39 配置的代码是怎样的,并且是否可以使用示波器抓下 GPIO39 的波形?配置其他普通GPIO引脚在 蓝牙开启或者关闭时 是否触发中断的表现也不同?并且 IO39 的外置电路原理图是否可以发我们看下
请问下大佬这个问题解决了吗?最后是怎么解决的?

Who is online

Users browsing this forum: No registered users and 32 guests