【本文发布于https://blog.csdn.net/Stack_/article/details/130448713,未经允许不得转载,转载须注明出处】
因为正在DIY一个WiFi计量插座,采用非隔离的方案,烧录时要拔掉220V插头,测试时要拔掉USB线,麻烦事小,万一两者同时插上烧坏电脑事大。
于是想着调试阶段用无线的方式更新程序,也方便以后偶尔的升级需求,不需要把外壳打开。顺便还把FOTA这个功能学了。
FOTA为了防止升级意外中断导致APP损坏,划分两个区域存放两份APP,轮流进行升级,由boot去记录应该升级哪个APP以及启动哪个APP,类似安卓的A B分区。这样做的代价是需要双倍的APP空间。
boot代码我们不需要关心,我们需要在APP代码中实现升级功能。流程是:正在运行A/B区程序 > 检测到服务器存在升级文件 > 拉取文件写入到另一个区 > 标记下次启动跳转到另一个区 > 软复位
本文基于ESP8266-12E、AiThinkerIDE_V1.5.2 以及 ESP8266_RTOS_SDK 3.4
参考文章(配合以下文章食用)
乐鑫esp8266学习rtos3.0笔记第6篇:esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件
ESP8266_RTOS_SDK 开发环境搭建 AiThinkerIDE_V1.5.2安装配置 编译 烧录
从GitHub拉取的SDK中有例程,路径是 ESP8266_RTOS_SDK\examples\system\ota
我选择的是native_ota\2+MB_flash\new_to_new_no_old,因为我不需要从SDK2.0更新到3.0。
关于new_to_new_with_old的解释看这里【FOTA from an Old SDK to the New ESP8266 RTOS SDK (IDF Style)】
可以将官方工程拷贝出来基于这个工程去写自己的代码,而我是将其代码移植到我工程里。
>>> 如果直接使用官方例程,则跳过以下小步骤,直达二 <<<
如果选择移植的方式,需要
1、将官方工程目录下的 Kconfig.projbuild 文件复制一份到我们工程目录下,将在menuconfig中新增配置项Example Configuration,这样编译时如下宏定义才不会报未定义。这不是必须的,以下划线宏定义可以直接写字符串。
2、复制官方工程目录下的 Makefile 的划线行复制到自己的工程Makefile中添加组件,将在menuconfig中新增配置项Example Connection Configuration,这样不会报连接WiFi的函数未定义。如果自己实现了WiFi连接,则这一步也不是必须的。
1、运行menuconfig配置,进入配置面板。
2、进入"Serial flasher config“ 将 “Flash size” 修改为4MB
3、依次进入 “Partition Table” —> “Partition Table (Single factort app, no OTA”,选项更改为"Factory app, two OTA definitions"
4、配置服务器以及连接的wifi。其中Example Configuration配置访问的服务器以及升级文件,Example Connection Configuration配置连接的WiFi。
5、移植ota代码
6、编译工程并通过有线的方式烧录到ESP8266。
1、下载nginx,解压
2、进入conf文件夹打开nginx.conf文件,将端口更改为8070(我上图中Http Server Port配置为8070,这两者保持一致),或者其它端口。
3、将编译完成的bin文件拷贝到html目录下,并更名为ota.bin(和上图Http Get Filename一致)
4、双击nginx.exe运行服务器,可能会出现黑窗口,也可能不会。浏览器输入http://192.168.31.240:8070/ota.bin,如果能下载bin文件,即服务器这方面已成功。最好用同一网络下的另一电脑访问,因为本机能访问不代表该网络下其它设备能访问。若无法访问,需修改防火墙设置,允许nginx通过防火墙。
1、可以在代码中增加版本信息,通过有线的方式刷入V1.1,此时html目录下已删除ota.bin,会报ota失败
2、编译一版V1.2放到html目录,复位esp8266。打印Have written字样即表示正在升级
3、写入完成后将自动重启,可见版本已更新为V1.2
4、此时需要删除ota.bin文件,否则esp8266会不断升级重启。至于如何防止重复升级还需继续学习
因为我的UART0用作与HLW8110通讯,而ESP_LOGE等打印函数默认使用UART0。所以需要修改LOG输出的串口为UART1。按以下步骤重定向:
运行menuconfig配置,进入到下图位置,
回车进入,选择custom后返回,即出现下图的划线选项,可更改为UART1
另外,如果按下图选择Info,则Info以下的Debug和Verbose即ESP_LOGD、ESP_LOGV将不输出,同理选择Warning,则Info即ESP_LOGI也不输出