完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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个回答
|
|
在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模块重启的问题。 希望这些建议能帮助你解决问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助你。 |
|
|
|
只有小组成员才能发言,加入小组>>
528浏览 6评论
440浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
425浏览 5评论
423浏览 4评论
399浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-9 13:09 , Processed in 1.072126 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号