ESP8266固件升级有两种办法:
1. 通过UART接口烧录
2. ESP8266通过 WIFI 获取固件自己给自己升级
本文讲的是第一种方法。
硬件平台:STM32F103VCT6(主机) + ESP-12S(安信可的一款ESP8266模组)
Stm32从SD卡中读取固件给ESP8266升级。
大体流程如下
一、 进入下载模式
首先 ESP8266 通过 UART 烧录程序跟 STM32 通过 UART 烧录程序的流程大致是一样的,首先就是进入下载模式
先介绍一下图中管脚的作用:
CH_PD(EN) : 使能管脚,高电平使能,低电平失能
RST: 复位管脚,高电平正常工作,低电平复位
ESP-12S 模组已经将 EN、RST、GPIO0接了上拉电阻,如上图所示 ESP8266 的GPIO0作用就相当于 STM32的 BOOT0,将GPIO0引脚电平拉低,然后复位一下,就进入了 UART 下载模式。
二、 烧录固件
ESP8266 UART下载协议:https://github.com/espressif/esptool/wiki/Serial-Protocol
发送的数据包是按照 SLIP packet framing 的格式来发送的。
这里的SLIP协议很简单,就是发送的数据帧,数据的第一个和最后一个字符必须是0xC0, 如果发送的数据中含有 0xC0,则将0xC0替换为 0xDB 0xDC两个字符发送,如果发送的数据中含有 0xDB, 则将 0xDB 替换为 0xDB 0xDD两个字符发送。
1.先要发送同步信号帧,下载协议中 SYNC 的命令代码是 0x08
由图 “发送数据的格式”可知,发送数据的第 0 字节总是 0x00,第1 字节是命令代码, 第 2-3 字节是数据长度,第 4-7 字节是校验和(只有在发送数据的命令中有效,发送命令时可以全写 0x00),第 8- n 就是要发送的数据。
同步信号帧的命令代码为 0x08,数据长度为 36 bytes所以同步信号帧的数据流应该是
0x00, 0x08, 0x24,0x00, 0x00,0x00,0x00,0x00, 0x07,0x07,0x12,0x20,0x55,0x55…(总共32个0x55)
当然,实际发送的数据还需要在 数据头和尾加上断帧符0xC0,所以完整的数据流是
0xC0, 0x00, 0x08, 0x24,0x00, 0x00,0x00,0x00,0x00, 0x07,0x07,0x12,0x20,0x55,0x55…, 0xC0
好了,到这一步我们就已经得到完整的一帧同步信号帧了,把这些数据直接通过 UART发送出去就好了,发送出去后如果得到了正确的应答才可以进行下一步。
由图 “应答数据的格式” 可知,应答数据的第0 字节总是 0x01,第 1 字节是响应的命令代码,第2-3字节是 数据长度,当命令为读寄存器命令 READ_REG时,第4-7字节是 寄存器的值,其他命令是 第4-7字节总是 0x00, 第8-9字节是应答的状态, 都为0x00时,表示命令执行成功。
所以同步信号帧的应答数据流应该是
0xC0, 0x01, 0x08, 0x24,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00, 0xC0
当收到此应答的时候证明 ESP8266同步成功,可以进行下一步操作了。
之后的所有数据流都是按照这个步骤得出的。
2. 往 MEM 中写入”stub loader” , stub_loader是什么? 我在网上并没有找到相应的解释
以下为我个人理解, 如果不妥之处,欢迎指正。
乐鑫官方会对esp系列芯片的bootloader进行更新,新增一些命令,然而老款的esp芯片无法识别新增的命令,所以 stub_loader 就应运而生。 stub_loader就相当于一个 二级 bootloader 每当esp有新增的命令时,stub_loader就会进行相应的更新。 使用最古老的命令,将 最新的stub_loader写入到esp芯片中,然后执行此loader。stub_loader就能够识别最新的命令, 以此来保证esp芯片能够执行最新的命令
接下来就是往MEM里面写stub loader了,0x05是开始写MEM命令, 0x07 是要写入MEM的数据, 0x06 是写入结束命令,具体的数据流参考文档,根据 第1步即可推出。 PS: 在网上也并没有找到 stub loader 的固件… 所以0x07 所写入的数据,是我通过乐鑫官方的烧录固件上位机发送的数据里面复制出来的。
3. 直到这一步才进入正题,接下来我们就要烧录固件啦
跟第 2 步的烧录stub loader 的步骤差不多,只不过命令代码变了而已,0x02是开始写Flash命令, 0x04 是要写入Flash的数据(也就是固件), 0x03 是写入结束命令
写入完成后还要进行一下 MD5 校验
校验应答正常后,说明写入成功啦!
结束语:
1. 百度网盘:https://pan.baidu.com/s/14TKiDHFpSYMn5tVZIP7JTQ 提取码:53k4 , 这是主机为 STM32F103VCT6 的示例工程,通过 USART2 给 ESP8266 烧录,参考着整个工程也许会比较好理解一点
2. 乐鑫官方 UART 烧录上位机: https://www.espressif.com/sites/default/files/tools/flash_download_tools_v3.6.5.zip
最后:
吐下槽,乐鑫的资料有点乱,我从官网下载的 uart烧录协议.pdf 极其的不完整,我用串口助手 抓取上位机给 ESP8266 烧录时发送的数据以及应答数据,有好多命令代码在.pdf中都找不到,通过邮箱联系乐鑫的技术支持,丢给了我一个链接,https://github.com/espressif/esptool/wiki/Serial-Protocol 咯,就是这个,在这上面才算是隐隐约约知道咋回事儿。 我觉得这上面的内容也不完善, 因为我看过之后还是一脸懵币,最后是把抓取的数据和这个链接对照着看半天,才算是知道大概的流程T_T