IAP及其应用以LPC为例讲述IAP功能在实际使用过程(可编辑).doc
IAP及其应用以LPC为例讲述IAP功能在实际使用过程 产品应用笔记 AN070701IAP 及 其 应 用以LPC2300 为 例 , 讲 述IAP 功 能 在 实 际使 用 过 程 中 的 应 用 方 法 以 及 相 关 解 决 方 案概 述?Boot 简 介片 内Flash 存 储 系 统数 据 存 储 解 决 方 案在 线 升 级 解 决 方 案? 概 述?Boot 简 介片 内Flash 存 储 系 统数 据 存 储 解 决 方 案在 线 升 级 解 决 方 案概 述IAP(In Appplication Program),即在应用中编程。顾名思义,就是在系统运行的过程中动态编程,对程序执行代码的动态修改。 IAP技术应用于嵌入式系统的数据存储和在线升级。例如在程序运行工程中产生4k字节数据表,为了避免占用SRAM空间,用户可以使用IAP技术将此表写入片内Flash。又如用户在开发完一个系统后要增加新的软件功能,可以使用IAP技术在线升级程序,避免重新拆装设备。? 概 述?Boot 简 介片 内Flash 存 储 系 统数 据 存 储 解 决 方 案在 线 升 级 解 决 方 案Boot 简 介LPC2300系列处理器在出厂时,由厂家在片内固化了一段Boot代码。Boot装载程序控制芯片复位后的初始化操作,并提供对Flash编程的方法。Boot程序可以对芯片进行擦除、编程。?在系统编程(ISP)?在应用编程(IAP)? Boot 重 映 射Boot区位于地址0x0007 E0000x0007 FFFFBoot装载程序提供了ISP和IAP编程接口,可以处。不过,芯片上电以后,会首先对Boot区执行实现对片内Flash存储器的编程。一次重映射,映射到片内存储器空间的最高处,即接近2G(0x8000 0000)的地方。 2.0GB0x7FFF FFFF8 K B Boot Block 重映射0x7FFF E000地址重映射片内静态RAM1.0GB0x4000 00000x0007 FFFF8 K B Boot Block0x0007 E000片内Flash0x0000 003F异常向量表0.0GB0x0000 0000? 在 系 统 编 程 (ISP )在系统编程是通过Boot装载程序和UART0对片内Flash存储器进行擦除/编程的方法。CPU运行控制器 RAMBoot代码A AR RM M7 7JTAG处 处理 理器 器核 核通过ISP对FLASH外设Flash编程BootU UA AR RT0 T0 Block串口? 在 应 用 编 程 (IAP )在应用编程是用户的应用代码对片内Flash存储器进行擦除/编程的方法。 通过各种途径CPU运行控制器获取用户代码Boot代码RAMA AR RM M7 7JTAG处 处理 理器 器核 核通过IAP对FLASH外设Flash编程BootUART0 Block? 在 应 用 编 程 (IAP )IAP程序是Thumb代码,位于地址0x7FFF FFF0。在ARM系统中实现状态转换的指令是“BXAddr”,目标地址Addr的最低位(bit0)仅来确定最终状态,实际的“目的地址 Addr & 0xFFFF FFFE”。在调用IAP函数时,不仅要实现跳转而且还要完成状态转换。注意:此为示意代码,Bit01使处实际编程中请用理器切换到LDR R0,0x7FFFFFF1ARM 代 码 Thumb 代 码Thumb状态BXR0ARM状代码替代。态字对齐0x7FFF FFF0IAP 程 序 入 口0x0000 4000 0x7FFF FFF2BX 0x7FFF FFF10x0000 4004 Thumb状0x7FFF FFF1 & 0x7FFF FFFE态半字对齐? 在 应 用 编 程 (IAP )在调用IAP函数时,寄存器R0中的字指针指向存储器(RAM)中包含的命令代码和参数,它作为函数的入口参数,函数执行的返回值保存在寄存器R1中的字指针指向存储器(RAM)中,包含状态代码和结果。结果表最大数目为2ARM 寄 存 器命 令 参 数 表 命 令 结 果 表R0R0 命 令 代 码 状 态 代 码命 令 代 码 状 态 代 码R1R1 参 数1 结 果1参 数1 结 果1 参 数n 结 果n参 数n 结 果n参数表最大数目为5? 在 应 用 编 程 (IAP )#define IAP_LOCATION 0x7FFFFFF1 IAP 程 序 入 口#define IAP_LOCATION 0x7FFFFFF1typedef void *IAP unsigned int , unsigned int ;typedef void *IAP unsigned int , unsigned int ;定 义 函 数 类 型 指 针IAP iap_entry;IAP iap_entry; 定 义 函 数 指 针unsigned longcommand5; IAP 命 令 表unsigned longcommand5;unsigned longresult2;IAP 返 回 值unsigned longresult2;iap_entry IAP IAP_LOCATION;iap_entry IAP IAP_LOCATION;设 置 函 数 指 针iap_entry command , result;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 )IAP程序会使用片内RAM空间的顶部32个字节,因此,在支持IAP的场合,用户程序应该避免使用这部分空间。 0x7FFF FFFF 0x7FFF FFFF8 K B Boot Block 重映射 8 K B Boot Block 重映射IAP代 IAP代0x7FFF E000 0x7FFF E000码使用 码使用0x4000 1FFF 0x4000 7FFF顶部32 字节 顶部32 字节0x4000 1FE0 0x4000 7FE08 K B 片内静态RAM 3 2 K B 片内静态RAM0x4000 0000 0x4000 0000片内Flash 片内Flash0x0000 003F 0x0000 003F异常向量表 异常向量表0x0000 0000 0x0000 0000LPC2364LPC2366/68/78? 小 知 识 : 当 前 程 序 状 态 寄 存 器 ARM内核包含1个当前程序状态寄存器(CPSR)。CPSR反映当前处理器的状态,其包含:?4个条件代码标志负标志N、零标志Z、进位标志C和溢出标志V ;?2个中断禁止位IRQ禁止与FIQ禁止;?5个对当前处理器模式进行编码的位M4:0;?1个用于指示当前执行指令的位ARM指令还是Thumb指令。? 程 序 状 态 寄 存 器 的 格 式条件代码标志 保留 控制位31 30 292827 26 87 6543210N N Z Z C C V V I I F F T T M M4 4 M M3 3 M M2 2 M M1 1 M M0 0? ? ?溢出标志进位或借位扩展 模式位状态位零FIQ禁止负或小于IRQ禁止? 条 件 代 码 标 志各标志位的含义如下:?负标志N:运算结果的第31位值,记录标志设置操作的结果;?零标志Z:如果标志设置的操作为0,则置位;?进位标志C:记录无符号加法溢出,减法无借位,循环移位;?溢出标志V:记录标志设置操作的有符号溢出。? 控 制 位3、处理器模式位M0M4。2 1、处理器状态位 、中断禁止控制位 T; I和F;M 4 : 0 可 见 的 T h u m b 状 态 寄 存 器 可 见 的 A R M 状 态 寄 存 器模 式10000 用 户 R0 R7, SP, LR, PC, CPSR R0 R14, PC, CPSR当控制位I置位时,IRQ中断被禁止;R0 R7, SP_fiq, LR_fiq, PC, R0 R7, R8_fiq R14_fiq, PC,10001 快 速 中 断?当控制位T置位时,处理器正在Thumb状态下运行;CPSR, SPSR_fiq CPSR, SPSR_fiq当控制位F置位时,FIQ中断被禁止。R0 R7, SP_irq, LR_irq, PC, R0 R12, R13_irq, R14_irq, PC,10010中 断CPSR, SPSR_fiq CPSR, SPSR_irq当控制位T清零时,处理器正在ARM状态下运行。R0 R7, SP_svc, LR_svc, PC, R0 R12, R13_svc, R14_svc, PC,10011 管 理CPSR, SPSR_svc CPSR, SPSR_svc警告:绝对不要强制改变CPSR寄存器中的控制R0 R7, SP_abt, LR_abt, PC, R0 R12, R13_abt, R14_abt, PC,10111 中 止CPSR, SPSR_abt CPSR, SPSR_abt 位T。如果这样做,处理器将进入一个无法预测的 注意:不是所有模式位的组合都定义了有R0 R7, SP_und, LR_und, PC, R0 R12, R13_und, R14_und, PC,11011未 定 义状态。CPSR, SPSR_und CPSR, SPSR_und效的处理器模式,如果将非法值写入M4:0中,R0 R7, SP, LR, PC, R0 R14, PC, 11111 系 统处理器将进入一个无法恢复的模式。CPSR CPSR保 留 位 CPSR中的保留位被保留将来使用。当改变CPSR标志和控制位时,请确认没有改变这些保留位。 另外,请确保您的程序不依赖于包含特定值的保留位,因为将来的处理器可能会将这些位设置为1或者0。? 在 应 用 编 程 (IAP ) 76 54 3 210用户可以在启动代码Startup.s文件中的1 1 0 1 1 1 1 11 1 0 1 1 1 1 1InitStack函数内调整各个模式的堆栈空间位置。系统模式 76 54 3 210ARM状态InitStack InitStack I F T M4 M3 M2 M1 M0M4 I F T M3 M2 M1 M0IRQ禁止FIQ禁止; 设 置 系 统 模 式 堆 栈; 设 置 系 统 模 式 堆 栈MSR CPSR_c, #0xdfMSR CPSR_c, #0xdfLDR SP, StackUsr ? 32LDR SP, StackUsr ? 32 避 免 使 用 片 内RAMMOV PC, R0MOV PC, R0的 顶 部32 个 字 节? 在 应 用 编 程 (IAP )IAP的命令表I S P 命令 命令代码 准备编程扇区 50 将RAM 内容复制到Flash 51 擦除扇区 52 扇区查空 53读器件ID 54读boot 代码版本 55比较 56IAP各命令返回代码及意义表返回代码 符号 描述 0 CMD_SUCCESS 命令被成功执行。 1 INVALID_COMMAND 无效命令。 2 SRC_ADDR_ERROR 源地址没有以字为边界。 3 DST_ADDR_ERROR 目标地址的边界错误。 4 SRC_ADDR_NOT_MAPPED 源地址没有位于存储器映射中。计数值必须考虑可用性。 5 DST_ADDR_NOT_MAPPED 目标地址没有位于到存储器映射中。计数值必须考虑到可用性。 6 COUNT_ERROR 字节计数值不是4 的倍数或是一个非法值。 7 INVALID_SECTOR 扇区号无效。 8 SECTOR_NOT_BLANK 扇区非空。 9 SECTOR_NOT_PREPARED为写操作准备扇区命令未执行。_FOR_WRITE_OPERATION 10 COMPARE_ERROR 源和目标数据不相等。 11 BUSY Flash 编程硬件接口忙。概 述?Boot 简 介片 内Flash 存 储 系 统数 据 存 储 解 决 方 案在 线 升 级 解 决 方 案片 内Flash 系 统在利用IAP代码来操作片内Flash时,必须熟悉片内Flash的扇区分布。片内Flash的操作是以“扇区”为单位进行的,每个“扇区”的大小不定。由于IAP代码位于Boot区内,所以IAP命令不片内256KB允许对Boot扇区执行写/擦除操作。Flash0x0003 FFFF扇 区14 (32K )0x0003 8000存储器空间存储器空间 0x0001 FFFF扇 区10 (32K )片内512KB0x0007 FFFF 0x0007 FFFF0x0001 8000Boot Block8KB Boot Block8KBFlashBoot Block 0x0007 E000 0x0007 E000片内128KB扇 区8 (32K )不占用片内0x0000 8000FlashFlash扇 区7 (4K ) 用 户Flash0x0000 7000504KB用 用 户 户F Flla as sh h1 12 28 8/2 25 56 6K KB B 扇 区0 (4K )0x0000 0000 0x0000 00000x0000 0000(LPC2364/66) 扇区分布(LPC2368/78)片 内Flash 系 统对于LPC2368/78来说,Boot区位于512kB Flash的顶部,因此在LPC2368/78器件中,只有504kB Flash可供用户使用。0x0007 DFFF扇 区27 (4K )0x0007 D000扇 区22 (4K )存储器空间 0x0007 8000扇 区21 (32K )0x0007 00000x0007 FFFFBoot Block8KB0x0007 E000扇 区8 (32K )0x0000 8000扇 区7 (4K )用 用户 户F Flla as sh h0x0000 7000504KB504KB扇 区0 (4K )0x0000 00000x0000 0000(LPC2368/78) 扇区分布? 概 述?Boot 简 介片 内Flash 存 储 系 统数 据 存 储 解 决 方 案在 线 升 级 解 决 方 案数 据 存 储 解 决 方 案系 统 概 述 通过IAP,用户可以使用片内Flash作为非易失性数据存储器,存储一些设备的配置信息。这样不仅可以节约成本,而且还可以减小线路板的面积。FlashLPC2364FlashFlash? 系 统 概 述 利用IAP将Flash作为数据存储器时,用户需要控制自身代码量的大小及代码定位。绝对不能够出现Flash数据区和Flash代码区重叠的现象。因为在利用IAP向片内Flash存储器写入数据时,需要对数据扇区进行擦除。如果数据区和代码区重合,就有可能会破坏系统的代码空间,造成系统死机或崩溃。 用 途 扇 区 大 小0 6 28kB代 码 空 间数 据 空 间 7 4kB 注意:任何Flash都是有寿命的,如果对片内Flash 通过IAP向片内Flash的扇区7写入512个字节的数据。的操作过于频繁,就会对其造成损坏,LPC2300的Flash擦除/写入次数为10万次。? 系 统 概 述 使用IAP将SRAM中的数据编程到Flash时,源数据区只能够使用片内局部总线上的SRAM,不能使用通用USB SRAM和以太网SRAM。片内 片内ARM7TDMISRAM Flash局部总线AHB2 AHB1AHB AHB桥 桥8k 4k SRAM16k SRAM USB 控制器SRAM? 小 知 识 : 存 储 数 据 的 对 齐 方 式 如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐; 如果一个数据是以能被4整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。方式 半字对齐 字对齐 0x4002 0x4004地址0x4004 0x4008 Bit00 Bit10,Bit00特征其他位为任意值 其他位为任意值? 片 内Flash 编 程 步 骤使用IAP之前需要定义的一些常量擦除操作之前必须确 定 系 统 参 数确 定 系 统 参 数先选择扇区,一次可以选择多个扇区写入数据之前要先选 择 扇 区 ( 可 选 )选 择 扇 区 ( 可 选 ) 擦除扇区,已擦除的可不必重复擦编程操作之前必须擦 除 扇 区 ( 可 选 )擦 除 扇 区 ( 可 选 )先选择扇区,一次可以选择多个扇区字对齐的SRAM数据区数据写入到选 择 扇 区选 择 扇 区256字节对齐的Flash中,一次写入256、512、1024或4096字节。IAP提供数据校验编 程 扇 区编 程 扇 区手段,用户不必自己动手校验数据校 验 数 据 ( 可 选 )校 验 数 据 ( 可 选 )? 片 内Flash 编 程 步 骤 通过在使用IAP代码之前,需要定义一些常量,如系统时钟、IAP函数入口、IAP入口缓冲区和出口缓冲区等。确 确 定 定 系 系 统 统 参 参 数 数确 确 定 定 系 系 统 统 参 参 数 数选 择 扇 区 ( 可 选 )选 择 扇 区 ( 可 选 )#define IAP_FCCLK 48000#define IAP_FCCLK 48000#define IAP_ENTER_ADR 0x7FFFFFF1#define IAP_ENTER_ADR 0x7FFFFFF1擦 除 扇 区 ( 可 选 )擦 除 扇 区 ( 可 选 )定 义CCLK 值 大 小 ,IAP 入 口 地 址 定 义单 位 为KHzuint32 paramin8; IAP 入 口 参 数 缓 冲 区uint32 paramin8;选 择 扇 区选 择 扇 区uint32 paramout8; IAP 出 口 参 数 缓 冲 区uint32 paramout8;编 程 扇 区编 程 扇 区校 验 数 据 ( 可 选 )校 验 数 据 ( 可 选 )? 片 内Flash 编 程 步 骤 对某一个扇区执行擦除、写入等操作之前,必须先选择该扇区。但也可以一次选择多个扇区。 确 定 系 统 参 数确 定 系 统 参 数uint32 SelSectoruint8 sec1,uint8 sec2uint32 SelSectoruint8 sec1,uint8 sec2选 选 择 择 扇 扇 区 区 ( ( 可 可 选 选 ) )选 选 择 择 扇 扇 区 区 ( ( 可 可 选 选 ) )paramin0 IAP_SELECTOR; paramin0 IAP_SELECTOR;擦 除 扇 区 ( 可 选 )擦 除 扇 区 ( 可 选 )设 置 起 始 扇 区 paramin1 sec1; paramin1 sec1;设 置 扇 区 选 择 命 令 字设 置 终 止 扇 区 paramin2 sec2; paramin2 sec2;选 择 扇 区选 择 扇 区 *void*IAP_ENTER_ADRparamin,paramout; *void*IAP_ENTER_ADRparamin,paramout; returnparamout0;返 回 操 作 状 态 码 returnparamout0;调 用IAP 服 务 程 序编 程 扇 区编 程 扇 区校 验 数 据 ( 可 选 )校 验 数 据 ( 可 选 )? 片 内Flash 编 程 步 骤 LPC2300片内Flash在写入数据前需要执行擦除操作。如果目标区域已经被擦除,那么就不必重复擦除,可直接写入数据。擦除操作一次可以擦除多个扇区。确 定 系 统 参 数确 定 系 统 参 数uint32 EraseSectoruint32 sec1,uint32 sec2uint32 EraseSectoruint32 sec1,uint32 sec2选 择 扇 区 ( 可 选 )选 择 扇 区 ( 可 选 )paramin0 IAP_ERASESECTOR; paramin0 IAP_ERASESECTOR;擦 擦 除 除 扇 扇 区 区 ( ( 可 可 选 选 ) )擦 擦 除 除 扇 扇 区 区 ( ( 可 可 选 选 ) ) paramin1 sec1;设 置 起 始 扇 区 paramin1 sec1;设 置 扇 区 擦 除 命 令 字 paramin2 sec2;设 置 终 止 扇 区 paramin2 sec2;选 择 扇 区选 择 扇 区 paramin3 IAP_FCCLK; paramin3 IAP_FCCLK; *void*IAP_ENTER_ADRparamin,paramout; *void*IAP_ENTER_ADRparamin,paramout;编 程 扇 区编 程 扇 区 returnparamout0; returnparamout0;返 回 操 调 作 用 状 IA 态 P 码 服 务 程 序校 验 数 据 ( 可 选 )校 验 数 据 ( 可 选 )? 片 内Flash 编 程 步 骤执行完以上几步后,就可以编程Flash了。执行编程扇区的操作时,IAP函数会将RAM中的数据拷贝到Flash中。 确 定 系 统 参 数确 定 系 统 参 数uint32 RamToFlashuint32 dst, uint32 src, uint32 nouint32 RamToFlashuint32 dst, uint32 src, uint32 no选 择 扇 区 ( 可 选 )选 择 扇 区 ( 可 选 ) paramin0 IAP_RAMTOFLASH; paramin0 IAP_RAMTOFLASH; paramin1 dst; 设 置Flash 目 标 地 址 paramin1 dst; 设 置 扇 区 编 程 命 令 字擦 除 扇 区 ( 可 选 )擦 除 扇 区 ( 可 选 ) paramin2 src; 设 置SRAM 源 地 址 paramin2 src; paramin3 no; paramin3 no;设 置 复 制 字 节 数选 择 扇 区选 择 扇 区 paramin4 IAP_FCCLK; paramin4 IAP_FCCLK;256/512/1024/4096 *void*IAP_ENTER_ADRparamin,paramout;*void*IAP_ENTER_ADRparamin,paramout; 编 编 程 程 扇 扇 区 区编 编 程 程 扇 扇 区 区 returnparamout0; returnparamout0;返 回 操 作 状 态 码调 用IAP 服 务 程 序校 验 数 据 ( 可 选 )校 验 数 据 ( 可 选 )? 片 内Flash 编 程 步 骤IAP代码还为用户提供了一个数据校验的手段,这样用户就可以不必自己动手来校验写入Flash中的数据是否正确。确 定 系 统 参 数确 定 系 统 参 数uint32 Compareuint32 dst, uint32 src, uint32 nouint32 Compareuint32 dst, uint32 src, uint32 no选 择 扇 区 ( 可 选 )选 择 扇 区 ( 可 选 )paramin0 IAP_COMPARE; paramin0 IAP_COMPARE;擦 除 扇 区 ( 可 选 )擦 除 扇 区 ( 可 选 ) paramin1 dst;设 置 目 标 地 址 paramin1 dst;设 置 数 据 比 较 命 令 字 paramin2 src; paramin2 src; 设 置 源 地 址选 择 扇 区选 择 扇 区 paramin3 no; paramin3 no;比 较 字 节 个 数 *void*IAP_ENTER_ADRparamin,paramout; *void*IAP_ENTER_ADRparamin,paramout;必 须 能 被4 整 除 returnparamout0;编 程 扇 区 returnparamout0;编 程 扇 区调 用IAP 服 务 程 序返 回 操 作 状 态 码校 校 验 验 数 数 据 据 ( ( 可 可 选 选 ) )校 校 验 验 数 数 据 据 ( ( 可 可 选 选 ) )? 函 数 主 体向扇区7写入512个字节的数据,扇区7可以作为一个E2PROM来使用,如存储一些系统的配置信息。扇 区7 的 起 始 地 址#define DestAddr 0x00007000 #define DestAddr 0x00007000 int main voidint main void_align4 uint8 SendData512; _align4 uint8 SendData512; uint32 i; uint32 i;以 字 对 齐 定 义 变 量 区 fori 0; i 512; i+ fori 0; i 512; i+ SendDatai i;SendDatai i;初 始 化 变 量 区 数 据 编 程 后 的Flash 区 域擦 除 后 的Flash 区 域编 程 后 的Flash 区 域擦 除 后 的Flash 区 域 SelSector7, 7;选 择 扇 区7 SelSector7, 7;擦 除 扇 区7 EraseSector7,7; EraseSector7,7;选 择 扇 区7 SelSector7, 7; SelSector7, 7; RamToFlashDestAddr, uint32SendData, 512; RamToFlashDestAddr, uint32SendData, 512; while1; while1;写 入 数 据 到Flash? 概 述?Boot 简 介片 内Flash 存 储 系 统数 据 存 储 解 决 方 案在 线 升 级 解 决 方 案在 线 升 级 解 决 方 案系 统 概 述“ 系 在 统 线 通 升 过 级 串 ”实 口际 接上 收是 升F 级 la代 sh码 数, 据然 存后 储调 的用 一I个 AP 应 函 用 数 特 实 例。系 现统 在开 线发 升完 级毕 。后 为, 了在 实应 现用 在过 线程 升中 级, ,如 本果 系需 统要 将增 芯加 片部 的分 片功 内能 Fla , sh那 重么 新为 分了 区避 :免重新拆装设备,可以借助“在线升级”方式。?程序标志区:标记当前用户程序运行的区,程序?B LO oo W t代 区码 和区 HI : G又 H区 叫: 固用 件户 区代 ,码 存分 放为 系两 统个 的区,LOW标志区的首地址为:0x0000 4000。对于这个区间, B 区 目 o和 o 前 tH L , o IG a 在 d H e 线 区 r, 升 , 可 级 当 完 是 程 成 很 序 代 多 位 码 系 于 升 统 LO 级 都 W , 必 区 首 需 时 地 的 , 址 一 可 位 个 以 于 功 对 能,仅仅使用了前4个字节,用来保存当前用户代码区0 Hx I0 G0 H 0区 0 进 00行 00 升 ; 级。反之,如果程序位于HIGH区,对于LPC2300来说,利用IAP函数即可实现在线升级。的首地址。如程序标志= 0x0000 8000,则当前程可以对LOW区进行升级。LOW区的首地址为:用户程序接收新的代码,然后调用IAP函数将新的代码序运行在LOW区;如程序标志 0x0001 0000,0x0000 8000,HIGH区的首地址为:0x0001 编程到Flash扇区中,实现在线升级。 则当前程序运行在HIGH区;如程序标志为其它值,0000,每个用户代码区的容量为32kB;则当前程序运行在固件区域。