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. sphinx文档

    Navigation index modules | Sphinx主页 | 文档 » 下载 目前版本: 1.2 获得 Sphinx 从 Python Package Index, 或者使用如下命令安装 ...

  2. "UX"将会是下一个Buzzword?

    “用户体验非常重要”.“没有用户体验就没有产品”.“UX就是一切”.不知道从何时开始,用户体验(UX) 这个名词已经变得如此多见了,但是人们真正的认识.认清了什么是用户体验了吗?设计师们常挂在嘴边的用 ...

  3. 设计模式之Adapter设计模式

    这个设计模式是我这两天刚学的,这儿算是我的读书笔记发布出来是供大家一起学习,后面有我自己的感悟,下面是我网上整理的 以下情况使用适配器模式 • 你想使用一个已经存在的类,而它的接口不符合你的需求. • ...

  4. 【Linux】SVN的安装和配置

    SVN SVN:SVN是Subversion的简称,是一种开放代码的版本控制系统,相比较RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制器服务已从CVS迁移到Su ...

  5. Windows游戏找不到了怎么办?

         大家有的时候,可能是不慎操作,或是某些新装的Windows,会发现那些经典的游戏不见了,那它们去哪了呢?是长腿跑了?还是Windows偷工减料?都不是,让巩固来教你们把他们找出来! 1.在开 ...

  6. MVC各层应该要实现的代码

    1.C 在设计良好的应用中,控制器很精练,包含的操作代码简短: 如果你的控制器很复杂,通常意味着需要重构,转移一些代码到其他类中. 归纳起来,控制器 可访问 请求 数据; 可根据请求数据调用 模型 的 ...

  7. js数组合并(一个数组添加到另一个数组里面)方法

    js定义两个数组. var arrA=[1,2,3]; var arrB=[4,5,6]; 要实现[1,2,3,4,5,6],如果直接arrA.push(arrB); 则arrB只会作为了arrA的一 ...

  8. 解决Docker时区与主机时区不一致的问题

    在Dockerfile里面增加以下红色的部分 FROM hub.chinacloud.com/common/jdk:8MAINTAINER xxx@chinacloud.com.cn RUN mkdi ...

  9. UVa 210 Concurrency Simulator (双端队列+模拟)

    题意:给定n个程序,每种程序有五种操作,分别为 var = constant(赋值),print var (打印), lock, unlock,end. 变量用小写字母表示,初始化为0,为程序所公有( ...

  10. [笔记]python

    配置python apt install python2.7 python3 apt install python-bs4 python3-bs4 apt install virtualenv apt ...