乐鑫技术交流
直播中

李霞

7年用户 1185经验值
私信 关注
[问答]

ESP32蓝牙不断触发GPIO外部中断的原因?

硬件: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)

刘勇

2024-6-14 16:17:34
在您提供的代码和硬件描述中,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_down_en = 1; // 启用下拉
   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配置、中断服务程序、软件逻辑等方面进行排查。希望这些建议能帮助您找到问题的原因并解决它。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分