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的升级命令实现升级 ...
随机推荐
- go实现的简易TCP的客户端和服务器
今天介绍golang版本的通信基础:基于TCP的客户端和服务器实现,参考书籍:The Way To Go 那时学习java的时候也是做过通信的,当时是socket编程,服务器监听某一个端口,然后客户机 ...
- yaf框架安装配置
YAF中文文档:http://www.laruence.com/manual/index.html 1 YAF框架是用C开发的,属于PHP的扩展框架: 2 YAF的性能相对于源生PHP,性能只降低不到 ...
- Linux screen命令
一.简介 GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换. GNU Screen可以看作是窗口管理器的 ...
- 带你认识那些App可靠性设计
可靠性是软件一个重要的质量属性,它关注的是软件功能持续的可用性,以及出现故障之后是否能够容错,是否能快速的恢复使用. 可靠性六条基本准则 1.故障应在第一时间被检测和感知: 2.能避免的故障都不应该发 ...
- 5条面经,助你成功拿到UX设计师Offer
为什么成为 UX设计师? 如果你经常逛推酷, 知乎, 设计达人或者一些专业的设计师论坛,博客,你会发现,第一批成为UX设计师的人,其实是误打误撞地落入这个行业的.那时候人们并不清楚UX设计师是什么 ...
- 2018.10.09 NOIP模拟 世界杯(图论+set优化)
传送门 貌似是防akakak题? 不是很清楚. 事实上如果两个人没有严格的大小关系,我们给他们两个连一条边. 这样可以构成很多连通块. 而且对于连通块a,ba,ba,b,aia_iai和bjb_jb ...
- 【转】Paxos算法3-实现探讨
——转自:{老码农的专栏} 前两篇Paxos算法的讨论,让我们对paxos算法的理论形成过程有了大概的了解,但距离其成为一个可执行的算法程序还有很长的路要走,原因是很多的细节和错误未被考虑.Googl ...
- nexus 组件下载和上传
一. 重写 super pom 修改 maven 的 settings.xml Configuring Maven to Use a Single Repository Group <setti ...
- 常用算法 (JS实现)
全排序列 function swap(array,a,b){ var m=array[a]; array[a]=array[b]; array[b]=m; } function full_sort(a ...
- pytest 入门及运行
关于pytest的入门教程,官网及网上已经很多了,那再多一点也无所谓吧!OK,进入正题~ 下面是一个测试用例,test_one.py def test_passing(): assert (1, ...