《讲述iap功能在实际使用过程中的应用方法以及相关解决方案》由会员分享,可在线阅读,更多相关《讲述iap功能在实际使用过程中的应用方法以及相关解决方案(44页珍藏版)》请在金锄头文库上搜索。
1、IAP及其应用 以LPC2300为例,讲述IAP功能在实际 使用过程中的应用方法以及相关解决方案,产品应用笔记 AN070701,概述 Boot简介 片内Flash存储系统 数据存储解决方案 在线升级解决方案,概述 Boot简介 片内Flash存储系统 数据存储解决方案 在线升级解决方案,IAP(In Appplication Program),即在应用中编程。顾名思义,就是在系统运行的过程中动态编程,对程序执行代码的动态修改。 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处。不过,芯片
3、上电以后,会首先对Boot区执行一次重映射,映射到片内存储器空间的最高处,即接近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程序是Thum
4、b代码,位于地址0x7FFF FFF0。在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,=0x7FFFFFF1 BX R0 代码替代。,在
5、应用编程(IAP),在调用IAP函数时,寄存器R0中的字指针指向存储器(RAM)中包含的命令代码和参数,它作为函数的入口参数,函数执行的返回值保存在寄存器R1中的字指针指向存储器(RAM)中,包含状态代码和结果。,参数表最大数目为5,结果表最大数目为2,#define IAP_LOCATION 0x7FFFFFF1 typedef void (*IAP) (unsigned int , unsigned int ); IAP iap_entry; unsigned long command5; unsigned long result2; iap_entry = (IAP) IAP_LOCAT
6、ION; iap_entry (command , result);,在应用编程(IAP),执行跳转指令时,如果“目的地址”的bit0 = 1,表示处理器需要进行状态切换,由ARM状态切换到Thumb状态,Thumb代码是“半字”对齐格式,即地址 & 0xFFFF FFFE。因此,虽然此处跳转目的地址 = 0x7FFFFFF1,实际上跳转到地址0x7FFFFFF0,同时进行切换到Thumb状态。,在应用编程(IAP),由于IAP是Thumb代码,因此,需要在ADS编译选项中,选中ARM/Thumb Interworking选型,这样ARM和Thumb指令就可以混合编译。,在应用编程(IAP),
7、IAP程序会使用片内RAM空间的顶部32个字节,因此,在支持IAP的场合,用户程序应该避免使用这部分空间。,IAP代码使用,IAP代码使用,小知识:当前程序状态寄存器,ARM内核包含1个当前程序状态寄存器(CPSR)。CPSR反映当前处理器的状态,其包含: 4个条件代码标志(负标志N、零标志Z、进位标志C和溢出标志V ); 2个中断禁止位(IRQ禁止与FIQ禁止); 5个对当前处理器模式进行编码的位(M4:0); 1个用于指示当前执行指令的位(ARM指令还是Thumb指令)。,程序状态寄存器的格式,条件代码标志,保留,控制位,溢出标志,进位或借位扩展,零,负或小于,IRQ禁止,FIQ禁止,状态
8、位,模式位,N,Z,C,V,I,T,F,条件代码标志,各标志位的含义如下: 负标志N:运算结果的第31位值,记录标志设置操作的结果; 零标志Z:如果标志设置的操作为0,则置位; 进位标志C:记录无符号加法溢出,减法无借位,循环移位; 溢出标志V:记录标志设置操作的有符号溢出。,警告:绝对不要强制改变CPSR寄存器中的控制位T。如果这样做,处理器将进入一个无法预测的状态。,控制位,1、中断禁止控制位I和F;,2、处理器状态位T;,3、处理器模式位M0M4。,注意:不是所有模式位的组合都定义了有效的处理器模式,如果将非法值写入M4:0中,处理器将进入一个无法恢复的模式。,保留位,CPSR中的保留位
9、被保留将来使用。当改变CPSR标志和控制位时,请确认没有改变这些保留位。 另外,请确保您的程序不依赖于包含特定值的保留位,因为将来的处理器可能会将这些位设置为1或者0。,在应用编程(IAP),用户可以在启动代码Startup.s文件中的InitStack函数内调整各个模式的堆栈空间位置。,InitStack ;设置系统模式堆栈 MSR CPSR_c, #0xdf LDR SP, =StackUsr 32 MOV PC, R0,IAP的命令表,在应用编程(IAP),IAP各命令返回代码及意义表,概述 Boot简介 片内Flash存储系统 数据存储解决方案 在线升级解决方案,Boot Block
10、不占用片内Flash,在利用IAP代码来操作片内Flash时,必须熟悉片内Flash的扇区分布。片内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系统,
11、概述 Boot简介 片内Flash存储系统 数据存储解决方案 在线升级解决方案,数据存储解决方案,系统概述,通过IAP,用户可以使用片内Flash作为非易失性数据存储器,存储一些设备的配置信息。这样不仅可以节约成本,而且还可以减小线路板的面积。,LPC2364,Flash,Flash,Flash,系统概述,利用IAP将Flash作为数据存储器时,用户需要控制自身代码量的大小及代码定位。绝对不能够出现Flash数据区和Flash代码区重叠的现象。因为在利用IAP向片内Flash存储器写入数据时,需要对数据扇区进行擦除。如果数据区和代码区重合,就有可能会破坏系统的代码空间,造成系统死机或崩溃。,通
12、过IAP向片内Flash的扇区7写入512个字节的数据。,注意:任何Flash都是有寿命的,如果对片内Flash的操作过于频繁,就会对其造成损坏,LPC2300的Flash擦除/写入次数为10万次。,系统概述,使用IAP将SRAM中的数据编程到Flash时,源数据区只能够使用片内局部总线上的SRAM,不能使用通用USB SRAM和以太网SRAM。,片内 SRAM,如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐; 如果一个数据是以能被4整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。,小知识:存储数据的对齐方式,片内Flash编程步骤,擦除操作之前必须
13、先选择扇区,一次可以选择多个扇区,使用IAP之前需要定义的一些常量,写入数据之前要先擦除扇区,已擦除的可不必重复擦,IAP提供数据校验手段,用户不必自己动手校验数据,编程操作之前必须先选择扇区,一次可以选择多个扇区,字对齐的SRAM数据区数据写入到256字节对齐的Flash中,一次写入256、512、1024或4096字节。,片内Flash编程步骤,#define IAP_FCCLK 48000 #define IAP_ENTER_ADR 0x7FFFFFF1 uint32 paramin8; uint32 paramout8;,通过在使用IAP代码之前,需要定义一些常量,如系统时钟、IAP函
14、数入口、IAP入口缓冲区和出口缓冲区等。,确定系统参数,片内Flash编程步骤,uint32 SelSector(uint8 sec1,uint8 sec2) paramin0 = IAP_SELECTOR; paramin1 = sec1; paramin2 = sec2; (*(void(*)()IAP_ENTER_ADR)(paramin,paramout); return(paramout0); ,对某一个扇区执行擦除、写入等操作之前,必须先选择该扇区。但也可以一次选择多个扇区。,选择扇区(可选),片内Flash编程步骤,uint32 EraseSector(uint32 sec1,u
15、int32 sec2) paramin0 = IAP_ERASESECTOR; paramin1 = sec1; paramin2 = sec2; paramin3 = IAP_FCCLK; (*(void(*)()IAP_ENTER_ADR)(paramin,paramout); return(paramout0); ,LPC2300片内Flash在写入数据前需要执行擦除操作。如果目标区域已经被擦除,那么就不必重复擦除,可直接写入数据。擦除操作一次可以擦除多个扇区。,擦除扇区(可选),执行完以上几步后,就可以编程Flash了。执行编程扇区的操作时,IAP函数会将RAM中的数据拷贝到Flash
16、中。,片内Flash编程步骤,uint32 RamToFlash(uint32 dst, uint32 src, uint32 no) 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_COMPARE; paramin1 = dst; paramin2 = src; paramin3 = no; (*(void(*)()IAP_ENTER_ADR)(paramin,paramout); return(paramout0); ,