收藏 分享(赏)

iap及其应用以lpc2300为例-讲述iap功能在实际使用过程中的应用.ppt

上传人:无敌 文档编号:307336 上传时间:2018-03-27 格式:PPT 页数:44 大小:911.52KB
下载 相关 举报
iap及其应用以lpc2300为例-讲述iap功能在实际使用过程中的应用.ppt_第1页
第1页 / 共44页
iap及其应用以lpc2300为例-讲述iap功能在实际使用过程中的应用.ppt_第2页
第2页 / 共44页
iap及其应用以lpc2300为例-讲述iap功能在实际使用过程中的应用.ppt_第3页
第3页 / 共44页
iap及其应用以lpc2300为例-讲述iap功能在实际使用过程中的应用.ppt_第4页
第4页 / 共44页
iap及其应用以lpc2300为例-讲述iap功能在实际使用过程中的应用.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、IAP及其应用以LPC2300为例,讲述IAP功能在实际使用过程中的应用方法以及相关解决方案,产品应用笔记 AN070701,概述Boot简介片内Flash存储系统数据存储解决方案在线升级解决方案,概述Boot简介片内Flash存储系统数据存储解决方案在线升级解决方案,IAP(InAppplicationProgram),即在应用中编程。顾名思义,就是在系统运行的过程中动态编程,对程序执行代码的动态修改。 IAP技术应用于嵌入式系统的数据存储和在线升级。例如在程序运行工程中产生4k字节数据表,为了避免占用SRAM空间,用户可以使用IAP技术将此表写入片内Flash。又如用户在开发完一个系统后要

2、增加新的软件功能,可以使用IAP技术在线升级程序,避免重新拆装设备。,概述,概述Boot简介片内Flash存储系统数据存储解决方案在线升级解决方案,LPC2300系列处理器在出厂时,由厂家在片内固化了一段Boot代码。Boot装载程序控制芯片复位后的初始化操作,并提供对Flash编程的方法。Boot程序可以对芯片进行擦除、编程。,在系统编程(ISP)在应用编程(IAP),Boot简介,Boot重映射,Boot装载程序提供了ISP和IAP编程接口,可以实现对片内Flash存储器的编程。,Boot区位于地址0x0007 E0000x0007 FFFF处。不过,芯片上电以后,会首先对Boot区执行一

3、次重映射,映射到片内存储器空间的最高处,即接近2G(0x8000 0000)的地方。,8KB Boot Block 重映射,地址重映射,在系统编程(ISP),在系统编程是通过Boot装载程序和UART0对片内Flash存储器进行擦除/编程的方法。,UART0,ARM7处理器核,CPU运行Boot代码,通过ISP对Flash编程,在应用编程(IAP),在应用编程是用户的应用代码对片内Flash存储器进行擦除/编程的方法。,ARM7处理器核,CPU运行Boot代码,通过各种途径获取用户代码,通过IAP对Flash编程,在应用编程(IAP),IAP程序是Thumb代码,位于地址0x7FFF FFF0

4、。在ARM系统中实现状态转换的指令是“BX Addr”,目标地址Addr的最低位(bit0)仅来确定最终状态,实际的“目的地址= Addr & 0xFFFF FFFE”。在调用IAP函数时,不仅要实现跳转而且还要完成状态转换。,0x7FFF FFF0,ARM代码,Thumb代码,0x7FFF FFF1 & 0x7FFF FFFE,BX 0x7FFF FFF1,IAP程序入口,Bit0=1使处理器切换到Thumb状态,ARM状态字对齐,Thumb状态半字对齐,注意:此为示意代码,实际编程中请用LDR R0,=0x7FFFFFF1BX R0代码替代。,在应用编程(IAP),在调用IAP函数时,寄存

5、器R0中的字指针指向存储器(RAM)中包含的命令代码和参数,它作为函数的入口参数,函数执行的返回值保存在寄存器R1中的字指针指向存储器(RAM)中,包含状态代码和结果。,参数表最大数目为5,结果表最大数目为2,#defineIAP_LOCATION0x7FFFFFF1typedefvoid (*IAP) (unsigned int , unsigned int );IAP iap_entry;unsigned long command5;unsigned long result2;iap_entry = (IAP) IAP_LOCATION;iap_entry (command , resul

6、t);,在应用编程(IAP),执行跳转指令时,如果“目的地址”的bit0 = 1,表示处理器需要进行状态切换,由ARM状态切换到Thumb状态,Thumb代码是“半字”对齐格式,即地址 & 0xFFFF FFFE。因此,虽然此处跳转目的地址 = 0x7FFFFFF1,实际上跳转到地址0x7FFFFFF0,同时进行切换到Thumb状态。,在应用编程(IAP),由于IAP是Thumb代码,因此,需要在ADS编译选项中,选中ARM/Thumb Interworking选型,这样ARM和Thumb指令就可以混合编译。,在应用编程(IAP),IAP程序会使用片内RAM空间的顶部32个字节,因此,在支持I

7、AP的场合,用户程序应该避免使用这部分空间。,IAP代码使用,IAP代码使用,小知识:当前程序状态寄存器,ARM内核包含1个当前程序状态寄存器(CPSR)。CPSR反映当前处理器的状态,其包含:4个条件代码标志(负标志N、零标志Z、进位标志C和溢出标志V );2个中断禁止位(IRQ禁止与FIQ禁止);5个对当前处理器模式进行编码的位(M4:0);1个用于指示当前执行指令的位(ARM指令还是Thumb指令)。,程序状态寄存器的格式,条件代码标志,保留,控制位,溢出标志,进位或借位扩展,零,负或小于,IRQ禁止,FIQ禁止,状态位,模式位,N,Z,C,V,I,T,F,条件代码标志,各标志位的含义如

8、下:负标志N:运算结果的第31位值,记录标志设置操作的结果;零标志Z:如果标志设置的操作为0,则置位;进位标志C:记录无符号加法溢出,减法无借位,循环移位;溢出标志V:记录标志设置操作的有符号溢出。,警告:绝对不要强制改变CPSR寄存器中的控制位T。如果这样做,处理器将进入一个无法预测的状态。,控制位,1、中断禁止控制位I和F;,2、处理器状态位T;,3、处理器模式位M0M4。,注意:不是所有模式位的组合都定义了有效的处理器模式,如果将非法值写入M4:0中,处理器将进入一个无法恢复的模式。,保留位,CPSR中的保留位被保留将来使用。当改变CPSR标志和控制位时,请确认没有改变这些保留位。 另外

9、,请确保您的程序不依赖于包含特定值的保留位,因为将来的处理器可能会将这些位设置为1或者0。,在应用编程(IAP),用户可以在启动代码Startup.s文件中的InitStack函数内调整各个模式的堆栈空间位置。,InitStack ;设置系统模式堆栈MSRCPSR_c, #0xdfLDRSP, =StackUsr 32MOVPC, R0,IAP的命令表,在应用编程(IAP),IAP各命令返回代码及意义表,概述Boot简介片内Flash存储系统数据存储解决方案在线升级解决方案,Boot Block 不占用片内Flash,在利用IAP代码来操作片内Flash时,必须熟悉片内Flash的扇区分布。片

10、内Flash的操作是以“扇区”为单位进行的,每个“扇区”的大小不定。 由于IAP代码位于Boot区内,所以IAP命令不允许对Boot扇区执行写/擦除操作。,片内512KB Flash,用户Flash(128/256KB),片内256KB Flash,片内128KB Flash,片内Flash系统,对于LPC2368/78来说,Boot区位于512kB Flash的顶部,因此在LPC2368/78器件中,只有504kB Flash可供用户使用。,用户Flash(504KB),片内Flash系统,概述Boot简介片内Flash存储系统数据存储解决方案在线升级解决方案,数据存储解决方案,系统概述,通

11、过IAP,用户可以使用片内Flash作为非易失性数据存储器,存储一些设备的配置信息。这样不仅可以节约成本,而且还可以减小线路板的面积。,LPC2364,Flash,Flash,Flash,系统概述,利用IAP将Flash作为数据存储器时,用户需要控制自身代码量的大小及代码定位。绝对不能够出现Flash数据区和Flash代码区重叠的现象。因为在利用IAP向片内Flash存储器写入数据时,需要对数据扇区进行擦除。如果数据区和代码区重合,就有可能会破坏系统的代码空间,造成系统死机或崩溃。,通过IAP向片内Flash的扇区7写入512个字节的数据。,注意:任何Flash都是有寿命的,如果对片内Flas

12、h的操作过于频繁,就会对其造成损坏,LPC2300的Flash擦除/写入次数为10万次。,系统概述,使用IAP将SRAM中的数据编程到Flash时,源数据区只能够使用片内局部总线上的SRAM,不能使用通用USB SRAM和以太网SRAM。,片内SRAM,如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐; 如果一个数据是以能被4整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。,小知识:存储数据的对齐方式,片内Flash编程步骤,擦除操作之前必须先选择扇区,一次可以选择多个扇区,使用IAP之前需要定义的一些常量,写入数据之前要先擦除扇区,已擦除的可不必重复

13、擦,IAP提供数据校验手段,用户不必自己动手校验数据,编程操作之前必须先选择扇区,一次可以选择多个扇区,字对齐的SRAM数据区数据写入到256字节对齐的Flash中,一次写入256、512、1024或4096字节。,片内Flash编程步骤,#defineIAP_FCCLK48000#define IAP_ENTER_ADR0x7FFFFFF1 uint32paramin8;uint32paramout8;,通过在使用IAP代码之前,需要定义一些常量,如系统时钟、IAP函数入口、IAP入口缓冲区和出口缓冲区等。,确定系统参数,片内Flash编程步骤,uint32 SelSector(uint8

14、sec1,uint8 sec2) paramin0 = IAP_SELECTOR; paramin1 = sec1; paramin2 = sec2; (*(void(*)()IAP_ENTER_ADR)(paramin,paramout); return(paramout0);,对某一个扇区执行擦除、写入等操作之前,必须先选择该扇区。但也可以一次选择多个扇区。,选择扇区(可选),片内Flash编程步骤,uint32 EraseSector(uint32 sec1,uint32 sec2) paramin0 = IAP_ERASESECTOR; paramin1 = sec1; paramin

15、2 = sec2; paramin3 = IAP_FCCLK; (*(void(*)()IAP_ENTER_ADR)(paramin,paramout); return(paramout0);,LPC2300片内Flash在写入数据前需要执行擦除操作。如果目标区域已经被擦除,那么就不必重复擦除,可直接写入数据。擦除操作一次可以擦除多个扇区。,擦除扇区(可选),执行完以上几步后,就可以编程Flash了。执行编程扇区的操作时,IAP函数会将RAM中的数据拷贝到Flash中。,片内Flash编程步骤,uint32 RamToFlash(uint32 dst, uint32 src, uint32 n

16、o) paramin0 = IAP_RAMTOFLASH; paramin1 = dst; paramin2 = src; paramin3 = no; paramin4 = IAP_FCCLK; (*(void(*)()IAP_ENTER_ADR)(paramin,paramout); return(paramout0);,编程扇区,IAP代码还为用户提供了一个数据校验的手段,这样用户就可以不必自己动手来校验写入Flash中的数据是否正确。,片内Flash编程步骤,uint32 Compare(uint32 dst, uint32 src, uint32 no) paramin0 = IAP

17、_COMPARE; paramin1 = dst; paramin2 = src; paramin3 = no; (*(void(*)()IAP_ENTER_ADR)(paramin,paramout); return(paramout0);,校验数据(可选),向扇区7写入512个字节的数据,扇区7可以作为一个E2PROM来使用,如存储一些系统的配置信息。,函数主体,#defineDestAddr0x00007000 int main (void) _align(4) uint8 SendData512; uint32 i; for(i = 0; i 512; i+) SendDatai =

18、i; SelSector(7, 7); EraseSector(7,7); SelSector(7, 7); RamToFlash(DestAddr, (uint32)SendData, 512); while(1); ,编程后的Flash区域,擦除后的Flash区域,概述Boot简介片内Flash存储系统数据存储解决方案在线升级解决方案,在线升级解决方案,系统概述,“在线升级”实际上是Flash数据存储的一个应用特例。系统开发完毕后,在应用过程中,如果需要增加部分功能,那么为了避免重新拆装设备,可以借助“在线升级”方式。 目前,在线升级是很多系统都必需的一个功能,对于LPC2300来说,利用

19、IAP函数即可实现在线升级。用户程序接收新的代码,然后调用IAP函数将新的代码编程到Flash扇区中,实现在线升级。,系统通过串口接收升级代码,然后调用IAP函数实现在线升级。为了实现在线升级,本系统将芯片的片内Flash重新分区:,Boot代码区:又叫固件区,存放系统的BootLoader,可完成代码升级,首地址位于0x0000 0000;,LOW区和HIGH区:用户代码分为两个区,LOW区和HIGH区,当程序位于LOW区时,可以对HIGH区进行升级。反之,如果程序位于HIGH区,可以对LOW区进行升级。LOW区的首地址为:0x0000 8000,HIGH区的首地址为:0x0001 0000

20、,每个用户代码区的容量为32kB;,程序标志区:标记当前用户程序运行的区,程序标志区的首地址为:0x0000 4000。对于这个区间,仅仅使用了前4个字节,用来保存当前用户代码区的首地址。如程序标志 0x0000 8000,则当前程序运行在LOW区;如程序标志 = 0x0001 0000,则当前程序运行在HIGH区;如程序标志为其它值,则当前程序运行在固件区域。,升级HIGH区代码,UART0,通过IAP对Flash编程,ARM7处理器核,0x0001 0000,0x0000 8000,程序运行在LOW区,P0.6处于低电平,串口接收升级代码,修改程序标志,标识程序运行在高区,CPU运行HIG

21、H区的用户代码,ARM7处理器核,此处为用户编写的Boot代码,有别于由芯片厂商固化在片内的Boot代码。,复位后CPU运行用户Boot代码,软件设计,“在线升级”模板,为了实现在线升级,我们专门设计了一套新的模板。该模板具有两个编译选项:HIGH和LOW。当需要升级HIGH区时,就使用HIGH选项进行编译,用户代码位于HIGH区;当需要升级LOW区时,就使用LOW选项进行编译,用户代码位于LOW区。,编译选项及其位置,用户程序代码编写区,代码量不得超过16K,位于系统Boot代码区,用户不能随便修改,升级方法,使用“在线升级模板”建立工程,编译以后产生树状的文件结构。LOW和HIGH选项都会

22、生成两个二进制文件SYSTEM和USER。,LOW选项编译结果,HIGH选项编译结果,当前程序运行在LOW区,那么只能升级HIGH区。系统复位后,将P0.6接地,使用串口终端软件将HIGH选项编译生成的USER文件发送给系统即可。,当前程序运行在HIGH区,那么只能升级LOW区。系统复位后,将P0.6接地,使用串口终端软件将LOW选项编译生成的USER文件发送给系统即可。,总结,“在线升级”解决方案并不是唯一的,本方案使用UART0进行升级,当然也可以使用其它的手段进行升级,而且片内Flash的分区方式也不是唯一的,因此本方案并不是唯一的解决方法。 在ADS编译器中,通过“分散加载文件”可以实现代码定位,有关“分散加载文件”和“ADS编译器”方面的介绍请参考其它相关书籍。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报