IAP软件范文
IAP软件范文(精选4篇)
IAP软件 第1篇
IAP(In Application Program),即在应用编程,就是在运行过程中动态对Flash存储器进行编程,动态修改程序代码[1]。IAP技术广泛应用于嵌入式系统的数据存储和程序代码在线升级的解决方案中。
本文以NXP公司的LPC2214系列ARM7芯片为应用平台,设计、实现了ARM7通用控制器的U盘软件升级的方案,并对其进行了优化。该方案简化了软件升级过程,避免了以往软件升级需要拆装主机、更换芯片等问题,解决了升级过程意外中断、传输无码,节约了人力和资金。
2 IAP原理
2.1 NXP LPC2214简介
LPC2214是一款基于32/16位ARM7TDMI-S的处理器,带有32k B静态RAM和256k B FLASH存储器。128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行,因此,程序代码在片内FLASH中运行,不会影响程序执行速度[2]。
2.2 LPC2214 IAP原理
LPC2214系列处理器在片内固化了一段BOOT程序。BOOT程序控制芯片复位后的初始化操作,并提供对FLASH编程的方法。BOOT装载器可启动对空片的编程、已编程器件的擦除和再编程以及在运行的系统中由应用程序对FLASH存储器进行编程。
LPC2214系列处理器的BOOT扇区规格为8k B,位于片内FLASH存储器最顶端的部分,从存储器地址0x0003E000开始。复位后,BOOT扇区被映射到片内存储器空间的顶端,即该扇区的起始地址为0x7FFFE000。中断向量位于片内FLASH存储器的BOOT扇区中,它在复位后被激活,映射在存储器地址0x00000000开始的区域。经过存储器映射之后,IAP代码的入口地址位于0x7FFFFFF0[3]。
2.3 IAP代码的调用
IAP操作通过寄存器R0指向RAM中的命令代码和参数来调用IAP程序。IAP命令的结果返回到寄存器R1所指的返回表中[1]。IAP代码操作片内FLASH以扇区(Sector)为单位。因此,编写升级代码之前,必须熟悉片内FLASH扇区的分布。
IAP程序会使用片内RAM空间顶部32字节,因此应避免使用这部分地址空间。片内RAM空间顶部一般被设置为ARM用户模式下的堆栈,所以在启动代码中需要调整堆栈空间[1]。在SCF文件中通过分散加载设置用户模式堆栈到片内RAM顶端,调整用户模式堆栈大小的汇编代码如下所示:
MSR CPSR_c,#0xdf;设置系统模式/用户模式堆栈LDR SP,=StackUsr–32;StackUsr用户模式堆栈IAP程序是Thumb代码,起始地址位于0x7FFFFFF0。因此,调用IAP代码时,不仅需要实现地址跳转而且还要完成状态转换。
IAP过程用下面的C代码来调用:
定义IAP命令和返回结果数据:
uint32 paramin[8];//IAP入口参数
uint32 paramout[8];//IAP出口参数
根据各种不同的IAP命令设置好入口参数后,使用如下语句调用IAP:
iap_entry(paramin,paramout);
3 LPC2214平台U盘软件升级方案设计
3.1 升级方案硬件设计
ARM7控制器的升级程序来源于U盘。控制器需要升级软件时,通过在USB外设接口外接U盘获取升级代码。控制器主板上采用CH375芯片进行USB通信。控制器程序升级系统框图如图1所示。
USB IC芯片CH375,是国内南京沁恒公司推出的支持USB-HOST主机方式和USB-DEVICE/SLAVE设备方式的芯片。CH375具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/ARM等控制器的系统总线上。CH375芯片能自动检测USB设备的连接和断开,提供设备连接和断开的事件通知;此外,内置的控制传输协议处理器简化了常用的控制传输。
CH375硬件接口电路如图2所示。
3.2 LPC2214片内FLASH空间分配
在应用编程的过程把片内FLASH分成两部分,一部分运行用户编写的软件,实现产品的各种功能;第二部分运行升级代码,固定在FLASH空间,写入后不能被更改,对用户代码FLASH区执行擦除、重编程等操作,完成对产品的升级过程。后者分配LPC2214 FLASH扇区0~14存放用户代码。分配扇区15、16存放升级功能的代码。
通过SCF分散加载的方式,固定升级代码在15、16扇区。使用如下的Scatter文件可以满足设计要求。其中0x0003A000代表扇区15的起始地址;Scatter关键字FIXED在加载区中创建多个根执行区域,实现把某个函数或一段数据放到目标地址,从而可通过指针访问该地址[4]。分散加载SCF文件如下所示:
3.3 升级方案软件设计
升级方案流程图如图3所示。
在本方案中,主程序区从0x00000000地址开始,存放用户代码。升级程序区从地址0x0003A000开始,存放实现U盘升级功能的代码。当主程序复位开始运行时,检测是否有升级命令,然后比较升级程序的版本和当前程序版本,当符合升级要求时,跳转到升级程序区执行升级功能。
3.4 升级过程防意外中断设计
在升级的过程中,难免会出现掉电、数据传输错误、数据来源中断等各种意外情况导致升级失败,因此必须有一套可靠的机制来保证升级过程的成功。
对于断电意外情况,可以通过设置BOOT引导区来保证系统再次来电后能够继续完成升级过程。本设计把升级代码固定在0x0003A000地址开始的FLASH区,任何情况下都不会擦除这部分扇区的内容。LPC2214的中断向量表和启动代码是存放在扇区0开始的地址。中断向量表存放32字节的数据。在中断向量表之后,存放的是启动代码,程序设计在启动代码中完成ARM运行环境的各种设置,如设置ARM各种模式的堆栈、必要功能部件的初始化等操作。在BOOT区引导用户代码之前,跳转到升级区检测升级命令以及检查上一次升级过程是否成功。这些部分占用扇区0起始地址开始约100字节左右。
升级程序设计为每512字节编程一次,考虑到LPC2214芯片512字节编程时间为1ms,只需保证扇区0起始512字节始终有效,即可保证升级过程的可靠性。
对于接收升级程序过程中,也可能会出现传输误码、数据来源中断等意外情况。本方案对传输数据进行CRC校验,以512字节为单位记录数据包,并将接收的正确数据包存放在片外FLASH中,错误或丢失的数据包要求重传,很大程度上降低了意外情况导致的升级失败的风险。
4 结语
本文简要介绍了芯片LPC2214的IAP功能通过U盘更新程序的实现方法。以上程序基于ADS1.2开发平台并调试通过。该方案已成功应用于某公司开发的无功补偿器控制器中,在实践中取得了良好的运行效果和经济效益。将该方案略加改动亦可应用于其他具有IAP功能的处理器芯片。
参考文献
[1]周立功,张华.深入浅出ARM7[M].北京:北京航空航天大学出版社,2005:371~376
[2]NXP Semiconductors.NXP LPC2214User Manual[EB/OL].http://www.nxp.com/acrobat/usermanuals/UM10114.pdf,2008-04-02
[3]周立功.ARM嵌入式基础教程[M].北京:北京航空航天大学出版社,2005:432~436
IAP软件 第2篇
井喷是石油天然气勘探开发都有的一种事故类型。按照《企业职工伤亡事故分类标准》(GB 6441-1986),虽然井喷没有被直接列入20类人身伤害之一,但是井喷事故会引起物体打击、灼烫、火灾、高处坠落、其他爆炸、中毒和窒息以及其他伤害等二次伤害。井喷发生后,如果采取措施得当,后果不会很严重。但是,一旦应急措施不力、处置不及时,很快会演变成井喷失控,后果很严重。近年来,我国含硫气田勘探开发的安全生产形势非常严峻,在江汉、新疆、四川等油气田区相继发生了多起重特大井喷失控、硫化氢中毒事故,造成大量人员伤亡或导致大量群众疏散,给社会带来了严重不良影响。
为保证迅速、有序、有效的开展应急救援行动,尽量降低事故损失,需要预先制定井喷事故应急预案,而事故行动计划(Incident Action Plan,IAP)是应急预案的一种类型。IAP主要是根据实际情况需要而针对作业期间某个具体装置、场所或设施、岗位所制定的事故应变处置措施,它是一系列简单行动过程的总称。科学制定IAP,对应急工作具有更强的针对性和指导性,因而在应急救援工作具有重要的作用。IAP的特点主要有:
(1)编制程序简单、易于掌握。IAP的编制主要针对某一类事故,可由各个具体装置、场所或设施、岗位的现场负责人来完成,经过现场负责人核准后传达到每名具体的作业工人。
(2)具有更强的针对性。IAP与综合预案和专项预案相比,其目标针对的是作业场所中可能发生事故的具体对象(如装置、岗位等)而制定的事故处置措施,具有清晰的事故处理目标及处置方案,因此具有更强的针对性。
(3)具有更高的可操作性。IAP是根据风险评估和危险控制措施逐一编制,并根据应急演练进行不断更新与完善,要求相关人员应知应会,做到熟练掌握,因此具有更高的可操作性。
2 国外事故行动计划研究进展
事故行动计划最早出现在美国事故指挥体系(Incident Command System,ICS)中。美国事故指挥体系设立了包括指挥部、计划部、作业部等在内的8个职能部门。其中,ICS规定由计划部负责制定IAP,用于确定特定作业期间的事故应急和救灾资源调配。ICS制定的事故行动计划涵盖了作业期间所有的事故目标及应急行动。制定事故行动计划的要求包括:
(1)了解事件的状态。包括搜集现有的基本概况,并进行整理及分析,使整个事件的基本信息完整化和清晰化。这一步骤是制定事故行动计划很重要的步骤之一,重点内容主要包括:①事件的种类、危害程度及当地的天气和地理因素;②事件周期,包括事件持续时间以及各项应急行动开始和结束的时间;③事件发生的地点;④应急资源情况,包括人力、物资、车辆、器材、耗材等应急物资的种类、数量及位置。
(2)制定事件应急策略。在确定事故目标之后,就必须订定为保证完成这一事故目标,所需要的各项应急处置策略。
(3)确定应急组织架构。ICS的架构是可以根据事件的大小而伸展或缩小,所以制定应急策略后,要确定应急组织架构的规模。确定应急架构的原则是尽量使架构简单、清晰,架构体系不需要过于复杂,只需要明确每一项功能的完成机构和监督机构即可。
(4)信息交流与传递。ICS规定必须在最短的时间内,将事故分析的结果、各种应急计划传递给每一个需要这些信息的应急人员。传递的信息文件可以包括:①事故行动计划;②状况评估报告;③任务执行简报;④公共信息。
(5)制定应急方案。在事故目标及应急策略确定之后,必须制定完善的应急方案,包括适当的任务分配、标准的执行程序等。
(6)评估及监控应急行动效果。在开展应急行动后,ICS要求必须持续地监控及评估应急行动是否能够达成预计的事故目标。根据监控及评估的结果,结合预先设定的事故目标,优化完成每项任务的应急行动。
(7)事故行动计划修订。如果在评估的过程中,发现其成效与原先设定目标的预期有差距时,就必须要对IAP进行修改。
3 含硫气田井喷事故及特点
3.1 井喷的发生原因
造成井喷失控的主要原因可包括:①地质设计未能提供准确的资料;②操作失误;③机械故障;④发生井喷后处置措施不当。
3.2 井喷的主要特点
井喷事故的特点主要有:①危险性高。井喷事故的发生后,除释放出大量有毒有害气体外,还极有可能引发火灾和爆炸事故、环境污染事故等。②危害性大。一旦发生井喷事故,如果不迅速采取有效措施,极易造成机毁人亡,带来巨大的经济损失。③突发性强。井喷事故通常都具有突发性特征,来势凶猛。由于井喷溢出气体通常对人体具有强致毒性,而且源于地下,发展态势极为不确定。④处置难度高。由于三高气田钻完井工艺技术比较复杂,加上钻井地的地理地形较为复杂,发生井喷事故后处置工作涉及单位多,都增加了井喷事故的处置难度。
4 含硫气田井喷事故行动计划编制
4.1 现状分析
(1)危险分析
分析发生井喷事故的地点、产生危害的种类及影响范围、危害影响的时间、是否还有其他的次生或衍生灾害发生、当地的地理和气象条件如何等。
(2)应急处置分析
分析井喷事故发生后预期所需要的警戒时间、各项应急救援全面开展的时间、所需要特种应急资源的种类和数量及其分布(如人力、物资、车辆、器材、耗材等)。
4.2 设立事故目标
(1)设立事故目标的原则
设定事故目标是制定IAP的首要任务,在设定事故目标时,要遵守以下三个原则:①可行性原则。设定的事故目标要充分考虑在现有操作阶段所具备的操作人员、设备设施和资源前提下,事故目标是可以实现的。②可量化原则。事故目标要具有可量化性,事故管理小组能够对此事故目标以及为实现目标所采取的各种应急处置措施的效果进行考核。③伸缩性原则。设定的事故目标要广泛考虑到IAP在不同阶段所制定应急策略和应急处置措施,并能以各种不同的方式来实现。
(2)设立事故目标的方法。
①对于较小事故的目标确定,可由现场负责人来独立完成,并由其制定完成事故目标所需要采取的应急策略和处置措施。②对于较大事故的目标,确定之前,现场负责人要将其提出的事故目标以书面形式转发到每个小组负责人手中。经过小组负责人的消化吸收后,由现场负责人召开研讨会,并最终确定事故目标和事故应急策略与措施。
4.3 确定应急组织体系与职责
现场的应急组织体系是应急响应的第一响应者,是在事故发生后第一时间开展应急自救的执行者,决定了能否及时控制事故以及事故应急工作的成败。在编制IAP时,要明确现场应急组织体系每一个机构和人员组成,明确应急自救组织机构、人员及其相关责任。
现场应急组织体系,可以根据实际工作的需要,由现场负责人提出,并经过小组讨论后确定。一般的应急组织体系包括以下几个方面的内容。
(1)应急指挥组。
应急指挥组可以设应急组长一名和应急副组长若干名,灵活掌握事故现场信息,向各小组下达应急指挥任务,协调各小组的应急工作。
(2)通讯联络组。
确保事故现场与指挥部及上级部门之间联络信息的通畅,保持与生产技术管理部的通信联络通畅,以及负责应急过程的记录与整理。
(3)消防抢险组。
采取紧急措施,尽一切可能抢救伤员及被困人员,防止事故的进一步扩大。明确实施抢险抢修的应急预案和措施,并不断加以改进。
(4)环境监测组。
负责对事故现场大气中的硫化氢、二氧化硫以及对事故现场周边的水质进行实时监测,并迅速出具检验报告;负责进行实时监测,并迅速出具检验报告。
(5)后勤保障组。
保障应急车辆的调配、紧急物资的征集和调用合理、可靠,并向医疗救助提供服务,对受伤人员开展救助工作。
4.4 制定应急处置措施
在编制IAP时,应根据发生的事故类别以及现场具体情况,明确事故报警、各项应急措施行动、应急救护人员的引导、事故扩大应急程序等。现场应急措施,主要说明针对突发的事故,应采取的具体处置技术措施,包括从操作措施、工艺流程、现场处置、事故控制、人员救护、现场恢复等。例如,在编制井喷失控应急处置措施时,要重点考虑内容包括:①井口点火;②井口清障;③恢复控制;④重建平衡;⑤若以上应急处置措施无法恢复井口控制,可以采取打救援井,或封井、弃井等措施。进行救援井施工和封井、弃井施工应严格执行标准,并有工程施工涉及。
4.5 应急资源调配
制定的每一项应急处置措施,都伴随着应急资源的调配,包括的应急资源调配的种类、项目以及在作业周期内为达到处置该紧急事故所需要的数量、可用的数量。在编制IAP时,主要考虑的应急资源调配内容包括:无线电通讯、医疗救护、交通运输、安全措施、事故现场地图、气象条件资料、特别警戒以及安全信息等。
4.6 开展评估与监控
在编制井喷事故IAP时,要预先包含针对IAP评估程序,以保证IAP的有效性。IAP评估步骤主要分为三步:
(1)在现场应急组组长正式核准发布IAP之前,各应急参与机构及其相关的参与人员要对IAP各个计划能否满足现实应急工作需要进行核准,并在各自IAP计划上签字确定。现场应急组组长在核准所所有的签字,正式发布IAP。
(2)在作业周期中,现场应急组组长、各计划组负责人必须定时的评估作业进展情况是否符合IAP所要求的管控要点。如发现任何的疏漏,要在第一时间通知责任人,对IAP中涉及的相关内容进行修改。
(3)各计划组组长可以根据现场的实际需要,调整IAP中的应急处置措施,以更快的达成事故目标。
5 结论
井喷事故发生后,是否及时采取了科学、合理的应急方案,成为能否有效控制井喷事故的关键因素。虽然多数企业都制定了井喷事故应急预案,但当发生井喷事故时,仍会让多数的企业措手不及,反映出应急预案的可操作性还不能满足实际应急工作的需要。而事故行动计划较传统形式的应急预案,具有更强的针对性。编制科学、合理的事故行动计划,对提高含硫气田井喷事故应急工作的效率,控制事故的影响范围,降低事故带来的损失,都具有重大的意义。
摘要:本文对国内外事故行动计划的研究进展进行了系统性总结,分析了含硫气田井喷事故发生的原因以及特点。结合我国现行的事故应急工作体系,将事故行动计划应用在含硫气田井喷事故应急工作中,提出了针对含硫气田井喷事故的事故行动计划编制方法,建立了包括现状分析、设立事故目标、确定应急组织体系和职责、制定应急处置措施、调配应急资源、开展评估与监控在内的含硫气田井喷事故行动计划编制技术体系。事故行动计划的制定与实施,可有效提高含硫气田应急工作的针对性和指导性,对含硫气田井喷事故应急工作具有重要作用。
IAP软件 第3篇
关键词:IAP,程序更新,ARM7
ARM处理器是一种高性能、低成本、低功耗的RISC微处理器,是目前最为流行的微处理器之一。ARM7作为ARM微处理器系列中的一员,广泛应用于工业控制、网络应用、消费电子和安全产品等。实际应用中往往需要对产品的程序进行升级以提升性能或消除缺陷,如何对已经投入使用的产品进行方便可靠的程序在线升级,是产品设计初期必须考虑的问题。尽管目前绝大多数基于Flash结构的ARM7芯片具备ISP功能,但是这需要特定的烧写软件支持和专业人员操作。烧写软件由芯片厂商提供,不便于集成到产品的主机端软件中。在产品软件功能中添加简单易用的程序升级功能十分必要,文中以NXP公司的ARM7芯片LPC2132为例,为具有IAP功能的ARM7芯片提出一个稳定的在线升级方案。
1 IAP功能介绍
在应用编程IAP(In-Application Programming)是应用在Flash程序存储器的一种编程模式。它可以在应用程序正常运行的情况下,通过调用特定的IAP程序对另外一段程序Flash空间进行读/写操作,甚至可以控制对某段、某页甚至某个字节的读/写操作,这为数据存储和固件的现场升级带来了更大的灵活性。LPC2132的IAP程序位于芯片的BootBlock中,芯片出厂时由厂家写入,不可修改。IAP程序是Thumb代码,位于地址0x7FFFFFFO(重映射后地址)处[1]。IAP功能函数可以通过如下代码方便的调用。
void(*IAP)(unsigned int parameter[],unsigned int result[]);//定义函数指针变量IAP,
//IAP指向的函数的参数为两个unsinged int 数组
IAP = (void(*)())0x7fff_fff1 //设置函数指针,因为是Thumb代码,地址最低位设定为1
unsigned int parameter_in;//通过设定parameter_in各成员的值,实现各种IAP功能
usingned int result_out;
(*IAP)(parameter_in,result_out);//调用特定功能的函数,执行结果存入result_out中
//IAP的命令码、状态码和命令[1]。
2 程序更新流程
LPC2132有64 kB的Flash存储器,16 kB的RAM。Flash分为8个扇区,每个扇区4 kB空间,整个Flash存储器占用的地址空间为0x0000_0000-0x0000_ffff[2]。为了实现用户程序运行过程中的程序更新,可以设计一段特定的驻留代码,专门用于接收来自主机新的代码,将其烧写到相应的Flash空间,完成后跳转到新的代码去执行新的程序,用户程序接收到来自主机的更新命令后跳转到这段驻留代码。驻留代码通过串口接收命令,调用IAP函数烧写Flash,代码比较少,编译生成的映像文件<4 kB,通过JTAG口将这段代码烧写到第一个4 kB扇区,每次系统上电或重启后先执行驻留代码,其运行流程为:
(1)初始化串口,查询接受缓冲区,检测是否受到主机发来的4 bit数据包0x55 0xaa 0xff 0xff,其中前2 bit 0x55 0xaa为命令头;第3 bit 0xff为命令,表示需要更新;第4 bit为命令和校验。整个查询过程持续100 ms,如果在100 ms内没有收到此命令包,跳到应用程序入口执行旧程序,如收到该命令包,返回0xff,通知主机收到命令,执行下一步;
(2)接受主机发来的数据包,其格式如表1所示。
将接收到的4 kB数据存入SRAM,接收的同时计算数据载荷的8位校验和,对比校验和,如果校验和不对,给主机返回0x00表示接收不成功,主机会将当前包重发一遍;如果正确通过调用擦除IAP函数擦除当前需要写入的扇区,再调用写入IAP函数将RAM中的4 kB数据一次写入对应的扇区(通过配置上面提到的IAP函数参数parameter_in实现擦除和写入功能),给主机返回0xff,表示操作成功;
(3)如果上一步接受的数据包中标识指定其为最后一包,在执行步骤(2)写入操作后,跳到0x0000_1000处,即用户程序区,执行新的用户程序。通过下面的内嵌汇编代码可以十分方便的实现该跳转功能。
相应的用户程序设计时应该能从串口接收主机的命令,当接收到4 bit数据包0x55 0xaa 0xff 0xff后跳转到0x0000_0000处,执行驻留代码,由驻留代码完成用户程序的更新。用户程序设计时加上该功能后,其余与普通代码设计没有区别。
主机端软件在用户点击更新程序后,读取ARM7映像。bin文件,识别其大小,将其分成以4 kB字节为单位的若干段,按照上面与驻留代码的通信协议,将映像文件给驻留代码,并给用户提示是否成功信息。
在ARM应用系统中软件一般采用C语言进行编程,为了能进行系统初始化,通常会用一段汇编文件作为启动代码,实现异常向量表的定义,堆栈初始化、系统变量初始化、中断系统初始化、I/O初始化、地址重映射等。ARM7的异常向量位于地址0x0000_0000开始的32 bit内,当异常发生时程序从异常向量表取指令进行跳转。异常向量表位于Flash的第一个4 kB空间,用户程序运行时遇到异常时,也会到0x0000_0000开始的32 bit异常向量表中取出相应的指令。按照前面的设计,ADS编译器会将用户代码异常向量表运行地址设为从0x0000_1000开始,为了能让用户程序实现正确的异常处理,驻留程序的启动汇编代码需要将相应的跳转设为0x0000_1000开始的真正的用户异常向量处,这样驻留代码不能使用中断功能,实际上驻留代码完全可以采用查询方式进行串口通信。驻留程序的启动汇编代码示例如下[3]:
AREA vectors,CODE,READONLY
ENTRY
CODE32
Reset
LDR PC,ResetInit;复位跳到驻留代码初始化程序ResetInit
B 0x000010004;跳到用户异常向量UndefinedAddr
B 0x000010008;跳到用户异常向量SWI_Addr
B 0x00001000c;跳到用户异常向量PrefetchAddr
B 0x000010010;跳到用户异常向量DataAbortAddr
NOP
B 0x000010018;跳到用户异常向量IRQ_Addr
B 0x00001001c;跳到用户异常向量FIQ_Addr
ResetInit
…
3 注意事项
为了让用户代码运行地址从0x0000_1000开始,在ADS的ARM Linker选项卡将RO Base设为0x0000_1000。因为处理器要切换到Thumb指令执行IAP代码,需要将ARM C Compiler下的ARM Thumb Interworking选项勾上[4]。另外IAP函数使用了RAM空间的高32 bit空间,因此用户程序不应该使用该空间,用户堆栈栈顶要设定为小于RAM顶端地址减32。
4 结束语
实验结果显示按照上面的方法编写的驻留程序,能够稳定的接受主机发来的新程序,并成功烧写进Flash区,实现程序的更新。文中虽然以LPC2132为例实现,对于具有IAP功能的其他公司的ARM7芯片的在线程序更新也有借鉴意义。
参考文献
[1]Philips Corporation.Volume1:LPC213x User Manual Rev.01[Z].Holand:Philips Corporation,2005.
[2]Philips Corporation.LPC2132Product Data Sheet Rev.04[Z].Holand:Philips Corporation,2007.
[3]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.
IAP软件 第4篇
目前, 智能仪表等产品的设计主要以微控制器为控制核心, 但是其设计往往不可能一步到位, 尤其是固件程序部分, 需要根据产品使用反馈不断地进行修改和完善。当程序需要根据用户需求变更时, 传统情况下需要将产品拆卸下来返回原厂修改程序, 或请专业的维修服务人员亲自到设备现场, 将设备取下或者打开设备, 通过JTAG方式连接PC等来重新烧写程序。在应用编程 (In Application Programming, IAP) 技术可实现对产品的在应用升级。
ADuC702x系列微处理器由ADI公司生产, 集成了ARM7TDMI 16位/32位RISC (精简指令集计算机) 内核, 具有8k B的SRAM、62k B的Flash/EE存储器, 可通过UA RT或JTAG端口在线编程, 最高处理能力达44MIPS。当工作频率为41.78 MHz时, 典型的功耗为120mW。
ADuC702x在线IAP升级方案
ADuC702x系列微处理器物理存储结构地址如图1所示, 其程序通常放置在62kB的Flash/EE存储器内, 该Flash/EE可通过该系列微处理器内部Flash Control Interface进行读写访问操作, 通过该操作实现IAP固件程序升级功能。后续IAP方案研究和程序设计均针对该Flash/EE实施。
使用IAP对ADuC702x升级, 首先需要了解ADuC702x的Flash/EE基本存储结构和对程序存放的Flash/EE进行合理分区规划。Flash/EE基本存储结构如图2所示, 从图中可以看出, Flash/EE地址从0x00080000到0x0008FFFF, 总大小为64k B, 其Flash (闪存) 的位宽为16位, 因而F l a s h大小即为3 2 k1 6 b。F l a s h中512B (即25616b) 为一块, 为最小Flash读写操作单元。64kB Flash中有2kB (1k16b) 用于该系列微处理器出厂固化启动引导程序, 即为On Chip kernel (片上内核) , 该段程序空间不能为用户所使用。另外一部分62kB (3116b) 为用户可使用程序段, 该段程序用于存放用户代码, 在IAP方案设计中IAP操作指代对此62kB的Flash/EE操作。
通过对62kB此段用户可使用的Flash/EE做一定的分区规划和操作, 实现IAP固件程序升级。对62kB此段Flash/EE规划如图3所示。从图3中可知, IAP使用将用户可使用的Flash/EE划分为了三个区:Bootloader区, User Application区以及Flag标志区。三个Flash区功能描述如下。
1.Bootloader区:用来存放用户编写的Bootloader代码, 该代码类似于PC机的BIOS (基本输入输出系统) , 一旦固化成功, 该段程序将不再更改, 除非Bootloader代码出现BUG (错误) , 该段程序只能用ISP (在系统编程) 方式通过串口通讯或者JTAG方式写入ADuC702x内部。
2.User Application (用户应用) 区:该区用来存放用户应用程序代码, 用户代码的固化需要有配套的PC机程序通过串口来完成, 该PC机程序需要根据指定的协议和流程编写, 该协议和流程将在下文中给出。
3.Flag标志区:用来存放各个标志, 用户代码程序是否有效标志, 是否进入Bootloader标志 (该标志用来IAP更新应用程序) 。Flag定义如图4所示。
程序启动流程如图5所示。
下文对Bootloader程序、User程序设计以及Flag进行详细的阐述。
BootLoader程序设计及固化
一、BootLoader程序设计
本设计在Keil for ARM集成环境下使用。首先在K e i l软件下新建一个工程, 并选择芯片型号为ADuC702x, 且不拷贝startup文件。然后分别添加对应源文件, 在Keil环境中配置BootLoader程序起始地址为0x00080000, 大小0x5000;SM起始地址为0x00010040, 大小为0x1FC0。
二、Bootloader程序固化
Bootloader固化有两种方式:UART0和JTAG。UART0固化程序参照ADI公司ARMWSD.exe;JTAG下载可以使用ULINK系列仿真器。
Bootloader程序下载需要注意以下两点:
⒈Bootloader程序大小不能超过20kB;
⒉Bootloader程序固化时, 选择“Erase Sectors”, 不要选择“Erase Full Chip”擦除整个存储空间。
用户应用程序设计与固化
一、用户应用程序设计
首先在Keil软件下新建一个工程, 并选择芯片型号为ADuC702x, 且不拷贝startup文件。然后分别添加对应源文件, 在Keil环境中配置用户应用程序起始地址为0x00085000, 大小0 x A 6 0 0;S R A M起始地址为0x00010040, 大小为0x1FC0。
二、用户应用程序固化
用户应用程序固化也有两种方式:UART和JTAG。JTAG下载可以使用ULINK系列仿真器;UART固化程序需要根据通讯协议格式编写PC机程序, 下文中进行具体描述。
用户应用程序下载需要注意以下两点:
1.用户应用程序大小不能超过41.5kB;
2.用户应用程序初始化时, 需要将中断向量表拷贝到SRAM, 然后将其映射到SM, 代码如下:
IAP更新固件应用程序流程
I A P更新固件应用程序均指在程序运行于Bootloader区完成。若第一次只有Bootloader程序, 而没有用户程序时, 程序自动停留在Bootloader区。若程序正运行于用户区情况时, 要求通过串口发送某条命令给MCU (微控制器) , MCU收到指令后, 更新Flash/EE存储器中进入Bootloader标志部分数据, 使之有效, 然后通过软件复位 (通常称之为“热启动”) 使程序从0x00000000位置启动, 按上一节“程序启动过程描述”, 则此时启动后, 程序必定留在Bootloader区。
在Bootloader区时, 可以通过发送“IAP” (“IAP”命令字符由Bootloader代码决定) 命令来更新程序, 当MCU接收到“IAP”命令后, 修改用户程序是否有效标志值为无效, 返回“OK”字符, 然后程序以查询方式接收一个数据包 (标志该数据包为数据包0) , 该数据为接下来将接收到的程序数据包长度信息, 并同时包含校验信息, 数据包0结构如图6所示, 如果正确接收数据, 返回两个字节 (0xED, 0xFA) ;否则返回 (0x12, 0x34) , 并结束IAP命令, 回到Bootloader命令状态。
接下来根据固件程序数据包长度依次接收各个数据包 (标识这些数据包为数据包1、数据包2, , 数据包n, 其中n等于上一个数据包接收到的固件程序数据包长度 (length) ) , 这里每个数据包结构均一样, 结构如图7所示, 数据包由两部分组成, 256B的固件程序数据和两个字节的CRC16校验码, 一个数据包总长度为258B, 在对固件程序打包时, 若包数据不满256B, 那么在包后面添加0xFF, 直至256B。
程序中每接收数据包1~数据包n中任何一个数据包时, 若接收正确, 则返回 (0xED, 0xFA) , 同时将数据写入对应Flash存储单元;否则返回 (0x12, 0x34) , 并结束IAP命令, 回到Bootloader区等待IAP命令状态。若所有数据包接收正确, 而且写入Flash正确, 则修改用户程序有效标志, 并返回 (0xED, 0xFA) , 否则返回 (0x12, 0x34) , 并结束IAP命令, 回到Bootloader区等待IAP命令状态。
待所有数据包接收完毕, 并写F l a s h结束后, 再给M C U发送“REBOOT”热启动命令即可完成固件重新运行。
IAP更新固件应用程序流程如图8所示。
下面描述如何更新U s e r Application固件应用程序。以下所有提到的发送和返回的命令及数据均指十六进制格式, 除非特殊说明。
⒈MCU正常工作, 使用如下命令使MCU回到了Bootloader区
发送: (自定义命令)
返回: (自定义返回)
⒉发送:0x49 0x41 0x50 0x0D
返回:0x49 0x41 0x50 0x0D0x0A 0x4F 0x4B 0x0D 0x0A 0x5C 0x3E
⒊发送数据包0, 数据包0结构如图6所示。
返回 (两个字节) :
(1) 0xED 0xFA (正确接收) , 跳到步骤4;
(2) 0x12 0x34, 错误, 跳到步骤2。
⒋根据数据包0中所包含的固件应用程序数据包长度信息, 发送固件应用程序数据包1~n, 固件应用程序按图9方式打包, 若包不满256B, 则在后面依次填充0xFF。
其中Data为固件应用程序二进制代码, 每个数据包最后是CRC16校验码, 其高位在前。
发送:一个数据包
返回 (两个字节) :
(1) 0xED 0xFA (正确接收) , 跳到步骤5;
(2) 0x12 0x34, 错误, 跳到步骤2。
⒌按步骤4正确发送完所有数据包, 等待修改标志位, 即等待返回 (两个字节) :
(1) 0 x 4 F 0 x 4 B (修改标志位正确) , 跳到步骤6;
(2) 0x58 0x58, 错误, 跳到步骤2。
⒍重新热启动。
发送:REBOOT (ASCII字符)
返回: (无返回内容)
⒎固件应用程序更新完毕。
结语
该在应用更新固件程序方案已广泛应用于以ADuC702x系列微处理器设计的光通讯和其他产品中, 使固件程序升级变得非常简单方便, 并且该方案通过实践验证, 具有非常高的可靠性。
摘要:本文介绍了一种基于ADuC702x的智能仪表在应用编程升级固件程序的方案。该方案已成功应用于光通讯和其他产品中, 使产品的固件程序升级变得简单方便, 且实践验证具有高可靠性。
关键词:ADuC702x,IAP,在应用编程,远程升级
参考文献
[1]ADI半导体.ADuC702x芯片用户手册.http://www.analog.com/
[2]ARM公司.Keil for ARM用户手册.http://www.keil.com/
[3]周永宏, 王成飞, 何志敏.ARM7TDMI-S在嵌入式系统中的Bootloader代码设计.单片机及嵌入式系统应用, 2004 (9)
[4]黄家升.基于IAP的单片机软件远程升级.舰船电子对抗, 2007 (3)
IAP软件范文
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


