2-HC32F460(华大)+BC260Y(NB-IOT)远程升级篇(自建物联网平台)-整体运行测试-HC32F460通过BC260Y(NB-IOT)使用http远程下载升级单片机程序(单片机程序轮训检查更新)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTA/BC260Y/myota.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
这节测试一下HC32F460通过BC260Y(NB-IOT)使用http或https远程下载升级单片机程序
我已经把固件文件放在了自己的服务器上
默认使用本人提供的下载路径测试
文件路径: 网站根目录->ota->hardware->HC32F460BC260YBK
user_crc.bin: 是固件程序文件.
该固件程序文件并不是直接可以运行的文件
里面的数据每隔128字节后面增加2位CRC校验位
单片机下载以后每隔130字节校验一下数据,然后把前128字节写入Flash.
加入CRC校验让升级变的稳定可靠.
info.txt文件内容:
version:0.0.1 云端固件程序版本
url:http://mnif.cn/ota/hardware/CH579BC260YBK/user_crc.bin 固件程序下载地址
"info":"1.解决了部分BUG 2.优化了部分程序" 使用APP控制升级时,APP的提示信息.
升级过程:
注:使用TCP连接Web服务器,然后发送相应的GET指令获取文件!
用户程序里面每隔一定时间控制网络模块使用http的GET指令获取云端info.txt文件
然后从文件里面获取服务器里面的固件程序版本和固件程序下载地址等信息
如果与自身版本号对比不一致,就把固件程序下载地址写入flash,然后设置更新标志,重启,
重启执行BootLoader以后,BootLoader程序检测到更新标志,则提取固件下载的地址,
然后使用http下载程序文件,把程序文件写入flash,完成升级.
备份升级流程图
NB-IOT模块和底板安装说明
安装到第三排排母!模块的第一个VCC引脚和底板的5V引脚相连接
2.打开串口调试助手打印串口日志
V1.2版本
V1.4及其以上版本
3.使用下载器下载BootLoader程序
8.下载用户程序到开发板
9.观察日志,说明执行流程
开始运行用户程序,默认提供的用户程序设置的程序版本是0.0.0
用户程序控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt
检测到版本不一致以后,把获取的url存储到flash,设置更新标志,重启.
重启之后BootLoader提取url
BootLoader发送get指令获取程序固件
升级完成以后,运行新下载的程序.
用户程序每隔一段时间控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt
现在程序版本和上面的是一致的,所以不需要更新
应用到自己的服务器
1,首先确定好程序文件在服务器的路径
关于本人服务器文件夹解释:(自己随意就好,最后的文件夹命名建议使用产品的型号)
html:网站根目录
ota: ota升级
hardware : 硬件程序
HC32F460BC260YBK: 作为产品的型号(根据自己的产品型号修改)
我把固件放到了里面那么固件程序下载地址为:
http://服务器IP地址/ota/hardware/HC32F460BC260YBK/user_crc.bin
那么固件信息的下载地址为:
http://服务器IP地址/ota/hardware/HC32F460BC260YBK/info.txt
2.修改 用户程序 的 IAP.C 文件
提示:我把它们存储在程序bin文件的1024字节倍数的位置是为了BootLoader下载的时候便于提取这些数据;
1.产品型号(我设置的为HC32F460BC260YBK)
2.修改固件程序版本(可随意指定,我设置的为0.0.2)
3.修改记录云端固件信息文件下载地址(我的为:http://mnif.cn/ota/hardware/HC32F460BC260YBK/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文件
user_crc.bin文件是在user.bin的基础上增加了CRC校验位
还有就是改写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 文件
单片机的型号是HC32F460JETA, 共有512KB的flash, 然后总共分了64个扇区.一个扇区占8KB
每次擦除是以扇区进行擦除,所以分配的时候我是以使用多少个扇区进行分配的.
因为最后一个扇区某些位置系统存储了固定数据,是无法使用的,所以下面实际写的是64-1 (63个扇区)
2.关于扇区调整
①假设用户后面编写了BootLoader程序, 使得BootLoader程序量变化了,用户需要编译一下BootLoader程序
然后在bin文件夹里面可以看到程序大小
②一个扇区是8KB,那么需要4个扇区就可以了, 假设我设置为5个扇区
BootLoader里面的设置为5个扇区
用户程序里面要和BootLoader里面设置的一样
③然后编译下载BootLoader程序到板子
④然后编译下载BootLoader程序到板子
④根据打印的日志,调整下用户程序里面的配置
3,警告! 危险! 危险! 危险!
Flash的分配在产品上线之前就是配置好的!后期不能再调整了.
所以大家伙一定要给BootLoader和用户程序留够足够的空间!
4,关于记录更新信息和用户信息的flash分配
存储更新相关数据和存储用户数据都给了1个扇区(8KB)
存储用户数据其实是我预先留给用户的,程序上并没有使用那块空间.如果用户需要存储数据
存储数据的起始地址就是 FLASH_USERDATE_ADDR, 如果用户不需要存储,那么可以设置为 0
当然现在显得有些浪费!!!!因为内部的存储更新相关数据总共才使用了1KB. 但是为了程序便于移植,就这样吧.
关于升级底层包
1.这次使用的远程升级底层是最新优化的一版
此底层包是在前面各种单片机远程升级的基础上提炼优化的一版,
使得更便于移植应用到各个单片机+各种网络模块上.
2. iap文件是控制着升级流程的文件(BootLoader和用户程序里面都有这个文件)
①大家伙可以在里面设置基本的固件版本,升级地址
②可以在BootLoader的iap.h里面设置升级过程中需要如何去下载,设置多大的缓存区
3. iap_interface是接口文件
用户在移植的时候需要根据自己的单片机实现内部的接口,只要完成里面的接口就完成了升级程序
用户程序说明
1.解析下info.txt下载路径(服务器上记录固件信息的文件)
做这个程序是为省去用户解析的繁琐.
执行解析之后:
IAPStructValue.IP = mnif.cn;
IAPStructValue.Port = 80;
IAPStructValue.Path = /ota/hardware/HC32F460BC260YBK/info.txt
4.处理更新(这个程序需要在认为用户程序没有问题的时候在用户程序里面执行一下)
解释:
BootLoader更新程序的时候会设置一些更新状态;用户程序需要调用一下这个函数清除更新状态.
如果用户程序不清除更新状态,那么一旦程序重启以后BootLoader检查到更新状态以后会自行回滚程序.
5.控制模组获取服务器上记录固件信息的文件
6.解析info.txt文件内容
如果版本号不一样,提取和存储url然后设置升级标志,重启.
7,补充:如果编译用户程序出现下面的警告
其实是这个地方导致的
为了便于BootLoader程序提取用户程序bin文件里面的型号,把型号存储在了偏移1024字节的位置.
设置的这个字符串存储的位置影响到了芯片本身默认分配一些数组的位置.就会报上面的警告.
貌似不影响什么...
BootLoader程序详细说明
1.查看IAPInit函数
2.获取存储的固件下载的url,并解析下url
3.如果有更新标志,则备份下用户程序
4.如果没有更新标志,则查看下更新状态
如果状态是更新有错误,则执行回滚,如果检测到没有备份的程序,就重新执行升级
5.如果更新状态是0x01,就设置更新状态为0xFE
7.控制模组连接TCP服务器(Web服务器)
8.发送get指令获取程序文件
8.在TCP接收数据函数里面把固件数据写入缓存
单片机是通过串口和模组通信,所以在串口中断里面接收
底层解析什么的都做好了,自动解析以后存储到缓存里面
提示: network_module_extract_data 函数是解析网络数据的
9.从缓存取数据,并写入flash
11,如果接收到相应的文件个数或者超过一段时间没有接收到数据
设置 IAPStructValue.ReadDataEndFlag = 1;认为接收完成
12,判断接收完成之后做各种判断
如果确实接收完了,则写入0x01状态,重启.
如果有错误,则尝试重新下载.
13,如果是程序文件下载完成以后重启,重启以后检查到更新状态是0x01会设置更新状态为0XFE
14,然后加载运行用户程序
15,超过一段时间没有接收到数据,是在这里做的判断
16,客户可以在IAP.h修改默认的超时时间
整体运行超时是BootLoader一运行就一直累加的的定时,超过时间就会控制程序重启
细节说明