06-STM32+ESP8266+AIR202远程升级篇-移植使用-移植STM32主动访问升级到自己的工程项目

<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通信方式下是非透传模式

会在每一帧数据前加有一些其它数据

(    \r\n+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\r\nHost: %s\r\n\r\n",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目录将会多出来两个文件

 

 

然后把这两个文件放到服务器即可

 

posted on 2020-07-15 00:54  广源时代  阅读(512)  评论(0编辑  收藏  举报

导航

支付宝 QQ群