|
5. IAP示例项目和中断处理
5.1 软件设置 5.1.1 SRAM内存映射 演示程序的代码将中断向量重新定位到SRAM,并且使用IAP代码。这意味着,编译器必须进行配置以使得存储器底部的512字节和顶部的32字节不能被接触到。在Keil环境中, IRAM1部分应该设定为小于实际SRAM的大小,以防止编译器使用这些区域。 该SRAM起始地址是0x1000 0000。由于中断向量表使用SRAM底部的512字节,起始位置设置为0x1000 0200。LPC11U6x的SRAM大小为32kB。由于IAP使用SRAM顶部的32字节,这意味着可用的SRAM大小为32 KB - 32字节= 32736字节。由于512个字节也被用于中断向量表, SRAM的大小现在变为: 32768 – 32 – 512 = 32224 字节,即0x7DE0.
图2. Keil IROM和SRAM重映射 在LPCXpresso IDE中,通过改变MCU的设置实现相同的任务。
图 3. LPCXpresso闪存和SRAM重映射 在IAR Embedded Workbench中,通过更改链接配置设置实现SRAM的重新映射。RAM地址设置为0x1000 0200,结束地址设置为0x1000 7FE0。
图 4. IAR Embedded Workbench ROM和SRAM重新映射
5.1.2 中断重映射 在NXP的LPC11U6x上系统重映射寄存器SYSMEMREMAP选择异常向量是从引导ROM读取或是闪存、SRAM。默认情况下,闪存映射到地址0X0000 0000。当寄存器SYSMEMREMAP中的MAP位设置成0x0或者0x1,引导ROM或者RAM分别映射到存储器映射的底部512字节(地址0x0000 0000到0x0000 0200)。
图 5. SYSMEMREMAP寄存器 因此,对于IAP过程的中断处理,用户代码应该将中断向量表从0x0000 0000复制到0x1000 0000,然后设置MAP位为0x1选择从RAM映射的异常向量。整个底部512字节闪存块应该复制到RAM中。 5.1.3 系统定时器中断 系统定时器用来在软件运行时创建一个周期性的中断。由于在IAP过程中,软件无法访问到闪存,系统定时器的中断处理程序应该重新定位到SRAM中。
图 6. Keil中的SysTick中断处理程序设置 在LPCXpresso IDE中,系统定时器处理函数通过使用.data.ramfunc指令直接放置到SRAM中。 - 8 __attribute__ ((__section__(".data.ramfunc")))
- 9 void SysTick_Handler(void){
- 10 LPC_GPIO_PORT->NOT[2] = (1<<5);}
复制代码在IAR Embedded Workbench中,系统定时器处理函数通过使用编译器指令ramfunc放置到SRAM中。 . - 11 __ramfunc void SysTick_Handler(void){ 12 LPC_GPIO_PORT->NOT[2] = (1<<5);}
复制代码
5.1.4 处理IAP过程中的中断 当IAP程序被调用时,LPC11U6x的闪存是无法访问的。这可以通过重新定位中断表到SRAM来解决。 中断向量表移动到SRAM。SYSMEMREMAP寄存器的MAP位设置成0x1,表示向量表位于SRAM中,而不是闪存中。 - 13 CopyInterruptToSRAM(); //remap interrupt vector to SRAM
- 14 LPC_SYSCON->SYSMEMREMAP = 0x1; //change memory map
复制代码通过使用函数”CopyInterruptToSRAM”将中断向量表复制到SRAM中。该函数调用硬件编码从闪存地址0x00复制到SRAM地址0x1000 0000。
图 7. 复制中断处理程序到SRAM 在EEPROM写入和读取过程中,必须禁用中断以便正确进行IAP操作。
5.2 硬件设置 IAP指令的输入参数‘CCLK’应该在千赫等级等于CPU的时钟频率。如果CCLK参数小于CPU的时钟,那闪存的操作有可能不稳定。如果CCLK参数高于CPU的时钟,闪存操作有可能慢比预期。如果CCLK不等于CPU时钟,闪存的可靠性不能得到保证。 带UART的LPC11U68万利开发板和Xpresso开发板用于实现演示代码。
图 8. LPC11U68万利开发板
图 9. LPC11U68 Xpresso开发板
图 10. RS232串口线 将串口线连接到LPC11U68万利开发板和PC,并且运行代码。按照控制台的指令进行操作。LPC11U68的Xpresso开发板不支持UART连接。
图 11. LPC11U68万利开发板上的UART和 调试器连接 对于Keil IDE使用ULINK调试器,对于LPCXpresso IDE使用LPC Link-2,以及对于IAR Embedded Workbench IDE可以使用Jlink。
图 12. ULINK调试器
图 13. LPC Link-2
图 14. Segger J-link
5.3 应用示例 演示软件发送一个菜单系统到PC,通过UART连接,以9600波特率。演示软件演示了IAP调用: • EEPROM写入 • EEPROM读取 • 读取器件的部分ID • 读取启动代码的版本 • 擦除扇区 • 从RAM复制内容到闪存 • 验证在存储区位置的数据 • 擦除页 下图显示了在PC上使用Tera Term的 UART菜单显示。
图 15. PC上的UART窗口 在万利开发板的IAR包中,UART方式没有实现。当IAP成功时,Led发光。 在LPC11U68的Xpresso开发板,板上的LED指示了IAP的状态。如果IAP成功,LED指示灯变成绿色。如果IAP失败变为红色。
图 16. Xpresso开发板上的状态指示灯 |