ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA


【本文发布于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安装配置 编译 烧录



一、获取官方FOTA例程代码


从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,这样编译时如下宏定义才不会报未定义。这不是必须的,以下划线宏定义可以直接写字符串。

ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第1张图片

2、复制官方工程目录下的 Makefile 的划线行复制到自己的工程Makefile中添加组件,将在menuconfig中新增配置项Example Connection Configuration,这样不会报连接WiFi的函数未定义。如果自己实现了WiFi连接,则这一步也不是必须的。

ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第2张图片



二、开启BOOT功能


1、运行menuconfig配置,进入配置面板。

2、进入"Serial flasher config“ 将 “Flash size” 修改为4MB

3、依次进入 “Partition Table” —> “Partition Table (Single factort app, no OTA”,选项更改为"Factory app, two OTA definitions"


ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第3张图片

4、配置服务器以及连接的wifi。其中Example Configuration配置访问的服务器以及升级文件,Example Connection Configuration配置连接的WiFi。

ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第4张图片
ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第5张图片


5、移植ota代码


6、编译工程并通过有线的方式烧录到ESP8266。



三、安装配置本地服务器


1、下载nginx,解压

ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第6张图片

2、进入conf文件夹打开nginx.conf文件,将端口更改为8070(我上图中Http Server Port配置为8070,这两者保持一致),或者其它端口。

ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第7张图片

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字样即表示正在升级


ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第8张图片

3、写入完成后将自动重启,可见版本已更新为V1.2

4、此时需要删除ota.bin文件,否则esp8266会不断升级重启。至于如何防止重复升级还需继续学习


ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第9张图片




附:ESP8266的LOG打印端口变更为UART1


在这里插入图片描述


因为我的UART0用作与HLW8110通讯,而ESP_LOGE等打印函数默认使用UART0。所以需要修改LOG输出的串口为UART1。按以下步骤重定向:

运行menuconfig配置,进入到下图位置,


ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第10张图片


回车进入,选择custom后返回,即出现下图的划线选项,可更改为UART1


ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第11张图片


另外,如果按下图选择Info,则Info以下的Debug和Verbose即ESP_LOGD、ESP_LOGV将不输出,同理选择Warning,则Info即ESP_LOGI也不输出


ESP8266 SDK开发阶段无线WIFI本地烧录升级程序 -- FOTA_第12张图片

你可能感兴趣的:(MCU,笔记,单片机,物联网)