乐鑫技术交流
直播中

douyin8

12年用户 1100经验值
私信 关注
[问答]

BLE开启后,GPIO39如果配置为输入并且开启中断,中断会被一直触发怎么解决?

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

背景:
IDF版本: ESP-IDF v4.0-beta1-134-gef17d8bba-dirty
硬件:ESP32 WROVER-B 8Mflaash
GPIO39硬件电路已外接上拉电阻,如果注释掉BLE部分代码,GPIO39中断触发是正常的。
关键代码:
在demo例程ble_spp_server的基础上添加GPIO39的GPIO初始化和中断初始化函数


  • static void IRAM_ATTR gpio_isr_handler(void* arg)
  • {
  •     uint32_t gpio_num = (uint32_t) arg;
  •     BaseType_t xHigherPriorityTaskWoken;
  •     xHigherPriorityTaskWoken = pdFALSE;
  •     ets_printf("GPIO39 interrupt %d  rn",gpio_num);
  • }

  • void gpio39_test(void)
  • {
  •     gpio_config_t io_conf;
  •     //input
  •     //disable interrupt
  •     io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
  •     //bit mask of the pins, use GPIO4/5 here
  •     io_conf.pin_bit_mask = 1ULL<<39;
  •     //set as input mode   
  •     io_conf.mode = GPIO_MODE_INPUT;
  •     //disable pull-down mode
  •     io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
  •     //disable pull-up mode
  •     io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
  •     gpio_config(&io_conf);
  •     gpio_set_intr_type(39, GPIO_INTR_ANYEDGE);
  •     gpio_install_isr_service(0);
  •     //hook isr handler for HALL gpio pin
  •       gpio_isr_handler_add(39, gpio_isr_handler, (void*) 39);


  • }
  • void app_main(void)
  • {
  •     gpio39_test();
  •     esp_err_t ret;
  •     esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();

  •     // Initialize NVS
  •     ret = nvs_flash_init();
  •     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  •         ESP_ERROR_CHECK(nvs_flash_erase());
  •         ret = nvs_flash_init();
  •     }
  •     ESP_ERROR_CHECK( ret );

  •     ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));

  •     ret = esp_bt_controller_init(&bt_cfg);
  •     if (ret) {
  •         ESP_LOGE(GATTS_TABLE_TAG, "%s enable controller failed: %sn", __func__, esp_err_to_name(ret));
  •         return;
  •     }

  •     ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
  •     if (ret) {
  •         ESP_LOGE(GATTS_TABLE_TAG, "%s enable controller failed: %sn", __func__, esp_err_to_name(ret));
  •         return;
  •     }

  •     ESP_LOGI(GATTS_TABLE_TAG, "%s init bluetoothn", __func__);
  •     ret = esp_bluedroid_init();
  •     if (ret) {
  •         ESP_LOGE(GATTS_TABLE_TAG, "%s init bluetooth failed: %sn", __func__, esp_err_to_name(ret));
  •         return;
  •     }
  •     ret = esp_bluedroid_enable();
  •     if (ret) {
  •         ESP_LOGE(GATTS_TABLE_TAG, "%s enable bluetooth failed: %sn", __func__, esp_err_to_name(ret));
  •         return;
  •     }

  •     esp_ble_gatts_register_callback(gatts_event_handler);
  •     esp_ble_gap_register_callback(gap_event_handler);
  •     esp_ble_gatts_app_register(ESP_SPP_APP_ID);

  •     spp_task_init();

  •     return;
  • }

回帖(1)

陈利妮

2024-6-17 17:47:37
以下是一些建议来解决这个问题:

1. 检查GPIO39的硬件连接:确保GPIO39的硬件连接没有问题,没有短路或错误的接线。

2. 检查外接上拉电阻的阻值:如果上拉电阻的阻值过小,可能会导致GPIO39的电平不稳定,从而触发中断。建议使用一个较大的上拉电阻值,例如10kΩ。

3. 检查中断触发条件:在初始化GPIO39中断时,确保设置正确的触发条件,例如GPIO_INTR_ANYEDGE(任何边缘触发)或GPIO_INTR_POSEDGE(正边缘触发)。

4. 软件滤波:在中断服务函数中,可以添加软件滤波逻辑,例如使用去抖动算法,以减少误触发。

5. 检查BLE模块对GPIO39的影响:由于您提到在注释掉BLE部分代码后,GPIO39中断触发是正常的,因此需要检查BLE模块是否对GPIO39产生了干扰。可以尝试调整BLE模块的工作频率或使用其他GPIO作为BLE模块的中断引脚。

6. 更新ESP-IDF版本:您当前使用的是ESP-IDF v4.0-beta1-134-gef17d8bba-dirty版本,可能会存在一些已知或未知的问题。建议尝试更新到最新的稳定版本,例如ESP-IDF v4.2或更高版本。


举报

更多回帖

×
20
完善资料,
赚取积分