<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/myota.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
为了节省单片机ROM空间,做了这版精简内存版的程序.
使得最低可以支持32KB ROM空间的单片机.
精简版执行流程概述
在用户程序里面接收程序文件并写入flash,接收完成以后置位升级标志,复位重启.
BootLoader程序检测到升级标志,把接收的程序文件拷贝到运行区,并运行用户程序.
测试
1.提供了两份用户程序(为了精简内存,用户可以根据自己实际应用场合选择使用哪一个)
注:BootLoader程序都一样,
STM32F10xTemplate 获取程序文件的时候,先获取info.txt 然后再获取程序文件
STM32F10xTemplate_small 直接获取程序文件
先看STM32F10xTemplate_small的使用过程
2,下载BootLoader程序到开发板
3.下载以后打印如下(默认开发板上的USB口,单片机串口1作为了日志打印口)
4.下载用户程序到开发板
上面已经下载了BootLoader程序,为了下载用户程序时不覆盖掉BootLoader程序
需要下载的时候做一下配置. 需要使用下载器 ST-Link / Jlink
提示:如果使用的串口下载,可以按照第一节把BootLoader和用户程序的hex文件合成一个hex文件下载到开发板
提示:如果使用的串口下载,可以按照第一节把BootLoader和用户程序的hex文件合成一个hex文件下载到开发板
提示:如果使用的串口下载,可以按照第一节把BootLoader和用户程序的hex文件合成一个hex文件下载到开发板
下面演示使用下载器下载
打开用户程序
调整用户程序的下载设置,只擦除使用的部分
注意检查下其它配置是否正确(和BootLoader打印的保持一致)
然后点击下载
正常情况下会显示运行用户程序
5.用户程序是直接访问下载程序文件,我是使用按钮控制的
动作一下开发板上的 PB5 按钮
6.在日志上会看到用户程序访问下载固件过程
获取程序文件
升级完成,运行新的用户程序
BootLoader程序详细说明
BootLoader程序检测到有更新标志,就把下载的用户程序拷贝到运行区...
然后加载运行区执行.
因为BootLoader只是简单的拷贝数据,所以只需要4KB就可以
注:去掉printf打印,可以缩减到3KB,注意如果修改了flash配置参数,记得要和用户程序里面保持一致
用户程序详细说明
1.清除更新标志
用户程序下载完程序以后,会置位更新标志,就重启了,BootLoader只是判断有这个更新标志就拷贝程序
并不清除这个标志,所以用户程序需要清除这个标志
2.在IAP.c里面设置产品型号,版本号,和固件下载地址
注:size:AAAAAAAAAAAAAAA 是作为固件大小写到bin文件里面,这个是由编辑bin文件软件自动识别设置的
程序下载的时候会提取bin文件大小,然后和实际的文件大小做对比. 之所以增加这个是因为直接下载固件,没有文件大小容易出问题!!!!
3.然后在配置文件里面控制模组下载固件文件
下载之前只要调用 IAPInit();来初始化所有变量 和 事先擦除flash
IAPResolveUrl(IAPUrlUserInfoPath); 是解析下载地址
在发送完获取固件文件指令以后需要设置 IAPStructValue.LoopListPutStart = 1;
这个是允许把程序文件写到环形队列里面.用户只需要按照这个流程做就可以.
4.接收固件写到环形队列里面
5.从缓存里面提取数据写到flash里面
6.判断写完成以后,设置更新标志,重启.
7.超时检测
一个是检测发送完获取固件之后服务器返回数据超时
另一个是接收数据后空闲超时
超时时间可在IAP.h里面修改
应用到自己的服务器
1.确认固件文件在服务器上的下载路径
我的是
注:设备型号根据自己的修改
版本号嘛...因为是直接访问下载程序文件,所以程序里面并没有去判断版本号
2.编译完成以后会在工程根目录的bin文件夹里面生成user.bin文件
3.打开OTA Tools软件(注意需要是2.0.0及其以上版本,如果不是最新,可到源资料中下载)
4.选择 刚才生成的user.bin ,然后选择生成固件
会在user.bin目录里面生成 user_crc.bin的文件
5.然后把生成的固件放到服务器上即可
user.bin 和 user_crc_bin的区别
1.每隔128字节增加CRC校验位
2.改写size,把真实的文件大小填写到bin文件
现在看下STM32F10xTemplate
STM32F10xTemplate 和 STM32F10xTemplate_small程序基本是一样的
只不过STM32F10xTemplate是先通过服务器上面info.txt 文件获取固件版本和下载地址
固件版本不一致以后再通过固件下载地址获取固件(这个和上面的一样了)
1.测试下
分别下载BootLoader和用户程序到开发板
BootLoader和上面是一个程序,上面如果下载了只下载用户程序就可以
2.串口日志输出如下
访问服务器的info文件,获取固件版本信息和固件下载地址
如果版本不一样,根据固件下载地址下载固件
升级完成以后,用户程序获取info文件,检测到版本号一致,不需要更新.
应用到自己的服务器
1.确认下info.txt文件和固件在服务器上的下载路径
我的都放在了
2.设备型号根据自己的修改,版本号可以改为别的
3.编译完成以后会在工程根目录的bin文件夹里面生成user.bin文件
4.打开OTA Tools软件
4.选择 刚才生成的user.bin ,然后选择生成固件
会在user.bin目录里面生成 user_crc.bin的文件
5.然后把生成的固件放到服务器上
6.还差一个info.txt文件
我准备了一个模板
7.修改版本号(和用户程序里面设置的一样)
8.修改固件程序大小(OTA Tools提示信息里面有这个大小)
9.修改固件程序下载地址(和服务器上面的保持一致)
10.最后的提示信息不需要更改,当前用不到
11.把info.txt文件也拷贝到服务器
12.然后按照一开始的测试步骤测试即可
记得修改下用户程序里面的固件版本,然后重新下载到开发板,
让本地版本和服务器上面的版本不一样,一样的话会提示版本已是最新不需要升级.
用户程序说明
1.主函数和上一个程序相比就是直接控制模组访问服务器
2.先获取info.txt文件信息
3.再根据下载路径获取固件,就和上面的程序一样了
注:info.txt和固件都在一个服务器里面,所以我直接再发了个指令(一般http连接超时时间是5s左右)