乐鑫技术交流
直播中

手托初梦

9年用户 831经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[问答]

ESP8266 RTOS-SDK GPIO中断导致复位怎么解决?

我想让我ESP8266 GPIO 中断正常工作,但到目前为止我还做不到。我将附加代码中感兴趣的部分。
我的目标是使用 OS-SDK 驱动程序在 GPIO0 上设置中断,并根据 GPIO0 按钮按下切换 GPIO4 值。现在,当我按下按钮,触发GPIO0引脚时,没有任何反应。

更新:现在中断被触发。问题是在 key_init_single() 中传递 GPIO_ID_PIN(0) 而不是 GPIO_Pin_0。但是现在,只要我按下 GPIO0 开关,模块就会有多个系统复位。我已经在 key.c 中禁用了内部上拉,因为我在 PCB 上放置了一个外部上拉。哪个可能是可能的原因?

#include "esp_common.h"
#include "esp8266/gpio_register.h"

#include "gpio.h"
#include "key.h"
#include "user_config.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

LOCAL 结构keys_param键;
LOCAL struct single_key_param *single_key[KEY_NUM];
LOCAL int 状态=0;
xTaskHandle switch_set_point;

LOCAL 无效
key_shortpress(){
   state^=1;
   //GPIO_OUTPUT_SET(GPIO_ID_PIN(4), state);
   printf("Short_press %dn",state);
   return;
}
LOCAL 无效
key_longpress(){
   printf("Long_pressn");
   return;
}
void switch_set (void *pvParameters){
   //output configuration----------------------------------------------------------------------
   GPIO_ConfigTypeDef gpio_out_cfg;                                       
       gpio_out_cfg.GPIO_Mode = GPIO_Mode_Output;
       gpio_out_cfg.GPIO_Pin  = GPIO_Pin_4;
       gpio_config(&gpio_out_cfg);                                       
   //input configuration----------------------------------------------------------------------
   //declaring the input key
   single_key[0]=key_init_single(GPIO_ID_PIN(0),PERIPHS_IO_MUX_GPIO0_U,FUNC_GPIO0,key_longPress,key_shortPress);
   keys.key_num = KEY_NUM;
   keys.single_key = single_key;
   key_init(&keys);
   printf("set_interrupt and closing taskn");
   vTaskDelete(switch_set_point);
}

无效ICACHE_FLASH_ATTR
user_init(无效)
{
    printf("SDK version:%sn", system_get_sdk_version());

    /* need to set opmode before you set config */
    wifi_set_opmode(STATION_MODE);

    xTaskCreate(switch_set, "switch_set", 256, NULL, (1), &switch_set_point);
}


回帖(1)

陈键

2024-7-11 16:10:37
从您的描述来看,您已经成功地触发了GPIO0中断,但问题在于每次按下按钮时,ESP8266模块都会发生多次系统复位。这可能是由于以下几个原因:

1. **中断处理函数中的无限循环**:如果中断处理函数中存在无限循环,这可能导致系统无法正常工作,从而触发复位。请检查您的中断处理函数,确保没有无限循环。

2. **中断优先级设置不当**:如果中断优先级设置得过高,可能会导致其他中断被阻塞,从而影响系统的正常工作。请检查您的中断优先级设置,确保它们是合适的。

3. **硬件问题**:可能是由于外部上拉电阻的问题,导致GPIO0引脚的电压不稳定。您可以尝试调整外部上拉电阻的值,或者检查PCB上的焊接和布局是否正确。

4. **软件问题**:可能是由于RTOS-SDK中的某些代码错误或配置问题导致的。您可以尝试更新RTOS-SDK到最新版本,或者查看官方文档和社区论坛,看看是否有其他人遇到类似问题并提供了解决方案。

5. **电源问题**:如果电源不稳定,可能会导致模块在按下按钮时发生复位。请检查您的电源供应是否稳定,以及电源电路是否正确连接。

为了解决这个问题,您可以尝试以下步骤:

1. **检查中断处理函数**:确保中断处理函数中没有无限循环,并正确处理GPIO0中断。

2. **调整中断优先级**:检查并调整中断优先级设置,确保它们是合适的。

3. **检查硬件**:检查外部上拉电阻的值,以及PCB上的焊接和布局是否正确。

4. **更新RTOS-SDK**:更新RTOS-SDK到最新版本,并查看官方文档和社区论坛,看看是否有其他人遇到类似问题并提供了解决方案。


举报

更多回帖

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