1-STM32+Air724UG远程升级篇OTA(自建物联网平台)-STM32通过Air724UG使用http或https下载程序文件(支持外部flash备份),升级程序(单片机程序轮训检查更新) 2022-09-29 18:56:24 浏览数 (1) 说明这节测试一下STM32通过Air724UG使用http或https远程下载升级单片机程序,为应对小容量单片机问题,升级底层包也支持把备份程序写到外部flash.打开BootLoader程序,说明下flash支持情况1,当前程序(V3.0.0)支持外接W25Q80/16/32/64/128,后续将根据用户需求增加更多的flash支持使用内部flash和外部flash分配情况如下:使用外部flash以后,备份用户程序区放到了外部flash, 使得用户程序有了更大的空间2,当前开发板未板载外部flash,测试外部flash需要用户自己外接flashMCU flash芯片PA4 -- CSPA5 -- CLKPA6 -- MISO (SO)PA7 -- MOSI (SI)3,flash选择 如果用户使用内部flash备份程序, 则把FLASH_EXTERN_BACKUP_ENABLE 设置为0 如果用户使用外部flash备份程序, 则把FLASH_EXTERN_BACKUP_ENABLE 设置为1测试我已经把固件文件放在了自己的服务器上默认使用本人提供的下载路径测试文件路径: 网站根目录->ota->hardware->STM32Air724BKuser_crc.bin: 是固件程序文件.该固件程序文件并不是直接可以运行的文件里面的数据每隔128字节后面增加2位CRC校验位单片机下载以后每隔130字节校验一下数据,然后把前128字节写入Flash.加入CRC校验让升级变的稳定可靠.info.txt文件内容:version:0.0.1 云端固件程序版本 url:http://mnif.cn/ota/hardware/STM32Air724BK/user_crc.bin 固件程序下载地址"info":"1.解决了部分BUG 2.优化了部分程序" 使用APP控制升级时,APP的提示信息.升级过程:用户程序里面每隔一定时间控制网络模块使用http的GET指令获取云端info.txt文件然后从文件里面获取服务器里面的固件程序版本和固件程序下载地址等信息如果与自身版本号对比不一致,就把固件程序下载地址写入flash,然后设置更新标志,重启,重启执行BootLoader以后,BootLoader程序检测到更新标志,则提取固件下载的地址,然后使用http下载程序文件,把程序文件写入flash,完成升级.备份升级流程图提示单片机都是使用串口2和模组进行通信, 开发板只安装上GSM模组.安装到第三排排母!模块的第一个VCC引脚和底板的5V引脚相连接 测试1.使用下载器下载BootLoader程序使用单片机串口1打印串口日志(115200)2.打开用户程序,并下载用户程序3.观察日志,说明执行流程开始运行用户程序,默认提供的用户程序设置的程序版本是0.0.0用户程序控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt检测到版本不一致以后,把获取的url存储到flash,设置更新标志,重启.重启之后BootLoader提取urlBootLoader发送get指令获取程序固件升级完成以后,运行新下载的程序.用户程序每隔一段时间控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt现在程序版本和上面的是一致的,所以不需要更新应用到自己的服务器(如果使用SSL, 则把下载路径的http改为https即可)1,首先确定好程序文件在服务器的路径关于本人服务器文件夹解释:(自己随意就好,最后的文件夹命名建议使用产品的型号)html:网站根目录ota: ota升级hardware : 硬件程序STM32Air724BK: 作为产品的型号(根据自己的产品型号修改)我把固件放到了里面那么固件程序下载地址为:http://服务器IP地址/ota/hardware/STM32Air724BK/user_crc.bin那么固件信息的下载地址为:http://服务器IP地址/ota/hardware/STM32Air724BK/info.txt2.修改 用户程序(mcu_project) 的IAP.C文件提示:我把它们存储在程序bin文件的1024字节倍数的位置是为了BootLoader下载的时候便于提取这些数据;1.产品型号(我设置的为STM32Air724BK)2.修改固件程序版本(可随意指定,我设置的为0.0.2)3.修改记录云端固件信息文件下载地址(我的为:http://mnif.cn/ota/hardware/STM32Air724BK/info.txt)5.修改BootLoader程序 的 IAP.c (设置下产品型号和默认的固件程序下载地址)注意:BootLoader里面的产品型号要和用户里面的一样!!!!BootLoader程序下载的时候会判断这个型号一不一致6.编译用户程序(mcu_project)会在工程目录的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 或者 用户程序(mcu_project)里面的iap_interface.h 文件--------------------------------------------------------内部flash--------------------------------------------------------如果是使用内部flash备份程序,flash的开头存储的BootLoader程序, 结尾存储更新相关数据, 预留一些空间让用户存储其它数据最后剩下的平半分, 一部分存储用户程序, 另一部分用来备份用户程序--------------------------------------------------------外部flash--------------------------------------------------------如果是使用外部flash备份程序, flash的最一开始存储的BootLoader程序, 然后是存储用户程序, 然后是存储更新相关数据, 最后预留一些空间让用户存储其它数据2,用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.--------------------------------------------------------内部flash--------------------------------------------------------调整完成以后,下载BootLoader程序, 串口会打印flash具体分配--------------------------------------------------------外部flash--------------------------------------------------------调整完成以后,下载BootLoader程序, 串口会打印flash具体分配3,无论是否使用外部flash,用户在项目中如果需要使用内部flash存储数据, 可以根据自己存储的数据量调整数据存储的起始地址是: FLASH_USERDATE_ADDR4,如果使用外部flash备份数据, 如果用户也需要使用外部flash存储数据,为了不影响备份区,我给用户提供了数据存储的起始地址: FLASH_EXTERN_USERDATE_ADDR5.调整完flash以后,用户需要根据BootLoader打印的信息, 来设置用户程序(mcu_project)运行地址和占用空间这个要根据自己打印的设置关于升级底层包1.升级底层包分为iap, flash_extern, iap_interface文件1,flash_extern文件是配置和外部flash通信的文件2. iap文件主要是控制着升级流程的文件可以在BootLoader程序里面设置升级过程中需要如何去下载,设置多大的缓存区3. iap_interface是接口文件根据移植的单片机实现内部的接口,只要完成里面的接口就完成了升级程序框架用户程序说明1.解析下info.txt下载路径(服务器上记录固件信息的文件)做这个程序是为省去用户解析的繁琐.执行解析之后:IAPStructValue.SSLEN = 0;IAPStructValue.IP = mnif.cn;IAPStructValue.Port = 80;IAPStructValue.Path = /ota/hardware/STM32ESP8266BK/info.txt如果路径写的是httpsIAPStructValue.SSLEN = 1;IAPStructValue.Port = 443;如果指定了端口号 http://mnif.cn:8080/xxxxxxIAPStructValue.Port = 8080;4.处理更新(这个程序需要在认为用户程序没有问题的时候在用户程序里面执行一下)解释:BootLoader更新程序的时候会设置一些更新状态;用户程序需要调用一下这个函数清除更新状态.如果用户程序不清除更新状态,那么一旦程序重启以后BootLoader检查到更新状态以后会自行回滚程序.5.控制模组发送get指令获取服务器上记录固件信息的文件6.解析info.txt文件内容如果版本号不一样,提取和存储url然后设置升级标志,重启.7,补充:如果编译用户程序出现下面的警告其实是这个地方导致的为了便于BootLoader程序提取用户程序bin文件里面的型号,把型号存储在了偏移1024字节的位置.设置的这个字符串存储的位置影响到了芯片本身默认分配一些数组的位置.就会报上面的警告.貌似不影响什么...BootLoader程序详细说明1.查看IAPInit函数2.获取存储的固件下载的url,并解析下url3.如果有更新标志,则备份下用户程序4.如果没有更新标志,则查看下更新状态如果状态是更新有错误,则执行回滚,如果检测到没有备份的程序,就重新执行升级5.如果更新状态是0x01,就设置更新状态为0xFE7.控制模组连接TCP服务器(Web服务器), 8.发送get指令获取程序文件8.在TCP接收数据函数里面把固件数据写入缓存单片机是通过串口和模组通信,所以在串口中断里面接收9.从缓存取数据,并写入flash11,如果接收到相应的文件个数设置 IAPStructValue.ReadDataEndFlag = 1;认为接收完成12,判断接收完成之后做各种判断如果确实接收完了,则写入0x01状态,重启.如果有错误,则尝试重新下载.13,如果是程序文件下载完成以后重启,重启以后检查到更新状态是0x01会设置更新状态为0XFE 14,然后加载运行用户程序15,超过一段时间没有接收到数据了也设置为接收完了数据16,客户可以在IAP.h修改默认的超时时间整体运行超时是BootLoader程序一运行就一直累加的的定时, 超过时间就会控制程序重启 flash 存储 单片机 http https 0 人点赞 上一篇:分享雷军22年前编写的代码