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

32 篇文章 2 订阅

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

在这里插入图片描述

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

在这里插入图片描述



二、开启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"


在这里插入图片描述

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会不断升级重启。至于如何防止重复升级还需继续学习


在这里插入图片描述



十月更新



【工程已开源,具体可参考task_fota.c文件】




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


在这里插入图片描述


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

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


在这里插入图片描述


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


在这里插入图片描述


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


在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值