IAP远程在线升级
IAP远程在线升级
在上一篇中实现了LWIP网口通讯,那么肯定要加个在线升级功能,这个功能所占用的资源很少,但在物联网中很重要也很实用。在线升级就是像手机一样,先下载好系统,然后点击升级~然后就没然后了。
网上有很多IAP的教程,为了方便演示,大多数都在Bootloader引导代码中添加了选择显示功能,并且通过串口接收固件。这对于教学来说非常好,但在实际使用中,这是不可取的。通常,Bootloader代码尽量做得越小越好,它只需要实现把存储器中的代码烧录到Flash中,然后跳转到APP的地址执行就OK了。至于接收固件和选择显示等功能应该由APP代码来实现,APP代码在升级功能中主要负责通过通讯把接收到的数据存到存储器中。
一下就分享我实现IAP远程升级功能的经验,驱动程序主要还是基于原子的教程改写的。
读取单片机内flash代码,可有可无,这个可以方便做出厂固件保存。
void Flash_To_W25Q(unsigned int addr, unsigned int len)
{
u32 i;
u32 secpos;
u32 secremain; secpos = len/SECTION; //分多少次缓存
secremain = len%SECTION; //最后剩余字节 for(i=; i<secpos; i++)
{
STMFLASH_Read(FLASH_APP1_ADDR+SECTION*i,(u32*)Data_W,SECTION);//读取Flash代码
W25QXX_Write(Data_W,addr+SECTION*i,SECTION);
W25QXX_Read(Data_R,addr+SECTION*i,SECTION);
}
STMFLASH_Read(FLASH_APP1_ADDR+(SECTION*i),(u32*)Data_W,secremain);//读取Flash代码
W25QXX_Write(Data_W,addr+SECTION*i,secremain);
}
读取存储芯片内的固件,并写入到单片机,这个固件就是APP接收到并保存的。
void W25Q_To_Flash(unsigned int addr, unsigned int len)
{
u32 i;
u32 secpos;
u32 secremain; secpos = len/SECTION; //分多少次缓存
secremain = len%SECTION; //最后剩余字节 for(i=; i<secpos; i++)
{
W25QXX_Read(Data_R,addr+SECTION*i,SECTION);
iap_write_appbin(FLASH_APP1_ADDR+(SECTION*i),Data_R,SECTION);//写入到Flash
}
W25QXX_Read(Data_R,addr+SECTION*i,secremain);
iap_write_appbin(FLASH_APP1_ADDR+(SECTION*i),Data_R,secremain); }
跳转到APP地址,之所以做个判断,是可以识别APP代码中是否有程序。
if(((*(vu32*)(FLASH_APP1_ADDR+))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//跳转到APP地址
}
APP主函数开始加入地址偏移
SCB->VTOR = FLASH_BASE | 0x10000; 地址偏移0x10000
APP工程中也不要忘了编译时偏移地址

生成.bin文件,加入这句 fromelf.exe --bin -o "$L@L.bin" "#L"

最后分享一下我个人的观点。我使用的是网络通讯接收固件,因为单片机运行内存有限,必须要把固件拆包发送接收。按理说在接收完全部数据后应该要进行MD5校验才能升级,而Bootloader在取出数据时也应该进行一次MD5校验,而我就懒得做了~也算是个隐患,在后期优化还是会考虑做。出厂的时候非常建议对固件进行自动备份存储,如果有条件的话还可以再开辟一个存储区域用来存储上一次升级的数据用来回滚。另外,有人也许会想问,在线升级有两个代码,那出厂的时候岂不是要烧两个程序,对于我这种懒到家的人来说,烧一个程序都够烦的了,要要烧两次,我才不干。这时候可以使用UltraEdit编辑器对bin文件进行合并,因为这两个代码的flash地址是不冲突的,具体教程可以参考https://blog.csdn.net/xinghuah/article/details/82145192
IAP远程在线升级的更多相关文章
- 实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件
代码地址如下:http://www.demodashi.com/demo/12994.html 一.前言: 写了这么多的8266博文,一直以满意100%的心态去敲写代码固件烧录,以致很少出现 bug ...
- STM32f103x IAP远程升级小结
最近在面试的时候遇到一个关于IAP远程程序升级的问题,由于之前所做的项目没有涉及到远程升级需求,当时一脸懵呆,不过回答的还是不错的,今天针对STM32F103系列调试了IAP的程序,这里做一下小结,如 ...
- STM32 IAP 在线升级详解(转)
源:http://blog.csdn.net/yx_l128125/article/details/12992773 (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP ...
- 【转载】STM32 IAP 在线升级详解
(扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP 再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后 ...
- C#中级-从零打造基于Socket在线升级模块
一.前言 前段时间一直在折腾基于Socket的产品在线升级模块.之前我曾写过基于.Net Remoting的.基于WCF的在线升级功能,由于并发量较小及当时代码经验的不足一直没有实际应用. ...
- 自学Linux Shell9.3-基于Red Hat系统工具包:RPM属性依赖的解决方式-YUM在线升级
点击返回 自学Linux命令行与Shell脚本之路 9.3-基于Red Hat系统工具包:RPM属性依赖的解决方式-YUM在线升级 本节主要介绍基于Red Had的系统(测试系统centos) yum ...
- 用C#实现C/S模式下软件自动在线升级
用C#实现C/S模式下软件自动在线升级 1 前言 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性 ...
- 【Socket】从零打造基于Socket在线升级模块
一.前言 前段时间一直在折腾基于Socket的产品在线升级模块.之前我曾写过基于.Net Remoting的.基于WCF的在线升级功能,由于并发量较小及当时代码经验的不足一直没有实际应用. ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级
实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...
随机推荐
- mysql优化概述4
一.分区 1.分区概念 将某张表数据,分别存储到不同的区域中. 每个分区,都是独立的表,都要存储该分区的数据,索引信息. 2.创建分区 创建表并指定分区的选项 create table 表名 ( 定义 ...
- How to set an Apache Kafka multi node – multi broker cluster【z】
Set a multi node Apache ZooKeeper cluster On every node of the cluster add the following lines to th ...
- swagger ui js 错误:Failed to execute 'serializeToString' on 'XMLSerializer': parameter 1 is not of type 'Node'.
经过排查,引发此错误的原因是,表中有一个字段名称为“NodeName”,应该是在前台xml解析时引发冲突所致.我的解决办法是: 修改列名,修改映射. 如下: [Column("NodeNam ...
- 读书笔记---改善c#编程的157个建议
1.在拼接string时,如果牵涉到其他类型,先tostring一下会减少装箱操作:频繁操作字符串变量的话,使用stringbuilder效率较高. 2.tryParse相对于parse而言效率高,t ...
- chrome 调试工具的使用
Elements chrome devtools 中 Elements panel 是审查 dom 元素和 css 的, 可以实时修改 dom/css. windows: ctrl + shift + ...
- Javascript中escape()、encodeURI()、encodeURIComponent()的区别
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...
- Java读properties文件中文乱码问题的解决方法
java读properties文件,包含中文字符的主要有两种: 1.key中包含中文字符的(value中也有可能包含) 2.key中不包含中文字符的(value中有可能包含) 1.key中包含中文字符 ...
- 【Maven】安装及配置(Linux)
本文介绍Linux环境下安装Maven 安装环境和软件 系统:Linux(CentOS) 软件:apache-maven-3.3.9-bin.tar.gz(解压版). 安装步骤 maven是基于Jav ...
- 2018.10.23 NOIP训练 Leo的组合数问题(组合数学+莫队)
传送门 好题. 考察了莫队和组合数学两个知识板块. 首先需要推出单次已知n,mn,mn,m的答案的式子. 我们令f[i]f[i]f[i]表示当前最大值为第iii个数的方案数. 显然iii之后的数都是单 ...
- 2018.09.08 poj1185 炮兵阵地(状压dp)
传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...