电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

QuickARM片内RAM调试

QuickARM片内RAM调试

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
eleclike的草园
  欢迎来到eleclike的草园。 本站源程序及观点欢迎转载,请指明出处和作者。 欢迎进入eleclike 21ic<font color="#0099