本帖最后由 海底沙 于 2017-7-20 22:05 编辑 hydyguo 发表于 2017-7-19 14:58 不好意思,在外面出差,手上没板子。 你发给我,我星期六回去帮你测试一下,我的QQ1758054922 |
本帖最后由 海底沙 于 2017-7-18 11:36 编辑 hydyguo 发表于 2017-7-18 10:48 不知你的代码是否很大,我昨晚把add改到第三个1k的最后,直接把地址写成 0x27D ,测试也通过。 不要“在0X7D,0XFDl加上参数,就是0X7D*4*4096”,直接写地址 0x27D 。 另外,你在 ¤tDataPoint 前面加上 (uint32 *) 没有? |
如果你那边能读写,采用你的方法和我前面试的一样,不知怎么回事,只要是自定义结构体,一执行读数据程序就被破坏,必须重新烧写, 刚才我做了几个试验,在0X7D,0XFDl加上参数,就是0X7D*4*4096,读数据没有反应,执行写数据时串口一直显示如下图。如果用0X7C,0XFC加这个参数,程序直接破坏、死file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\539384885\QQ\WinTemp\RichOle\2_8{4]9_OZSKQ(_L@L`J5SL.png机。上一种方法还能复位正常,这个问题真是可笑。就怎么两行代码真是别死人,三大运营商没有一家给个说法。 ![]() ![]() ![]() |
hydyguo 发表于 2017-7-17 16:50 因为我也要保存当前状态,所以今晚又测试了一下,既然可以了,真是莫明其妙,不知问题出在哪?请高手解答一下。 下面代码给你参考一下: gizwits_product.c /** 用户区当前设备状态结构体*/ extern dataPoint_t currentDataPoint; [url=]/**@name[/url] Gizwits 用户API接口 * @{ */ /** * @brief 事件处理接口 * 说明: * 1.用户可以对WiFi模组状态的变化进行自定义的处理 * 2.用户可以在该函数内添加数据点事件处理逻辑,如调用相关硬件外设的操作接口 * @param[in] info : 事件队列 * @param[in] data : 协议数据 * @param[in] len : 协议数据长度 * @return NULL * @ref gizwits_protocol.h */ int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len) { uint8_t i = 0; dataPoint_t *dataPointPtr = (dataPoint_t *)data; moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)data; if((NULL == info) || (NULL == data)) { return -1; } for(i=0; i<info->num; i++) { switch(info->event) { case EVENT_SOCKET_ONOFF_A: currentDataPoint.valuesocket_OnOff_a = dataPointPtr->valuesocket_OnOff_a; os_printf("Evt: EVENT_SOCKET_ONOFF_A %d \n", currentDataPoint.valuesocket_OnOff_a); if(0x01 == currentDataPoint.valuesocket_OnOff_a) { //user handle } break; case EVENT_TIMING_START: currentDataPoint.valuetiming_start = dataPointPtr->valuetiming_start; os_printf("Evt: EVENT_TIMING_START %d \n", currentDataPoint.valuetiming_start); if(0x01 == currentDataPoint.valuetiming_start) { //user handle } break; case EVENT_TIMED_TASK: currentDataPoint.valuetimed_task = dataPointPtr->valuetimed_task; os_printf("Evt: EVENT_TIMED_TASK %d\n", currentDataPoint.valuetimed_task); switch(currentDataPoint.valuetimed_task) { case TIMED_TASK_VALUE0: //user handle break; case EVENT_TIMING_HOUR: currentDataPoint.valuetiming_hour = dataPointPtr->valuetiming_hour; os_printf("Evt:EVENT_TIMING_HOUR %d\n",currentDataPoint.valuetiming_hour); //user handle } break; case EVENT_TIMING_MINUTE: currentDataPoint.valuetiming_minute = dataPointPtr->valuetiming_minute; os_printf("Evt:EVENT_TIMING_MINUTE %d\n",currentDataPoint.valuetiming_minute); //user handle } break; case WIFI_SOFTAP: break; case WIFI_AIRLINK: break; case WIFI_STATION: break; case WIFI_CON_ROUTER: break; case WIFI_DISCON_ROUTER: break; case WIFI_CON_M2M: break; case WIFI_DISCON_M2M: break; case WIFI_RSSI: os_printf("RSSI %d\n", wifiData->rssi); break; case TRANSPARENT_DATA: os_printf("TRANSPARENT_DATA \n"); //user handle , Fetch data from [data] , size is [len] break; default: break; } } system_os_post(USER_TASK_PRIO_0, SIG_UPGRADE_DATA, 0); system_param_save_with_protect(0x7D, (uint32 *)¤tDataPoint, sizeof(currentDataPoint)); os_printf("### save timing ### \n"); return 0; } 读函数:(临时位置) user_main.c /** 用户区当前设备状态结构体*/ dataPoint_t currentDataPoint; dataPoint_t currentDataPoint_my; //新定义一个结构体保存从flash读出的数据 void ICACHE_FLASH_ATTR userTimerFunc(void) { system_param_load(0x7D, 0, (uint32 *)¤tDataPoint_my,sizeof(currentDataPoint_my)); os_printf("### timing : %d \n",currentDataPoint_my.valuetiming_minute); system_os_post(USER_TASK_PRIO_0, SIG_UPGRADE_DATA, 0); } |
本帖最后由 海底沙 于 2017-7-17 16:17 编辑 hydyguo 发表于 2017-7-17 12:25 我的测试只是随便找的2个地方放读写函数,实际不是这样做的。 我也是放在这个函数里 int8_t ICACHE_FLASH_ATTR gizwitsEventProcess 数据一改变写flash就出现重启 你测试一下:把 int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(、、、)改为 int8_t gizwitsEventProcess(、、、)试一下。 |
请问,版主,我这个结构体数据读写代码格式到底有没有错,为什么就没有结果反应。 /** 用户区设备状态结构体*/ typedef_t struct { bool valueLED_OnOff_0; bool valueLED_OnOff_1; ...... uint32_t valuePower_Consumption; uint32_t valuePower_Consumption1; } dataPoint_t; /** 用户区当前设备状态结构体*/ extern dataPoint_t currentDataPoint; ESP8266读写地址测试结果 #define ESP_PARAM_START_SEC 0x3D //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。 #define ESP_PARAM_START_SEC 0x7D #define ESP_PARAM_START_SEC 0xFD //设0X7D,0XFD这两个地址,读写操作没有任何结果出现。 #define ESP_PARAM_START_SEC 0x3C //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。 #define ESP_PARAM_START_SEC 0x7C #define ESP_PARAM_START_SEC 0xFC //设0X7C,0XFC这两个地址,读写操作没有任何结果出现。 写设备状态结构体数据 system_param_save_with_protect(ESP_PARAM_START_SEC, ¤tDataPoint, sizeof(currentDataPoint)); 读设备状态结构体数据 system_param_load(ESP_PARAM_START_SEC, 0, ¤tDataPoint, sizeof(currentDataPoint)); |
在定时器函数中不要处理耗时较长的任务,如果要处理的话,发消息出来,在应用层中处理。 flash是慢速器件,最好不要在定时器中进行读写 |
你好!这两天在画PCB板,没有看消息,我的问题还没解决,前几天问了机智云工程师,第一回复怀疑程序烧写地址不对,我将烧写地址载图给他看,说没错,要我把编译器里的Makefile里面的SPI_SIZE_MAP?=4改为6,还是没有结果,我又将出错时的串口打印数据载图给他看,至今没有回应。前天又给安信可工程师联系,今天给我回复意思还是地址问题,给我sdk文档查看,还是不知错在那。一个星期前我给乐鑫技术支持联系至今没有任何回复,看样这是死症了。 另外我看你测试的方法,把数据写入代码放到这个void ICACHE_FLASH_ATTR userTimerFunc(void)函数里可能不对,这样会造成不停在写入。 我是放在这个函数里int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(、、、)只有数据发生变化时才执行写入。读数据我是放在main里面void ICACHE_FLASH_ATTR user_init(void)初始化时读取数据。如有好结果请分享我,谢谢你! |
hydyguo 发表于 2017-7-12 09:21 我也是个新手,没用过这,你试一下改成这样行不行: system_param_save_with_protect(ESP_PARAM_START_SEC,(uint32 *)esp_flash, sizeof(esp_flash)); |
hydyguo 发表于 2017-7-11 09:10 设0X7D,0XFD这两个地址应该没错,但读写数据到flash必须是4字节对齐,好象你的数据不是4字节的倍数,可能你写入就失败了,所以就读不到数据了。 |
海底沙,你好,sntp已解决,不但解决您说的地方,还要解决“->"这个符号问题。谢谢! 再请您帮我分析一下flash读写问题。 请问,如何正确设置SoC ESP8266 12F FLASH读写操作, 就是下面这个是机智云自动生成数据结构体,我要求实现(断电记忆)保护,我用下面的读写方法不成功,只要执行数据写入、 程序就被破坏,必须重新烧写ESP8266程序,有几朋友都说是地址有误,可是所有地址都试了,不是破坏程序,就是没有任何结 果反应,请帮忙解决。 /** 用户区设备状态结构体*/ typedef_t struct { bool valueLED_OnOff_0; bool valueLED_OnOff_1; bool valueLED_OnOff_2; bool valueLED_OnOff_3; bool valueTime_OnOff; bool valueCountDown_OnOff; uint32_t valueLED_Color; uint32_t valueLED_R; uint32_t valueLED_G; uint32_t valueLED_B; int32_t valueMotor_reversal; uint32_t valueWeek_Repeat; uint32_t valueMotor_is; uint32_t valueTime_On_Minute; uint32_t valueTime_Off_Minute; uint32_t valueCountDown_Minute; bool valueInfrared; int32_t valueTemperature; uint32_t valueHumidity; uint32_t valuePower_Consumption; uint32_t valuePower_Consumption1; bool valueAlert_1; bool valueAlert_2; bool valueFault_LED; bool valueFault_Motor; bool valueFault_TemHum; bool valueFault_IR; } dataPoint_t; /** 用户区当前设备状态结构体*/ extern dataPoint_t currentDataPoint; ESP8266读写地址测试结果 #define ESP_PARAM_START_SEC 0x3D //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。 #define ESP_PARAM_START_SEC 0x7D #define ESP_PARAM_START_SEC 0xFD //设0X7D,0XFD这两个地址,读写操作没有任何结果出现。 #define ESP_PARAM_START_SEC 0x3C //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。 #define ESP_PARAM_START_SEC 0x7C #define ESP_PARAM_START_SEC 0xFC //设0X7D,0XFD这两个地址,读写操作没有任何结果出现。 写设备状态结构体数据 system_param_save_with_protect(ESP_PARAM_START_SEC, ¤tDataPoint, sizeof(currentDataPoint)); 读设备状态结构体数据 system_param_load(ESP_PARAM_START_SEC, 0, ¤tDataPoint, sizeof(currentDataPoint)); 下面这个是根据上面的结构体,重新自定义结构体,可是只要上电启动初始化执行读数据,程序就被破坏,必须重新烧写 ESP8266 12F。而使用上面的那个结构体只有写操作才破坏程序,这到底是怎么回事,请指教。 /** 用户区设备状态结构体*/ typedef_t struct { bool valueTime_OnOff; bool valueCountDown_OnOff; uint32_t valueLED_Color; uint32_t valueLED_R; uint32_t valueLED_G; uint32_t valueLED_B; uint32_t valueMotor_is; int32_t valueMotor_reversal; uint32_t valueWeek_Repeat; uint32_t valueTime_On_Minute; uint32_t valueTime_Off_Minute; uint32_t valueCountDown_Minute; } espdataPoint_t; /** 用户区当前设备状态结构体*/ extern espdataPoint_t esp_flash; ESP8266读写地址测试结果 #define ESP_PARAM_START_SEC 0x3D //设各个地址都一样,只要启动读操作,程序就被破坏,必须重新烧写ESP8266。 #define ESP_PARAM_START_SEC 0x7D #define ESP_PARAM_START_SEC 0xFD #define ESP_PARAM_START_SEC 0x3C #define ESP_PARAM_START_SEC 0x7C #define ESP_PARAM_START_SEC 0xFC 写设备状态结构体数据 system_param_save_with_protect(ESP_PARAM_START_SEC, &esp_flash, sizeof(esp_flash)); 读设备状态结构体数据 system_param_load(ESP_PARAM_START_SEC, 0, &cesp_flash, sizeof(esp_flash)); |
把 _tm *ptime; 改为 _tm ptime; 应该就行了 |
请您帮我修改一下这个时间打印格式,由于初学不懂格式定义方法,请帮忙! void Timing_control(void) { _tm *ptime; //这个如何正确定义这个时间打印 gagentGetNTP(&ptime); os_printf("WIFI_NTP : [%02d:%02d] \n",ptime->hour,ptime->minute); } |
多谢,我试一下,有不懂的再来向你们请教。 |
可以使用gagentGetNTP()函数,选择自己需要的即可。
|
版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )