基于IAP和Keil MDK的远程升级设计
; ************************************************************* LR_IROM1 0x00000400 0x00001C00 { ; load region size_region ER_IROM1 0x00000400 0x00001C00 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x40000040 0x00003FA0 { ; RW data .ANY (+RW +ZI) } } 代码3-8 分散加载代码 这段代码显示出Bootloader程序从0x00000400处开始执行,最多占用0x1C00字节的Flash空间。另外,该程序的RAM从0x40000040开始,长度为0x3FA0个字节。这样RAM的低64字节保留给中断向量映射使用,高32字节保留给IAP编程使用。 3.3.4 中断向量的重映射 Bootloader的起始地址位于0x00000400,中断向量也从这一地址开始存储。但默认情况下ARM发生异常时,会跳转到0x00000000处的64字节中断向量区域执行相应操作,所以为了使Bootloader能相应中断,必须将位于0x00000400开始的64字节中断向量表重映射到RAM的低区。LPC2114使用向寄存器MEMMAP写入0x02来完成这一过程。 代码3-9 描述了中断向量重映射的过程。 ; Copy Exception Vectors to Internal RAM --------------------------------------- ADR R8, Vectors ; 源地址 LDR R9, =RAM_BASE ; 目标地址,这里是0x40000000 LDMIA R8!, {R0-R7} ; 装载向量表 STMIA R9!, {R0-R7} ; 存储向量表 LDMIA R8!, {R0-R7} ; 装载处理程序地址 STMIA R9!, {R0-R7} ; 存储处理程序地址 ; Memory Mapping (when Interrupt Vectors are in RAM) MEMMAP EQU 0xE01FC040 ; Memory Mapping Control IF :DEF:REMAP LDR R0, =MEMMAP IF :DEF:EXTMEM_MODE MOV R1, #3 ELIF :DEF:RAM_MODE MOV R1, #2 ELSE MOV R1, #1 ENDIF STR R1, [R0] ENDIF 代码3-9 中断向量重映射 由于Keil MDK提供的启动代码中使用条件编译指令,所以,要想正确的执行中断向量重映射,还需要在Keil MDK编译器工程设置Options for target“你的工程目标名”下的Asm标签中找到Define编辑框,在编辑框中键入“REMAP RAM_MODE”。如图3-2所示 图3-2 注意:在擦除/编程Flash的时候还应该禁止PLL、存储器加速模块。 3.4 用户程序的设计 用户程序运行在高区(扇区8~13)或者低区(扇区1~7),用于实现数据的采集、处理和上传等等,用户程序除本身功能的要求外,还需要注意: ? 使用分散加载机制,将程序入口精确定位到0x00010000(高区)或0x00008000(低区)。 ? 进行中断向量重映射,映射到RAM最底处。
4.1 Intel的hex格式 Intel hex文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。一个数据记录以一个回车和一个换行结束。 一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式. : LL AAAA TT [DD...] CC 每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述. :冒号 是每一条Intel HEX记录的开始 LL 是这条记录的长度域,他表示数据(dd)的字节数目. AAAA 是地址域,他 表示数据的起始地址 TT 这个域表示这条HEX记录的类型,他有可能是下面这几种类型 00 ----数据记录 01 ----文件结束记录 02 ----扩展段地址记录 04 ----扩展线性地址记录 DD 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以查看LL域的说明。 CC 是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母(包括校验字节)相加之后等于0x00。 一个Intel HEX文件必须有一个文件结束记录,这个记录的类型域必须是01, 一个EOF记录总是这样: :00000001FF 00是记录中数据字节的数目 0000这个地址对于EOF记录来说无任何意义 01记录类型是01(文件结束记录标示) 4.
- MSP43F149系列单片机的IAP功能设计(09-08)
- 基于IAP的STM32程序更新技术(01-23)
- STM32 IAP 无法运行用户程序的解决方法(12-03)
- STC单片机 EEPROM/IAP 功能测试程序演示(12-01)
- 9G-STM32 简易BOOT及XMODEM串口IAP移植过程简介(11-29)
- STC IAP片子的仿真功能(11-28)