说明
这节测试一下STM32通过W5500 mbedtls使用https远程下载升级单片机程序
关于mbedtls的SSL的具体移植使用可以参考我写的下面两篇文章
https://cloud.tencent.com/developer/article/1700711 单片机移植mbedtls
https://cloud.tencent.com/developer/article/1730845 使用Mbedtls包中的SSL,和服务器进行网络加密通信
我已经把固件文件放在了自己的服务器上
默认使用本人提供的下载路径测试
文件路径: 网站根目录->ota->hardware->STM32W5500SSLBK
user_crc.bin: 是固件程序文件.
该固件程序文件并不是直接可以运行的文件
里面的数据每隔128字节后面增加2位CRC校验位
单片机下载以后每隔130字节校验一下数据,然后把前128字节写入Flash.
加入CRC校验让升级变的稳定可靠.
info.txt文件内容:
version:0.0.1 云端固件程序版本
url:https://mnif.cn/ota/hardware/STM32W5500SSLBK/user_crc.bin 固件程序下载地址
"info":"1.解决了部分BUG 2.优化了部分程序" 使用APP控制升级时,APP的提示信息.
升级过程:
用户程序里面每隔一定时间控制网络模块使用http的GET指令获取云端info.txt文件
然后从文件里面获取服务器里面的固件程序版本和固件程序下载地址等信息
如果与自身版本号对比不一致,就把固件程序下载地址写入flash,然后设置更新标志,重启,
重启执行BootLoader以后,BootLoader程序检测到更新标志,则提取固件下载的地址,
然后使用http下载程序文件,把程序文件写入flash,完成升级.
备份升级流程图
测试
1.使用网线连接路由器或者交换机
2.打开串口调试助手打印串口日志
3.使用下载器下载BootLoader程序
8.下载用户程序到开发板
9.观察日志,说明执行流程
开始运行用户程序,默认提供的用户程序设置的程序版本是0.0.0
用户程序控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt
检测到版本不一致以后,把获取的url存储到flash,设置更新标志,重启.
重启之后BootLoader提取url
BootLoader发送get指令获取程序固件
升级完成以后,运行新下载的程序.
用户程序每隔一段时间控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt
现在程序版本和上面的是一致的,所以不需要更新
应用到自己的服务器
1,首先确定好程序文件在服务器的路径
关于本人服务器文件夹解释:(自己随意就好,最后的文件夹命名建议使用产品的型号)
html:网站根目录
ota: ota升级
hardware : 硬件程序
STM32W5500SSLBK: 作为产品的型号(根据自己的产品型号修改)
我把固件放到了里面那么固件程序下载地址为:
http://服务器IP地址/ota/hardware/STM32W5500SSLBK/user_crc.bin
那么固件信息的下载地址为:
http://服务器IP地址/ota/hardware/STM32W5500SSLBK/info.txt
2.修改 用户程序 的IAP.C文件
提示:我把它们存储在程序bin文件的1024字节倍数的位置是为了BootLoader下载的时候便于提取这些数据;
1.产品型号(我设置的为STM32W5500SSLBK)
2.修改固件程序版本(可随意指定,我设置的为0.0.2)
3.修改记录云端固件信息文件下载地址(我的为:https://mnif.cn/ota/hardware/STM32W5500SSLBK/info.txt)
5.修改BootLoader程序 的 IAP.c (设置下产品型号和默认的固件程序下载地址)
注意:BootLoader里面的产品型号要和用户里面的一样!!!!
BootLoader程序下载的时候会判断这个型号一不一致
6.编译用户程序
会在工程目录的bin文件夹生成 user.bin文件
7.打开OTA Tools上位机软件
8.按照红框选择配置
9.选择用户程序生成的 bin文件
10.点击 生成固件
11.将在user.bin目录生成user_crc.bin文件
两个bin文件的区别:
1.user_crc.bin文件是在user.bin的基础上增加了CRC校验位
2.改写size,把真实的文件大小填写到bin文件
12.把生成的user_crc.bin文件拷贝到服务器
13.还差一个info.txt文件
我准备了一个模板
14.修改版本号(和用户程序里面设置的一样)
16.修改固件程序下载地址(和服务器上面的保持一致)
17.最后的提示信息不需要更改,当前用不到
18.把info.txt文件也拷贝到服务器,然后按照一开始的步骤测试即可
小总结
远程升级单片机程序其实就是使用模组以TCP方式连接Web服务器,
然后给TCP服务器发数据,数据格式是GET指令.
服务器接收到指令以后会下发文件给模组,模组通过串口把数据发给单片机,
单片机接收到数据以后写到flash,最后加载运行.
关于Flash分配调整
1.打开BootLoader 或者 用户程序里面的iap_interface.h 文件
flash的最一开始存储的BootLoader程序, 结尾存储更新相关数据, 预留一些空间让用户存储其它数据
最后剩下的平半分, 一部分存储用户程序, 另一部分用来备份用户程序
用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.
用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.
用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.
我设置了BootLoader占用160KB(用户可以根据自己的BootLoader程序的bin文件大小进行更改)
存储更新相关数据至少用1K, 这个用户不要改动.
如果用户在项目中也需要使用flash存储数据, 可以根据自己存储的数据量调整
数据存储的起始地址是: FLASH_USERDATE_ADDR
2.调整完成以后,下载BootLoader程序, 串口会打印flash具体分配
用户需要根据上面打印的设置下用户程序运行地址和占用空间
关于升级底层包
1.升级底层包分为iap文件 和 iap_interface文件
2. iap文件主要是控制着升级流程的文件
可以在BootLoader里面设置升级过程中需要如何去下载,设置多大的缓存区
3. iap_interface是接口文件
根据移植的单片机实现内部的接口,只要完成里面的接口就完成了升级程序框架
用户程序说明
1,为便于使用mbedtls的SSL功能,我封装了下
2.先说几个自己需要实现的函数,mbedtls底层会调用这些函数
随机数函数和返回时间戳函数(不验证证书时间的话用不到)
网络接收处理函数(mbedtls底层会自动调用这个函数)
SSL的底层获取数据的方式是指明需要多少个数据,然后咱再返回多少个数据.
所以我把数据接收以后存储到了环形队列, 然后SSL要多少我就给多少.