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远程在线升级的更多相关文章

  1. 实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件

    代码地址如下:http://www.demodashi.com/demo/12994.html 一.前言: 写了这么多的8266博文,一直以满意100%的心态去敲写代码固件烧录,以致很少出现 bug ...

  2. STM32f103x IAP远程升级小结

    最近在面试的时候遇到一个关于IAP远程程序升级的问题,由于之前所做的项目没有涉及到远程升级需求,当时一脸懵呆,不过回答的还是不错的,今天针对STM32F103系列调试了IAP的程序,这里做一下小结,如 ...

  3. STM32 IAP 在线升级详解(转)

    源:http://blog.csdn.net/yx_l128125/article/details/12992773 (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP   ...

  4. 【转载】STM32 IAP 在线升级详解

      (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP  再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后 ...

  5. C#中级-从零打造基于Socket在线升级模块

    一.前言       前段时间一直在折腾基于Socket的产品在线升级模块.之前我曾写过基于.Net Remoting的.基于WCF的在线升级功能,由于并发量较小及当时代码经验的不足一直没有实际应用. ...

  6. 自学Linux Shell9.3-基于Red Hat系统工具包:RPM属性依赖的解决方式-YUM在线升级

    点击返回 自学Linux命令行与Shell脚本之路 9.3-基于Red Hat系统工具包:RPM属性依赖的解决方式-YUM在线升级 本节主要介绍基于Red Had的系统(测试系统centos) yum ...

  7. 用C#实现C/S模式下软件自动在线升级

    用C#实现C/S模式下软件自动在线升级 1 前言 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性 ...

  8. 【Socket】从零打造基于Socket在线升级模块

    一.前言       前段时间一直在折腾基于Socket的产品在线升级模块.之前我曾写过基于.Net Remoting的.基于WCF的在线升级功能,由于并发量较小及当时代码经验的不足一直没有实际应用. ...

  9. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级

    实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...

随机推荐

  1. 在ecplise中创建一个maven工程

    1.我们首先需要在Ecplise中配置maven环境,详情见我的博客:https://www.cnblogs.com/wyhluckdog/p/10277278.html 2.maven projec ...

  2. Django配置Bootstrap, js

    1.首先在APP目录下创建一个static文件夹 如图: # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'dj ...

  3. seo工具

    http://tool.seowhy.com/ 一.关键词查词类工具:可以查询出更多目标客户可能搜索的词语 1.百度指数:http://index.baidu.com/ 这个工具是使用人数最多的 2. ...

  4. jsp传中文乱码问题 encodeURIComponent()编码方法

    方法一: jQuery.ajax({            type:"POST",            url:"${ctx}/offer.do",     ...

  5. TextView等组件的LayoutParams不能随便用,不然组件不显示

    TableLayout.LayoutParams lpRow = new TableLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTEN ...

  6. Socket使用大全

    第一部分.概念的理解 1.什么是Socket? Socket又称之为“套接字”,是系统提供的用于网络通信的方法.它的实质并不是一种协议,没有规定计算机应当怎么样传递消息,只是给程序员提供了一个发送消息 ...

  7. Angular 通过注入 $location 获取与修改当前页面URL

    //1.获取当前完整的url路径 var absurl = $location.absUrl(); //http://172.16.0.88:8100/#/homePage?id=10&a=1 ...

  8. 2018.09.16 bzoj3626: [LNOI2014]LCA(树链剖分)

    传送门 树链剖分好题. 对于每个点维护一个值vi" role="presentation" style="position: relative;"&g ...

  9. springMVC学习(注解实现依赖注入)

    原文:http://blog.csdn.net/mockingbirds/article/details/45399691 上一篇博客,学习了spring的依赖注入,即利用spring容器来为类中的属 ...

  10. cxf maven依赖

         <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-front ...