<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/myota.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
<iframe frameborder="0" height="1500" name="ifd" scrolling="auto" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/myota.html" width="100%"></iframe>
这节测试下STM32F407+Air724UG实现利用http或https远程更新单片机程序
整个的升级流程和前面的文章一样,只不过单片机换成了STM32F407
1.打开这节的程序
2.连接引脚说明
使用串口1作为了日志打印,串口2连接模组.
(单片机)PA2 -- RX(模组)
(单片机)PA3 -- TX(模组)
(单片机)PA8 -- RST(模组复位引脚)
另外:
PA6作为了指示灯(用户设置程序回滚时,快闪)
PE4作为了按键(手动设置程序回滚)
指示灯和按键不是必须的!
可以按照自己的板子在各个头文件里面修改引脚定义
3.下载BootLoader到自己的开发板
4.接着再下载用户程序(选择只擦除程序使用的部分)
1.用记事本打开BootLoader程序的hex文件
2.用记事本打开用户程序的hex文件
3.删除用户程序的hex数据的第一行和最后一行
4.最终用户程序
5.复制修改后的用户程序的hex数据(全部复制)
6.把复制的数据粘贴到BootLoader文件的下面的位置
7.粘贴后的样子
8.然后把组合后的hex文件下载到单片机里面即可
1.烧录完BootLoader然后再烧录用户程序打印如下:
2.使用TCP连接服务器,发送GET命令获取服务器固件信息,如果有新版本,重启
3.BootLoader根据下载地址获取固件
4.更新完成
提示:
程序支持https下载,如果用户需要https,只需要把http写作https
1,首先确定好程序文件在服务器的路径
关于本人服务器文件夹解释:(自己随意就好,最后的文件夹命名建议使用产品的型号)
html:网站根目录
ota: ota升级
hardware : 硬件程序
STM32Air724BK: 作为产品的型号(根据自己的产品型号修改)
2.假设固件程序的名字为 user_crc.bin
把该固件文件放到上面的目录中
固件程序下载地址为:
http://服务器IP地址/ota/hardware/STM32Air724BK/user_crc.bin
3.假设记录固件程序信息文件的名字为 info.txt
把该文件放到上面的目录中
则文件下载地址为:
http://服务器IP地址/ota/hardware/STM32Air724BK/info.txt
4.修改 用户程序 的 IAP.C 文件
1.修改固件程序版本(可随意指定,我设置的为0.0.2)
2.修改产品型号(我设置的为STM32Air724BK)
3.修改记录云端固件信息文件下载地址(我的为:http://mnif.cn/ota/hardware/STM32Air724BK/info.txt)
5.修改BootLoader程序 的 IAP.c,设置下产品型号和默认的固件程序下载地址
6.编译用户程序
会在工程目录的bin文件夹生成 user.bin文件
7.打开OTA Tools上位机软件
提示:该软件是修改bin文件加入校验(使得升级稳定可靠)
8.按照红框选择配置
9.选择用户程序生成的 bin文件
10.点击 生成固件
11.将在user.bin目录生成user_crc.bin文件
user_crc.bin文件是在user.bin的基础上增加了CRC校验位
12.把生成的user_crc.bin文件拷贝到服务器
13.还差一个info.txt文件
我准备了一个模板
14.修改版本号(和用户程序里面设置的一样)
15.修改固件程序大小(OTA Tools_1.0.5提示信息里面有这个大小)
16.修改固件程序下载地址(和服务器上面的保持一致)
17.最后的提示信息不需要更改,当前用不到
18.把info.txt文件也拷贝到服务器
19.然后按照一开始的测试步骤测试即可
记得修改下用户程序里面的固件版本,然后重新下载到开发板,
让本地版本和服务器上面的版本不一样,一样的话会提示版本已是最新不需要升级.
1.远程升级其实就是使用模组以TCP方式连接Web服务器,
然后给TCP服务器发数据,数据格式是GET指令.
服务器接收到指令以后会下发文件给模组,模组通过串口把数据发给单片机,
单片机接收到数据以后写到flash,最后加载运行.
2.流程图
3.flash分配
4.用户可以根据自己的需求调整BootLoader ,用户程序, 备份用户程序的flash分配扇区
注意:BootLoader程序和用户程序要保持一致.
5.用户可以根据自己的需求调整存储其它数据使用的扇区
注意:BootLoader程序和用户程序要保持一致.
注:这个是我自己封装的一套falsh存储代码
关于这套代码的详细使用 https://www.cnblogs.com/yangfengwu/p/14476294.html
1.设置中断向量偏移
地址其实就是用户程序运行地址,0x08010000
2.软件设置程序运行位置和占用flash大小
64+128+128+128=448KB = 448*1024= 458752字节 = 0x70000
3.解析下info.txt(服务器上记录固件信息的文件)
做这个程序是为省去用户解析的繁琐.
执行解析之后:
IAPStructValue.IP = mnif.cn;
IAPStructValue.Port = 80;
IAPStructValue.Path = /ota/hardware/STM32F4xxESP8266BK/info.txt
4.处理更新(这个函数需要在认为用户程序没有问题的时候在用户程序里面执行一下.)
为什么要执行一下:
如果更新成功,BootLoader里面会把更新状态置为 0xFF;用户程序需要调用一下这个函数清零这个状态.
如果用户程序不清零这个状态,重启以后BootLoader检查到0xFF会认为执行用户程序失败了.然后执行回滚.
如果本身BootLoader下载程序过程中就检查到下载的程序文件有问题,BootLoader把更新状态设置为对应的错误
然后执行回滚.用户程序需要调用一下这个函数清零状态,如果用户程序不清零这个状态,
重启以后BootLoader检查状态是错误,就会再次执行回滚(擦除flash会缩短flash寿命).
5.控制模组获取服务器上记录固件信息的文件
6.解析info.txt文件内容
如果版本号不一样,提取和存储url和文件大小,然后设置升级标志,重启.
1.查看IAPInit函数
2.获取存储的固件文件大小,固件下载的url,并解析下url
3.如果有更新标志,则备份下用户程序
4.如果没有更新标志,则查看下更新状态,如果状态是更新有错误,则执行回滚
如果检测到没有备份的程序,就重新执行升级
5.如果更新状态是0x01,就设置更新状态为0xFF
6.控制模组连接TCP服务器(Web服务器),并配置为串口透传
7.发送get指令获取程序文件
8.把程序文件写入缓存
IAPHttpHead是为了去掉http 头
检测到http头过去,把真实的数据写入缓存.
9.主循环从缓存取数据,并写入flash
10.校验数据的时候是把先前写入的提取出来校验
11.如果缓存里面没有数据,如果接收到相应的文件个数或者超过一段时间没有接收到数据
会设置 IAPStructValue.ReadDataEndFlag = 1;则认为接收完成
然后做各种判断,
如果确实接收完了,则写入0x01状态,重启.
如果有错误,则尝试重新下载.
接收空闲是在这地方做的判断
空闲时间默认3S
12.重启以后如果检测到状态是0x01则写入0xFF,执行用户程序
如果检测状态是更新错误,则回滚程序,执行用户程序.
1.首先整体思路就是把程序文件写入缓存,然后主循环从缓存里面提取数据写入flash.
其它各种程序只是为了使升级更加稳定可靠而做.
2.BootLoader跳转到用户程序之前需要关闭使用的中断
3.恢复出厂设置
为了预防超级意外的情况导致程序完全崩溃,在上电之前按下一个按钮,然后给板子上电.
如果检测到用户按下时间超过5S,控制指示灯快闪,用户松开按钮以后
设置更新标志,清空flash里面记录的url地址,重启设备.
设备重启以后便会按照默认的地址下载程序
4.程序里面有下载超时和整体运行超时检测
下载超时:只有在确认开始写入程序文件的时候才运行,每次写入程序文件会清零.
主要解决接收一半程序便不再接收的问题
整体运行超时:该超时只要执行BootLoader程序便一直运行
客户可以在IAP.h修改默认的超时时间