QuickARM片内RAM调试<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1.使用片内RAM (起始地址0x4000 0000)调试程序
因为如果在复位后P0.14不为低,则程序将从0x8000 0000处开始执行,所以如果使用片内RAM调试,则必然要求在复位时P0.14处于低电平状态,由调试程序通过Boot Loader提供的接口来处理接下来的动作(参考LPC2220 Datasheet 的Chapter19 "Onchip Serial Boot Loader")。如果要使用片内RAM调试,则ISP下载的短接线不可以拔下,可使用LPC210x ISP RAM Buffer控制 按下"Run from Address"按钮。
出现的情况是好像晶振频率变慢了,而且串口发送数据也不正确,可能的原因是其中的PLL设置部分出错的缘故。
2.从片内RAM 0x4000 00200开始运行程序
因为ISP commands 会使用0x4000 0120- 0x4000 01FF作为缓冲区,所以不应该从0x4000 0000开始运行程序,这也是如果这样做,LPC210x ISP软件报告如下的错误的缘故:
“Code in Boot Loader RAM Area(&H40000120-&H400001FF) or Boot Loader Stack Area (Top 288 Bytes of RAM) will be ignored!”
这样分散加载文件就应该更改,从0x4000 0200处开始
对应的DebugInRAMARM Linker -->options-->Image entry import也应该改成0x4000 0200,其他的RAM使用情况也应注意,如Boot Loader使用的片内最高的288Bytes。
更改后的运行正确,UART0发送数据正常。
3.从片内RAM 0x4000 00200开始运行程序,如何处理中断
在程序中若使用TIMER1的中断操作,因为中断产生的异常处理会导致PC跳至对应的中断向量处,而TIMER1的中断产生IRQ中断,IRQ异常会跳至重映射后的0x18处,(LDR PC,[PC,#-0xff0])。使用内部RAM绝对地址开始于0x4000 0000处,所以会跳至程序的0x4000 0018处,但因为在编译选项里,可执行代码的开始地址为0x4000 0200,所以需要在关闭中断的情况下将起始代码复制到0x4000 0000。
导致了程序不能正常运行,在编译器选项设置的DebugInRAM的对应项目中,
修改:
1).targer.c修改
-----------------
#ifdef __IN_CHIP
MEMMAP = 0x1; //remap
#endif
-----------------
为
-----------------
#ifdef __IN_RAM
unsigned int i;
uint32 *cp1, *cp2;
extern void Reset(void);
cp1 = (uint32 *)Reset;
cp2 = (uint32 *)0x40000000;
for (i = 0; i < 16; i++)
{
*cp2++ = *cp1++;
}
MEMMAP = 0x2; //remap
#endif
--------------------
增加了复制中断向量的代码,使得异常出现时,可以得到正确的中断向量
2).修改DebugInRAM编译选项
DebugInRAM-->ARM C COMPILER -->Preprocessor中的__IN_CHIP修改为
__IN_RAM;
_____________________________________
编译环境:ADS1.2
下载工具:LPC210x ISP
2008-5-26 by eleclike
eleclike 2008-10-11 17:22
用户145659 2008-10-11 09:56
用户145659 2008-10-11 09:55
用户461316 2008-9-14 09:38
huli184_389376486 2008-9-13 08:22