<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
这节说明一下如何把STM32自动访问升级移植到自己的工程项目
提醒
经过大多数用户应用发现,基本上用户不会去移植BootLoader程序到自己的工程,
因为BootLoader是固定烧写到单片机内部的程序,用户都是关心如何把升级程序移植到当前的应用程序上.
好多用户只是在BootLoader的程序上做修改,比如增加液晶显示,显示更新状态等
这节不再讲解BootLoader如何移植,只讲解如何把升级程序移植到自己的应用程序里面
BootLoader只讲解一些细节,便于用户添加额外的功能
BootLoader程序说明
1.随意打开上两节的任意一个BootLoader程序
我打开的是这一节
2.首先用户需要注意的事项
在更新期间主循环不要加延时!!!!
以下标志位置一,说明开始执行了更新
IAPStructValue.LoopListPutStart ==1 已经发送了获取文件指令,开始向环形队列写入数据
3.如果用户使用的外部存储,可修改以下位置
本程序校验数据是先存后取后校验.
默认是每隔128字节校验程序文件里面的crc位(crc位是程序校验位不能写入flash)
crc为crc-modbus 改为在前,低位在后
4.接收数据完成
5.如果用户是使用的其它网络模块
需要根据自己的网络模块修改连接TCP服务器指令
连接的IP地址和端口号IAPStructValue.IP, IAPStructValue.Port
该信息是解析的用户程序存入的url
如果连接成功需要返回 1
6.发送http请求
上面是给TCP服务器发送信息,根据自己的模块替换
我使用的wifi模块默认配置了透传模式(http通信方式下)
由于我使用的wifi在https方式下不能使用透传模式,所有上面的发送才做了区分
7.接收程序文件
IAPHttpHead(Res); 是负责把http/https的数据头剔除掉(这个一般不需要修改)
IAPPutDataToLoopList(Res); 是把后面的真实数据写入缓存
如果用户的模块也是透传模式,则也不需要修改这个地方
如果不是透传模式,则需要修改一下
以当前程序为例
当前程序在 https通信方式下是非透传模式
会在每一帧数据前加有一些其它数据
( +IPD,此帧数据个数:真实数据 )
为了把真实数据提取出来,程序里面做了判断处理
8.根据自己的单片机容量修改flash分配
注意:必须和用户程序里面设置的一样!
注意:必须和用户程序里面设置的一样!
注意:必须和用户程序里面设置的一样!
再次提醒!请使用128KB及其以上的单片机,以防内存不够的问题
再次提醒!请使用128KB及其以上的单片机,以防内存不够的问题
再次提醒!请使用128KB及其以上的单片机,以防内存不够的问题
如果是使用的256K及其以上的单片机最好把以上都设置成4的倍数
如果是使用的256K及其以上的单片机最好把以上都设置成4的倍数
如果是使用的256K及其以上的单片机最好把以上都设置成4的倍数
因为256K及其以上flash都是每2048作为一页
都设置成4的倍数,无论怎么计算每一项存储都是从偶数地址开始,
9.修改默认访问程序文件的地址
下面是程序的下载地址,如果flash里面没有存储下载地址,则默认按照这个地址下载程序文件
其实BootLoader程序整体来看就是把程序写入环形队列,主循环从环形队列里面取出来数据写入flash
其它搭配的程序只是为了更加方便,稳定,可靠的实现升级
用户程序
1.用户程序需要有看门狗
① 需要用到的BootLoader文件夹
② 一个空工程
③ 看门狗程序,如果用户程序里面没有看门狗程序,把文件加到自己的工程
2.先看①
当前并未用到 BufferManage文件
其余的文件如果用户本身工程里面有,最好是用提供的覆盖掉
尤其是 stmflash文件,必须使用我提供的! 里面的程序解决了官方的flash本身操作bug!
3.接着看②
就是一个普通的工程
记得引入头文件
4.把BootLoader文件夹和看门狗文件添加到工程
把BootLoader文件放到这个位置
把看门狗文件放到下面的位置
添加头文件路径
添加看门狗
5.启动看门狗,喂狗
6.设置中断偏移
中断偏移要和初始化打印的保持一致
7.记得当前用户程序stmflash要和BootLoader里面的stmflash保持一致
8.修改info文件获取的地址
9.main函数初始化里面写上
10.当前的移植工作其实基本就做完了,后面的是根据自己的模块连接TCP服务器IAPStructValue.IP
然后获取info文件,然后解析
具体怎么连接根据自己的程序,也可以使用我前两节提供的连接程序
连接的IP地址: IAPStructValue.IP (这是执行IAPInfoPathInit()以后解析的)
连接的端口号: IAPStructValue.Port (这是执行IAPInfoPathInit()以后解析的)
连接成功以后
发送get指令获取info.txt文件
文件路径存储在这个变量里面 IAPStructValue.Path
具体拼接:
MainLen = sprintf((char*)MainBuffer,"GET %s HTTP/1.1 Host: %s ",IAPStructValue.Path,IAPStructValue.IP);
然后把这条信息发给TCP服务器(Web服务器)
11,然后需要解析 数据(以下只是说明如何解析)
{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32ESP8266BK/user_crc.bin","info":"1.解决了部分BUG
2.优化了部分程序"}
1.对比版本号
程序本身的版本号都是写在了程序里面
需要对比 FirmwareVersion 和 "version":"0.0.1" 里面的 0.0.1是不是一致的
2.把解析到的文件大小调用对应的API函数存储到flash
IAPSetFileSize(u32 data);
3.把解析到的文件路径调用对应的API函数存储到flash
IAPSetUpdateUrl(char* ch);
注意:请把url先存储到 IAPStructValue.Url 数组,一定要这样做!
因为url存储的时候是存储固定大小,当前是1000字节
存储完以后设置重启即可
12.制作用户程序bin文件 和 info.txt文件
1.生成bin文件
2.打开OTA Tools软件,选择生成的bin文件
① 固件版本和用户程序里面设置的固件版本保持一致
校验方式:CRC-MODBUS
升级方式:备份升级
校验间隔:128字节
默认填充:0xFF
按照上面的设置以后,把bin文件每隔128字节按照 CRC-MODBUS 计算得到的校验值插到计算数据的后面(高位在前,低位在后)
如果最后不满128字节,则填充0xFF补全
② 设置固件下载的地址(只填写前面路径即可,最后的具体文件名称自动添加)
③ 按照上面的步骤设置完以后,点击生成固件会生成一个info.txt文件
文件内容如上面所示
{"version":"0.0.1","size":13780,"url":"http://mnif.cn/ota/hardware/STM32ESP8266BK/user_crc.bin","info":"1.解决了部分BUG
2.优化了部分程序"}
3.bin目录将会多出来两个文件
然后把这两个文件放到服务器即可