乐鑫技术交流
直播中

李军

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

NONOS1.5.3 SDK station模式下开启一个引脚电平变化中断,会导致wifi模块一直重启的原因?

station模式下开启一个引脚电平变化中断(这个中断用于接收433Mhz模块的信号 中断非常频繁),会导致wifi模块一直重启 但是设置成station+ap模式就不会重启了。
重启信息:
pm open,type:2 0
Fatal exception 0(IllegalInstructionCause):
epc1=0x40244a48, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

ets Jan  8 2013,rst cause:2, boot mode:(3,6)

eagle.s里面对应的40244a48
excw40244a48 :void ICACHE_FLASH_ATTR Pin_Interrupt(void *arg){unsigned int gpio_status;
异常应该就是发生在引脚电平变化中断。
要怎么去解决?

以下程序代码:

#include "gpio.h"
#include "driver/uart.h"
#include "user_main.h"


ETSTimer connect_timer;

void ICACHE_FLASH_ATTR Wifi_conned(void *arg)
{
        static uint8 count=0;//计数检测连接正常与否的次数
        uint8 status;

        os_timer_disarm(&connect_timer);
        count++;
        status=wifi_station_get_connect_status();//获取当前连接状态
        if(status==STATION_GOT_IP)//当前已经获取到路由器分配的IP 则表示成功连接路由器
        {
                count=0;//检测计数器清0
                os_printf("Router connect success!");
                ETS_GPIO_INTR_ENABLE() ;//开启GPIO电平变化中断
                return;
        }
        else
        {
                if(count>=7)//重复连接7次之后 提示连接失败 并且停止连接
                {
                        count=0;//检测连接状态计数器置0
                        wifi_station_disconnect();//关闭station模式的连接操作 否则每1s回去重连一次到时ap模式的连接不稳定
                        ETS_GPIO_INTR_ENABLE() ;//开启GPIO电平变化中断
                        return;
                }
        }
        os_timer_arm(&connect_timer,2000,NULL);//每2秒重新连接一次
}






void ICACHE_FLASH_ATTR scan_done(void *arg,STATUS status)
{
        struct station_config stationConf;
          if (status == OK)
          {
                        wifi_station_get_config(&stationConf);//获取station模式下的默认参数

                        os_memcpy(&stationConf.ssid, "ChinaNet-99base", 32);
                    os_memcpy(&stationConf.password, "xm99base", 64);
                    wifi_station_set_config_current(&stationConf);

                        wifi_station_connect();//开启station连接
                        os_timer_setfn(&connect_timer,Wifi_conned,NULL);//开一个2s的定时器 用于检测station连接路由器是否成功
                        os_timer_arm(&connect_timer,2000,NULL);
          }
}


void to_scan(void)
{
        wifi_station_scan(NULL,scan_done);
}



void ICACHE_FLASH_ATTR Pin_Interrupt(void *arg)
{
        unsigned int gpio_status;
        gpio_status=GPIO_REG_READ(GPIO_STATUS_ADDRESS); //锟斤拷取状态
        ETS_GPIO_INTR_DISABLE();                                        //锟截憋拷锟叫讹拷


        GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS,gpio_status);
        ETS_GPIO_INTR_ENABLE() ;
}


void user_init(void)
{
        uint8 opmode;
        uart_init(115200,115200);

        os_printf("rnwifidoor version:%sn", system_get_sdk_version());

        wifi_set_opmode(STATION_MODE);//设置wifi工作模式 -->AP模式
        system_init_done_cb(to_scan);//注册系统初始化完成的回调函数

        PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);//RF信号输入IO初始化
        GPIO_DIS_OUTPUT(GPIO_ID_PIN(4)); // 设置成输入
        gpio_pin_intr_state_set(GPIO_ID_PIN(4),GPIO_PIN_INTR_ANYEDGE);//设置中断类型:边沿中断
        ETS_GPIO_INTR_ATTACH(Pin_Interrupt,NULL);//定义中断函数
}


void user_rf_pre_init(void)
{
}
                  

回帖(1)

时见栖鸦

2024-7-12 17:26:18
在NONOS1.5.3 SDK的station模式下,开启一个引脚电平变化中断可能会导致WiFi模块一直重启的原因可能有以下几点:

1. 中断频率过高:由于433MHz模块的信号中断非常频繁,这可能导致CPU无法及时处理其他任务,从而影响WiFi模块的正常工作。

2. 中断优先级设置不当:如果中断优先级设置得过高,可能会导致其他中断被忽略,从而影响WiFi模块的正常工作。

3. 代码问题:在`Pin_Interrupt`函数中,可能存在一些错误或不恰当的操作,导致异常发生。例如,`ICACHE_FLASH_ATTR`可能没有正确地设置,导致程序在执行中断服务例程时出现问题。

4. 硬件问题:如果硬件存在问题,例如电源不稳定或引脚连接不良,可能会导致WiFi模块频繁重启。

为了解决这个问题,你可以尝试以下方法:

1. 降低中断频率:尝试降低433MHz模块的信号中断频率,以减轻CPU的负担。

2. 调整中断优先级:确保中断优先级设置得当,以便CPU可以平衡处理各种任务。

3. 检查代码:仔细检查`Pin_Interrupt`函数中的代码,确保没有错误或不恰当的操作。特别是`ICACHE_FLASH_ATTR`的使用,确保它正确地设置。

4. 检查硬件:检查硬件连接和电源稳定性,确保没有硬件问题。

5. 使用station+ap模式:如果问题仍然存在,可以尝试使用station+ap模式,这可能会减轻CPU的负担,从而减少WiFi模块重启的问题。

希望这些建议能帮助你解决问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助你。
举报

更多回帖

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