1 / 44

IAP 及其应用 以 LPC2300 为例,讲述 IAP 功能在实际 使用过程中的应用方法以及相关解决方案

IAP 及其应用 以 LPC2300 为例,讲述 IAP 功能在实际 使用过程中的应用方法以及相关解决方案. 产品应用笔记 AN070701. 概述 Boot 简介 片内 Flash 存储系统 数据存储解决方案 在线升级解决方案. 概述 Boot 简介 片内 Flash 存储系统 数据存储解决方案 在线升级解决方案. 概述. IAP ( In Appplication Program ),即在应用中编程。顾名思义,就是在系统运行的过程中动态编程,对程序执行代码的动态修改。

zelia
Download Presentation

IAP 及其应用 以 LPC2300 为例,讲述 IAP 功能在实际 使用过程中的应用方法以及相关解决方案

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. IAP及其应用以LPC2300为例,讲述IAP功能在实际使用过程中的应用方法以及相关解决方案IAP及其应用以LPC2300为例,讲述IAP功能在实际使用过程中的应用方法以及相关解决方案 产品应用笔记 AN070701

  2. 概述 • Boot简介 • 片内Flash存储系统 • 数据存储解决方案 • 在线升级解决方案

  3. 概述 • Boot简介 • 片内Flash存储系统 • 数据存储解决方案 • 在线升级解决方案

  4. 概述 IAP(InAppplicationProgram),即在应用中编程。顾名思义,就是在系统运行的过程中动态编程,对程序执行代码的动态修改。 IAP技术应用于嵌入式系统的数据存储和在线升级。例如在程序运行工程中产生4k字节数据表,为了避免占用SRAM空间,用户可以使用IAP技术将此表写入片内Flash。又如用户在开发完一个系统后要增加新的软件功能,可以使用IAP技术在线升级程序,避免重新拆装设备。

  5. 概述 • Boot简介 • 片内Flash存储系统 • 数据存储解决方案 • 在线升级解决方案

  6. Boot简介 LPC2300系列处理器在出厂时,由厂家在片内固化了一段Boot代码。Boot装载程序控制芯片复位后的初始化操作,并提供对Flash编程的方法。Boot程序可以对芯片进行擦除、编程。 • 在系统编程(ISP) • 在应用编程(IAP)

  7. 2.0GB 0x7FFF FFFF 0x7FFF E000 片内静态RAM 1.0GB 0x4000 0000 0x0007 FFFF 8KB Boot Block 0x0007 E000 片内Flash 0x0000 003F 异常向量表 0.0GB 0x0000 0000 • Boot重映射 Boot区位于地址0x0007 E000~0x0007 FFFF处。不过,芯片上电以后,会首先对Boot区执行一次重映射,映射到片内存储器空间的最高处,即接近2G(0x8000 0000)的地方。 Boot装载程序提供了ISP和IAP编程接口,可以实现对片内Flash存储器的编程。 8KB Boot Block 重映射 地址重映射

  8. 控制器 RAM ARM7 处理器核 JTAG FLASH 外设 串口 Boot Block UART0 • 在系统编程(ISP) 在系统编程是通过Boot装载程序和UART0对片内Flash存储器进行擦除/编程的方法。 CPU运行Boot代码 ARM7 处理器核 通过ISP对Flash编程 UART0

  9. 控制器 RAM ARM7 处理器核 JTAG FLASH 外设 Boot Block UART0 • 在应用编程(IAP) 在应用编程是用户的应用代码对片内Flash存储器进行擦除/编程的方法。 通过各种途径获取用户代码 CPU运行Boot代码 ARM7 处理器核 通过IAP对Flash编程

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

  11. ARM寄存器 命令参数表 命令结果表 R0 R1 命令代码 参数1 …… 参数n 状态代码 结果1 …… 结果n • 在应用编程(IAP) 在调用IAP函数时,寄存器R0中的字指针指向存储器(RAM)中包含的命令代码和参数,它作为函数的入口参数,函数执行的返回值保存在寄存器R1中的字指针指向存储器(RAM)中,包含状态代码和结果。 结果表最大数目为2 参数表最大数目为5

  12. IAP程序入口 定义函数类型指针 定义函数指针 IAP命令表 设置函数指针 调用IAP IAP返回值 • 在应用编程(IAP) #define IAP_LOCATION 0x7FFFFFF1 typedef void (*IAP) (unsigned int [ ] , unsigned int [ ]); …… IAP iap_entry; unsigned long command[5]; unsigned long result[2]; iap_entry = (IAP) IAP_LOCATION; iap_entry (command , result); 执行跳转指令时,如果“目的地址”的bit0 = 1,表示处理器需要进行状态切换,由ARM状态切换到Thumb状态,Thumb代码是“半字”对齐格式,即地址 & 0xFFFF FFFE。因此,虽然此处跳转目的地址 = 0x7FFFFFF1,实际上跳转到地址0x7FFFFFF0,同时进行切换到Thumb状态。

  13. 在应用编程(IAP) 由于IAP是Thumb代码,因此,需要在ADS编译选项中,选中ARM/Thumb Interworking选型,这样ARM和Thumb指令就可以混合编译。

  14. 0x7FFF FFFF 0x7FFF FFFF 8KB Boot Block 重映射 8KB Boot Block 重映射 0x7FFF E000 0x7FFF E000 0x4000 7FFF 0x4000 1FFF 0x4000 1FE0 0x4000 7FE0 顶部32字节 顶部32字节 8KB片内静态RAM 32KB片内静态RAM 0x4000 0000 0x4000 0000 片内Flash 片内Flash 0x0000 003F 0x0000 003F 异常向量表 异常向量表 0x0000 0000 0x0000 0000 LPC2364 LPC2366/68/78 • 在应用编程(IAP) IAP程序会使用片内RAM空间的顶部32个字节,因此,在支持IAP的场合,用户程序应该避免使用这部分空间。 IAP代码使用 IAP代码使用

  15. 小知识:当前程序状态寄存器 • ARM内核包含1个当前程序状态寄存器(CPSR)。CPSR反映当前处理器的状态,其包含: • 4个条件代码标志(负标志N、零标志Z、进位标志C和溢出标志V ); • 2个中断禁止位(IRQ禁止与FIQ禁止); • 5个对当前处理器模式进行编码的位(M[4:0]); • 1个用于指示当前执行指令的位(ARM指令还是Thumb指令)。

  16. M4 M3 M2 M1 M0 N Z C V — — . . . — I F T M4 M3 M2 M1 M0 31 30 29 28 27 26 8 7 6 5 4 3 2 1 0 • 程序状态寄存器的格式 条件代码标志 保留 控制位 N Z C V I F T 溢出标志 进位或借位扩展 模式位 状态位 零 FIQ禁止 负或小于 IRQ禁止

  17. 条件代码标志 • 各标志位的含义如下: • 负标志N:运算结果的第31位值,记录标志设置操作的结果; • 零标志Z:如果标志设置的操作为0,则置位; • 进位标志C:记录无符号加法溢出,减法无借位,循环移位; • 溢出标志V:记录标志设置操作的有符号溢出。

  18. 当控制位I置位时,IRQ中断被禁止; • 当控制位T置位时,处理器正在Thumb状态下运行; • 当控制位F置位时,FIQ中断被禁止。 • 当控制位T清零时,处理器正在ARM状态下运行。 • 控制位 3、处理器模式位M0~M4。 2、处理器状态位T; 1、中断禁止控制位I和F; 警告:绝对不要强制改变CPSR寄存器中的控制位T。如果这样做,处理器将进入一个无法预测的状态。 注意:不是所有模式位的组合都定义了有效的处理器模式,如果将非法值写入M[4:0]中,处理器将进入一个无法恢复的模式。

  19. 保留位 CPSR中的保留位被保留将来使用。当改变CPSR标志和控制位时,请确认没有改变这些保留位。 另外,请确保您的程序不依赖于包含特定值的保留位,因为将来的处理器可能会将这些位设置为1或者0。

  20. 避免使用片内RAM 的顶部32个字节 …… 7 6 5 4 3 2 1 0 …… 7 6 5 4 3 2 1 0 …… M4 I F T M3 M2 M1 M0 系统模式 …… 1 1 1 0 1 1 1 1 ARM状态 IRQ禁止 FIQ禁止 • 在应用编程(IAP) 用户可以在启动代码Startup.s文件中的InitStack函数内调整各个模式的堆栈空间位置。 InitStack …… ;设置系统模式堆栈 MSR CPSR_c, #0xdf LDR SP, =StackUsr – 32 MOV PC, R0

  21. 在应用编程(IAP) IAP的命令表

  22. IAP各命令返回代码及意义表

  23. 概述 • Boot简介 • 片内Flash存储系统 • 数据存储解决方案 • 在线升级解决方案

  24. …… …… …… 0x0003 FFFF 扇区14(32K) 0x0003 8000 0x0001 FFFF 扇区10(32K) 0x0001 8000 存储器空间 存储器空间 扇区8(32K) 0x0007 FFFF 0x0007 FFFF 0x0000 8000 Boot Block(8KB) Boot Block(8KB) 扇区7(4K) 0x0007 E000 0x0007 E000 0x0000 7000 用户Flash (504KB) 扇区0(4K) 0x0000 0000 用户Flash (128/256KB) 0x0000 0000 0x0000 0000 (LPC2364/66) (LPC2368/78) 扇区分布 片内Flash系统 在利用IAP代码来操作片内Flash时,必须熟悉片内Flash的扇区分布。片内Flash的操作是以“扇区”为单位进行的,每个“扇区”的大小不定。 由于IAP代码位于Boot区内,所以IAP命令不允许对Boot扇区执行写/擦除操作。 片内256KB Flash 片内512KB Flash Boot Block 不占用片内Flash 片内128KB Flash 用户Flash (128/256KB)

  25. …… …… …… 0x0007 DFFF 扇区27(4K) 0x0007 D000 存储器空间 扇区22(4K) 0x0007 FFFF 0x0007 8000 Boot Block(8KB) 0x0007 E000 扇区21(32K) 0x0007 0000 用户Flash (504KB) 扇区8(32K) 0x0000 8000 扇区7(4K) 0x0000 7000 0x0000 0000 (LPC2368/78) 扇区0(4K) 0x0000 0000 扇区分布 片内Flash系统 对于LPC2368/78来说,Boot区位于512kB Flash的顶部,因此在LPC2368/78器件中,只有504kB Flash可供用户使用。 用户Flash (504KB)

  26. 概述 • Boot简介 • 片内Flash存储系统 • 数据存储解决方案 • 在线升级解决方案

  27. 数据存储解决方案 • 系统概述 通过IAP,用户可以使用片内Flash作为非易失性数据存储器,存储一些设备的配置信息。这样不仅可以节约成本,而且还可以减小线路板的面积。 LPC2364 Flash Flash Flash

  28. 系统概述 利用IAP将Flash作为数据存储器时,用户需要控制自身代码量的大小及代码定位。绝对不能够出现Flash数据区和Flash代码区重叠的现象。因为在利用IAP向片内Flash存储器写入数据时,需要对数据扇区进行擦除。如果数据区和代码区重合,就有可能会破坏系统的代码空间,造成系统死机或崩溃。 注意:任何Flash都是有寿命的,如果对片内Flash的操作过于频繁,就会对其造成损坏,LPC2300的Flash擦除/写入次数为10万次。 通过IAP向片内Flash的扇区7写入512个字节的数据。

  29. 片内 Flash ARM7TDMI 局部总线 AHB2 AHB1 AHB 桥 AHB 桥 8k SRAM 4k SRAM USB控制器 16k SRAM • 系统概述 使用IAP将SRAM中的数据编程到Flash时,源数据区只能够使用片内局部总线上的SRAM,不能使用通用USB SRAM和以太网SRAM。 片内 SRAM

  30. 小知识:存储数据的对齐方式 如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐; 如果一个数据是以能被4整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。

  31. 确定系统参数 选择扇区(可选) 擦除扇区(可选) 选择扇区 编程扇区 校验数据(可选) • 片内Flash编程步骤 使用IAP之前需要定义的一些常量 擦除操作之前必须先选择扇区,一次可以选择多个扇区 写入数据之前要先擦除扇区,已擦除的可不必重复擦 编程操作之前必须先选择扇区,一次可以选择多个扇区 字对齐的SRAM数据区数据写入到256字节对齐的Flash中,一次写入256、512、1024或4096字节。 IAP提供数据校验手段,用户不必自己动手校验数据

  32. IAP入口地址定义 定义CCLK值大小, 单位为KHz 确定系统参数 选择扇区(可选) 擦除扇区(可选) 选择扇区 IAP入口参数缓冲区 IAP出口参数缓冲区 编程扇区 校验数据(可选) • 片内Flash编程步骤 通过在使用IAP代码之前,需要定义一些常量,如系统时钟、IAP函数入口、IAP入口缓冲区和出口缓冲区等。 确定系统参数 #define IAP_FCCLK 48000 #define IAP_ENTER_ADR 0x7FFFFFF1 uint32 paramin[8]; uint32 paramout[8];

  33. 返回操作状态码 确定系统参数 选择扇区(可选) 擦除扇区(可选) 设置扇区选择命令字 选择扇区 调用IAP服务程序 设置起始扇区 设置终止扇区 编程扇区 校验数据(可选) • 片内Flash编程步骤 对某一个扇区执行擦除、写入等操作之前,必须先选择该扇区。但也可以一次选择多个扇区。 uint32 SelSector(uint8 sec1,uint8 sec2) { paramin[0] = IAP_SELECTOR; paramin[1] = sec1; paramin[2] = sec2; (*(void(*)())IAP_ENTER_ADR)(paramin,paramout); return(paramout[0]); } 选择扇区(可选)

  34. 返回操作状态码 确定系统参数 选择扇区(可选) 擦除扇区(可选) 设置扇区擦除命令字 选择扇区 调用IAP服务程序 设置起始扇区 设置终止扇区 编程扇区 校验数据(可选) • 片内Flash编程步骤 LPC2300片内Flash在写入数据前需要执行擦除操作。如果目标区域已经被擦除,那么就不必重复擦除,可直接写入数据。擦除操作一次可以擦除多个扇区。 uint32 EraseSector(uint32 sec1,uint32 sec2) { paramin[0] = IAP_ERASESECTOR; paramin[1] = sec1; paramin[2] = sec2; paramin[3] = IAP_FCCLK; (*(void(*)())IAP_ENTER_ADR)(paramin,paramout); return(paramout[0]); } 擦除扇区(可选)

  35. 返回操作状态码 确定系统参数 选择扇区(可选) 擦除扇区(可选) 设置扇区编程命令字 设置复制字节数 256/512/1024/4096 选择扇区 调用IAP服务程序 设置Flash目标地址 设置SRAM源地址 编程扇区 校验数据(可选) • 片内Flash编程步骤 执行完以上几步后,就可以编程Flash了。执行编程扇区的操作时,IAP函数会将RAM中的数据拷贝到Flash中。 uint32 RamToFlash(uint32 dst, uint32 src, uint32 no) { paramin[0] = IAP_RAMTOFLASH; paramin[1] = dst; paramin[2] = src; paramin[3] = no; paramin[4] = IAP_FCCLK; (*(void(*)())IAP_ENTER_ADR)(paramin,paramout); return(paramout[0]); } 编程扇区

  36. 返回操作状态码 确定系统参数 选择扇区(可选) 擦除扇区(可选) 设置数据比较命令字 比较字节个数 必须能被4整除 选择扇区 调用IAP服务程序 设置目标地址 设置源地址 编程扇区 校验数据(可选) • 片内Flash编程步骤 IAP代码还为用户提供了一个数据校验的手段,这样用户就可以不必自己动手来校验写入Flash中的数据是否正确。 uint32 Compare(uint32 dst, uint32 src, uint32 no) { paramin[0] = IAP_COMPARE; paramin[1] = dst; paramin[2] = src; paramin[3] = no; (*(void(*)())IAP_ENTER_ADR)(paramin,paramout); return(paramout[0]); } 校验数据(可选)

  37. 擦除后的Flash区域 扇区7的起始地址 选择扇区7 擦除扇区7 选择扇区7 初始化变量区数据 以字对齐定义变量区 写入数据到Flash 编程后的Flash区域 • 函数主体 向扇区7写入512个字节的数据,扇区7可以作为一个E2PROM来使用,如存储一些系统的配置信息。 #define DestAddr 0x00007000 int main (void) { __align(4) uint8 SendData[512]; uint32 i; for(i = 0; i < 512; i++) { SendData[i] = i; } SelSector(7, 7); EraseSector(7,7); SelSector(7, 7); RamToFlash(DestAddr, (uint32)SendData, 512); while(1); }

  38. 概述 • Boot简介 • 片内Flash存储系统 • 数据存储解决方案 • 在线升级解决方案

  39. 在线升级解决方案 • 系统概述 “在线升级”实际上是Flash数据存储的一个应用特例。系统开发完毕后,在应用过程中,如果需要增加部分功能,那么为了避免重新拆装设备,可以借助“在线升级”方式。 目前,在线升级是很多系统都必需的一个功能,对于LPC2300来说,利用IAP函数即可实现在线升级。用户程序接收新的代码,然后调用IAP函数将新的代码编程到Flash扇区中,实现在线升级。 系统通过串口接收升级代码,然后调用IAP函数实现在线升级。为了实现在线升级,本系统将芯片的片内Flash重新分区: • 程序标志区:标记当前用户程序运行的区,程序标志区的首地址为:0x0000 4000。对于这个区间,仅仅使用了前4个字节,用来保存当前用户代码区的首地址。如程序标志= 0x0000 8000,则当前程序运行在LOW区;如程序标志 = 0x0001 0000,则当前程序运行在HIGH区;如程序标志为其它值,则当前程序运行在固件区域。 • Boot代码区:又叫固件区,存放系统的BootLoader,可完成代码升级,首地址位于0x0000 0000; • LOW区和HIGH区:用户代码分为两个区,LOW区和HIGH区,当程序位于LOW区时,可以对HIGH区进行升级。反之,如果程序位于HIGH区,可以对LOW区进行升级。LOW区的首地址为:0x0000 8000,HIGH区的首地址为:0x0001 0000,每个用户代码区的容量为32kB;

  40. HIGH区 RAM ARM7 处理器核 0x0001 0000 LOW区 FLASH UART0 0x0000 8000 程序标志区 0x0000 4000 用户Boot区 0x0000 0000 串口 P0.6 • 升级HIGH区代码 CPU运行HIGH区的用户代码 通过IAP对Flash编程 复位后CPU运行用户Boot代码 修改程序标志,标识程序运行在高区 程序运行在LOW区 ARM7 处理器核 ARM7 处理器核 串口接收升级代码 0x0001 0000 0x0000 8000 UART0 此处为用户编写的Boot代码,有别于由芯片厂商固化在片内的Boot代码。 P0.6处于低电平

  41. 系统复位 初始化串口; 根据程序标志发送提示信息; 清空数据缓冲区; N 引脚P0.6为低? Y 接收串口数据 Y 将新的用户代码编程到LOW区 用户代码运行在HIGH区? N Y 用户代码运行在LOW区? 将新的用户代码编程到HIGH区 N 更新用户程序标志区 根据用户程序标志运行程序 • 软件设计

  42. “在线升级”模板 • 为了实现在线升级,我们专门设计了一套新的模板。该模板具有两个编译选项:HIGH和LOW。 • 当需要升级HIGH区时,就使用HIGH选项进行编译,用户代码位于HIGH区; • 当需要升级LOW区时,就使用LOW选项进行编译,用户代码位于LOW区。 编译选项及其位置 位于系统Boot代码区,用户不能随便修改 用户程序代码编写区,代码量不得超过16K

  43. 升级方法 使用“在线升级模板”建立工程,编译以后产生树状的文件结构。LOW和HIGH选项都会生成两个二进制文件SYSTEM和USER。 当前程序运行在LOW区,那么只能升级HIGH区。系统复位后,将P0.6接地,使用串口终端软件将HIGH选项编译生成的USER文件发送给系统即可。 当前程序运行在HIGH区,那么只能升级LOW区。系统复位后,将P0.6接地,使用串口终端软件将LOW选项编译生成的USER文件发送给系统即可。 LOW选项编译结果 HIGH选项编译结果

  44. 总结 “在线升级”解决方案并不是唯一的,本方案使用UART0进行升级,当然也可以使用其它的手段进行升级,而且片内Flash的分区方式也不是唯一的,因此本方案并不是唯一的解决方法。 在ADS编译器中,通过“分散加载文件”可以实现代码定位,有关“分散加载文件”和“ADS编译器”方面的介绍请参考其它相关书籍。

More Related