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

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

    (    +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目录将会多出来两个文件

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

  • 相关阅读:
    Codeforces Beta Round #92 (Div. 2 Only) B. Permutations 模拟
    POJ 3281 Dining 最大流 Dinic算法
    POJ 2441 Arrange the BUlls 状压DP
    URAL 1152 Faise Mirrors 状压DP 简单题
    URAL 1039 Anniversary Party 树形DP 水题
    URAL 1018 Binary Apple Tree 树形DP 好题 经典
    pytorch中的forward前向传播机制
    .data()与.detach()的区别
    Argparse模块
    pytorch代码调试工具
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/13303375.html
Copyright © 2020-2023  润新知