ESP32蓝牙不断触发GPIO外部中断

最后一只晴天小猪
Posts: 5
Joined: Mon Aug 22, 2022 2:36 am

ESP32蓝牙不断触发GPIO外部中断

Postby 最后一只晴天小猪 » Mon Aug 22, 2022 3:32 am

硬件: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中断?谢谢!

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: ESP32蓝牙不断触发GPIO外部中断

Postby ESP_Gargamel » Mon Aug 22, 2022 10:44 am

麻烦以能复现问题的最小工程形式提供,需包含 sdkconfig。
另外,使用其他 GPIO 作为输入中断,有无问题?

最后一只晴天小猪
Posts: 5
Joined: Mon Aug 22, 2022 2:36 am

Re: ESP32蓝牙不断触发GPIO外部中断

Postby 最后一只晴天小猪 » Tue Aug 23, 2022 1:21 am

用其它输入引脚也是会的,公司项目用到了GPIO_NUM_36,也会出现这种现象。在手册也没看到蓝牙占用这几个引脚,就是有规律的1秒进入中断。附件图片中的GPIO_ALARM_IN就是接到了GPIO_NUM_39;GPIO_ALARM_OUT接到了GPIO_NUM_32。
Attachments
in.png
in.png (61.03 KiB) Viewed 4019 times
pipeline_a2dp_sink_stream.zip
(40.98 KiB) Downloaded 676 times

最后一只晴天小猪
Posts: 5
Joined: Mon Aug 22, 2022 2:36 am

Re: ESP32蓝牙不断触发GPIO外部中断

Postby 最后一只晴天小猪 » Tue Aug 23, 2022 1:24 am

ESP_Gargamel wrote:
Mon Aug 22, 2022 10:44 am
麻烦以能复现问题的最小工程形式提供,需包含 sdkconfig。
另外,使用其他 GPIO 作为输入中断,有无问题?
工程已以附件形式上传了,外加引脚外部电路图。

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: ESP32蓝牙不断触发GPIO外部中断

Postby ESP_Gargamel » Tue Aug 23, 2022 8:16 am

请参看下 https://github.com/espressif/esp-idf/bl ... .h#L72-L88
以及 ECO 文档的 3.11 章节。
两种 workaround:
1、menuconfig 中关闭蓝牙的 modem sleep
2、应用中调用一下 adc_power_acquire,但电流会增加约 1mA

Who is online

Users browsing this forum: Bing [Bot] and 51 guests