大数跨境

大神教你ESP8266怎么在线升级

大神教你ESP8266怎么在线升级 芯片之家
2017-07-04
4
导读:Esp8266在线升级,其实安信可、机智云都有提供接口,可是你得用人家服务
说明:
   


Esp8266在线升级,其实安信可、机智云都有提供接口,可是你得用人家服务器。这里说说我是怎么用esp8266的sdk实现在线升级的。

简单来说,就是在服务器放上我的bin文件,然后esp8266访问,通过http下载。然后擦写esp8266的flash,写进自己新的bin文件。

这里每个函数都只给函数名。怎么用,大家还是要自己好好看下sdk的手册。


数据传输:
  

1、 搭建服务器:

我使用的是wmap。关于如何配置使用,网上很多,贴个链接:

http://wenku.baidu.com/link?url=KxbUiffPiMQGtbDbp4UWzDzdUentyPkXyTs7OvmNkCIbU97QG2TEUXSwiFBlAS0QLGs_IjVuTvetV-zaz_cdd5XHu09PpOoM9YqnmMO3Pd6IC6SLu3l2SC_YyOH3gmqI


2、 Esp8266搭建tcpclient:

赋值espconn结构体,这里使用http下载,所以服务器端口是80。


使用espconn_regist_recvcb()注册数据返回的回调函数,我们要的bin数据,到时候就是返回到这个函数里面的啦,注意好咯。


     使用espconn_connect()连接服务器。有的时候因为一些网络问题会连接不上,这样下面的数据传输也会出错,所以要注意。

向服务器发送GET请求,espconn_sent()。发送的数据:"GET /espBin/user1.bin HTTP/1.1\r\nAccept:*/*\r\nHost: 120.24.71.183:80\r\nConnection: Keep-Alive\r\n\r\n\0"。/espBin/user1.bin这个是服务器的文件。120.24.71.183:80这个是服务器地址。


3、 接收文件:

Void  espconn_recv_callback (void  *arg, char *pdata, unsigned short  len)

这个是上面用espconn_regist_recvcb()注册的回调函数。*arg是espconn的指针,可以判断数据的ip地址是否是服务器ip。*pdata是数据指针,len是每次接收到的数据长度。

返回的数据是http数据,会有http包头,而且接收到的文件是分包的,回调函数会执行多次。

这里有两个问题。我们在数据段里,怎么分辨bin文件数据在哪里开始?又怎么判断数据什么时候结束呢?

首先esp8266编译出来的bin文件,文件头是有特征的,只根据编译时的选项改变。这样就可以找到bin文件从哪里开始了。关于第二个问题,我选择的办法是,在文件结尾加4个字节作为标识(注意:这个标识不要也一起写到flash里面去哦!)。


注意:数据的传输方式不一定要跟我一样,喜欢通过串口传输数据都没问题的。这里的传输方式只是给大家一个参考。下面的才是重点。


数据写入:
   


1、 擦除flash扇区:

spi_flash_erase_sector()只擦除要写入的空间,别把全部都擦了。这个函数每次只擦一个扇区我使用了一个for循环擦除连续的多个扇区。

注意:一定要写擦除了才能开始写!

2、 写入flash:

spi_flash_write()这里很简单,就是写入数据,但是要注意,写入数据要4字节对齐。这里有个问题,网络传输过来的数据,不一定是4的倍数的,大家要注意怎么整理好数据。

3、 验证:

如果程序写入,能正常运行,那么真的恭喜各位。可是。。。现实是残酷的,基于各种原

因,写入的数据,会和我们想的不一样。那么我们怎么才能知道哪里出问题。

spi_flash_read()读出来。我是通过串口输出,可是经常输出着然后自动重启了。主要是我循环输出一直占着,只要system_soft_wdt_feed()喂下看门狗就行。串口输出速率可以调到1152000哦。3个零!

观察串口打印信息,esp8266上电时串口波特率是74880。


升级:

最后告诉系统,升级成功重启。

system_upgrade_flag_set(UPGRADE_FLAG_FINISH);

system_upgrade_reboot();


注意:

这里使用到升级功能,所以编译方式和一般的NON-FOTA的有所不同,存储位置,固件文件也有所不同。详细可以参考ESP8266云端升级指南。

每次升级要注意,现在运行的是user1.bin还是user2.bin这两个程序,在擦写flash时的位置是不一样的。而且,这两个文件编译出来也是有一点差别的。通过system_upgrade_userbin_check()可以确认正在运行的是哪一个user.bin。


【声明】内容源于网络
0
0
芯片之家
1234
内容 1436
粉丝 0
芯片之家 1234
总阅读252
粉丝0
内容1.4k