2009年6月24日星期三

jlink 在easyarm2200上的使用

http://www.zlgmcu.com.cn/dispbbs.asp?boardid=29&id=7944&page=&star=2

现将JLINK V7调试EASY ARM2200方法写于下,希望对有相同问题的兄弟有所帮助:
A。片外RAM设置 BANK0-- RAM BANK1- FLASH;

JLINK下载是不成功的。因为LPC2214 的写信号reset 后默认为GPIO,因此,为了保证仿真器能够下载程序到SRAM 中,还需要重新配置,使能WE 信号,配置BLS1:0 信号,保证程序下载成功。在axd 内的命令行(System Videws---> Command Line Interface) 执行ob c:\lpc2214.ini。此文件内容见后。此文件建立方法:

在文本编辑器中输入如下命令:

com meterchen www.ZLGMCU.com

spp vector_catch 0

smem 0xffe00000 0x1000ffef 32

smem 0xe002c014 0x0F814914 32

rld

B。片外FLASH设置 BANK0-- RAM BANK1- FLASH;
先将程序通过J-FLASH下载后,在加载调试文件。因为在AXD中载入相应的image(如果是在IDE工程中启动的AXD,则会在AXD启动的同时载入相对应工程的image)。注意,由于在AXD 中并不能对flash 进行编程,因此在对程序调试的时候,必须先将程序烧写到flash 中,否则AXD 可以显示正确的相关源代码,但是仿真不能正确进行!

2009年6月23日星期二

74hc595

fsd

ghost 备份 (GHO GHS 文件 )

问题一:做GHOST时,产生了两个文件,一个是GHO,一个是GHS文件,这两个文件什么关系?
问题二:以前用ghost还原回来,即系统恢复时,只要选择GHO文件就行了,可现在确是先选择GHO文件,后又要选择GHS文件,这是什么原因?

答;
GHOST备份出来的文件是不能超过2G的,超过2G它会生成GHS文件,同样,1个GHS文件也不会超过2G,如果超过,就会继续生成新的GHS文件,不信可以看一下那个GHO文件,绝对不会超过2G的

arm 调试

这篇文章总结了刚接触ARM的网友们的常见问题,希望对快速掌握ARM调试有帮助。
1 - 检测不到目标系统
调试前,请把目标板连接好,然后用调试软件检测目标系统。如果检测不到目标系统,请做以下的检查。
A - 有些芯片是可以加密的,加密后JTAG接口就自动被禁用掉了;
B - 确定你的连接是正确的;
C - 确定你使用的仿真器是被调试软件支持的
D - 对WIGGLER而言,因为没有固定的电路图,所以需要在软件里做相应的设置;
E - 对LPC2000系列而言,RTCK管脚一般是用来控制是否使能JTAG接口的,请查阅数据手册;
F - 如果你用的芯片比较特殊,例如STR91X,因为内部扫描链是串接的,请设置好TAP,以 让仿真器知道扫描链的长度;

2 - 程序下载不正确,程序跑飞
一般的用户,刚开始调试的时候,编译好程序,就直接点击调试。但结果发现调试根本没有按照预期的进行。发生这种问题一个最常见的原因是程序根本没有正确下载到目标系统中。
对SDRAM而言,上电后一般都是不可以使用的,需要进行相应的配置才可以使用。所以如 果是在SDRAM里进行调试,请先对SDRAM进行配置,或者确定SDRAM已经初始化好了。如果是内部SRAM,一般来说,可以直接使用。所以,做一般的测试,最简单的办法是使用片sram。
在调试的时候,最好是自己通过内存观察窗口判断一下,程序是否是下载到期望的地址去了,下载是否正确。以免出现调试跑飞的问题。

3 - 软件断点和硬件断点的区别和数量限制
所有的ARM7/ARM9芯片,内部有2个断点单元。断点单元可以用于设置硬件断点或是软件断点先说说硬件断点和软件断点的区别。硬件断点是通过监测地址来触发断点的。所以,硬件断点可以设置在任何地方,不管是FLASH,ROM还是RAM,只要给定地址就可以了。而软件断点是通过监测特定的指令来触发断点的。在某个地址设置软件断点的时候,仿真器会将这个地址 的数据/指令替换成一个特殊格式的指令。断点单元通过监测这个特殊格式的指令来触发断点. 因为需要执行替换操作,所以软件断点只能设置在RAM里面。如果断点单元设置成监测某个地 址,那一个断点单元只能监测一个地址,所以只能设置2个硬件断点。如果断点单元设置成监测某个固定格式的指令,那一个断点单元可以支持数量没有限制的软件断点。因为设置软件断点的时候只需要把要说着断点的位置的数据替换成被监测的固定格式的指令就可以了。这 就是为什么大家经常看到说支持2个硬件断点和数目不限的软件断点。但这里还是要提醒以下, 如果2个断点单元都用于硬件断点,那用户就不可以设置软件断点了。

4 - 在FLASH内进行调试
在FLASH进行调试,本质上来说,和在SDRAM/SRAM里调试是一样的。区别是,FLASH是只读的,对FLASH进行写操作的时候,需要特别的命令。如果IDE支持直接将程序烧写到FLASH进行调试,那调试就会和在RAM里差不多。如果IDE不支持自动下载,可以先通过烧写软件将要调试的程序烧写到FLASH里面,然后在进行调试。在FLASH和RAM里面进行调试的另外一个区别在与可使用 的断点数量。因为FLASH是只读的,所以只能使用硬件断点,所以最多只能使用2个断点。很多 时候,单步运行也需要一个断点来实现,所以,用户只能使用一个断点。清楚了这点,碰到提示说没有断点可以使用了,不能设置断点,或者不能单步运行的时候,就知道是怎么回事情了。

5 - 软件断点被覆盖
前面我们提到,软件断点是通过替换指令来实现的。这就存在一个可能,设置好的软件断点被 覆盖掉了。特别是自拷贝程序,仿真器在拷贝前在某个地址设置了一个软件断点。然后执行拷操作,这样的结果是设置断点的位置的值由于自拷贝而发生了改变,由于新的值并不是被监测 的特殊指令,所以这个断点就会失效。造成在这个位置程序不能停止的情况。这样的情况相对来说比较少,这里只是提醒一下,希望对碰到类似情况的朋友有帮助。

6 - 反汇编调试
在调试的时候,一般看的都是源文件,汇编或C语言。如果调试的时候发现运行与期望的不一 或是跑飞,可以看看反汇编,单不运行几步,然后通过观察寄存器和内存来判断每条指令的运 行是否正确。

7 - 调试的时候,注意内存观察窗口对调试的影响
在调试的时候,如果内存观察窗口打开了,每次目标板被停止后,DEBUGGER都会通过调试代理 读取内存,更新内存观察窗口的值。一般情况下,这样做都不会带来什么影响。但有个特殊情况 必须要注意。在某些情况下,调试目标的某些寄存器有特别的地方。例如,有些寄存器,只能读 取一次,读取后它们的值就会变化。在这种情况下,因为更新内存观察窗口的值的时候会执行一 次读操作,所以程序重新运行的时候,在读取寄存器的值的时候,该值已经改变了,程序运行出 现不期望的情况。有个网友遇到过这个问题,请参考下面的帖子:

h-jtag faq

H-jtag
Q. 如何设置调试器 (ADS/SDT/REALVIEW)?
A. ADS/AXD -> options -> configure target -> add -> 在 h-jtag 安装目录中选择 h-jtag.dll -> click OK

SDT/ADW -> options -> configuration debugger -> target-> add ->在 h-jtag 安装目录中选择 h-jtag.dll-> click OK

RealView -> File -> Connection -> connect to target -> Right click on ARM -> Add/Remove/Edit Devices -> Add DLL -> 在 h-jtag 安装目录中选择 h-jtag.dll -> Configure

Q. 如何配置 KEIL?
A. KEIL->PROJECT->OPTIONS FOR TARGET->DEBUG->USE RDI Interface Driver ->SETTING->BROWSER->在 h-jtag 安装目录中选择 h-jtag.dll。

Q. 不能加载 h-jtag 驱动。
A. h-jtag 驱动没有正确安装。需要使用管理员权限重新安装驱动。

Q. Too many breakpoints.
A. 通常这是由于 vector catch/semihosting 导致的。 使用 vector catch/semihosting 会消耗断点资源。如果所有端点可用资源都被占用了,就会显示这条消息。注意,所有为 vector catch and semihosting 设置的端点对用户来说都是不可见的。这些端点不可以通过 "delete all breakpoint" 指令来消除。如果要消除这个消息,请在调试器设置中禁用vector catch and semihosting。

Q. The statement into which was stepped is singular (i.e. it has no exit)。
A. 由于设置了 vector catch/semihosting 而产生了不可见断点导致的。要清除这个消息,请在调试器设置中禁用 vector catch。

Q. Execution stopped, because of an unknown breakpoint (this indicates an internal error).
A. 由于设置了 vector catch/semihosting 而产生了不可见断点导致的。要清除这个消息,请在调试器设置中禁用 vector catch 。

Q. The processor is reset.
A. 要清除这个消息,请在调试器设置中禁用 vector catch。

Q. Unrecognized swi.
A. 要清除这个消息,请在调试器设置中禁用 semihosting。

2009年6月21日星期日

LPC2200.hfc lpc2200_ram.hfc

LPC2200.hfc 经过测试,该配置文件目前不管用.
FLASH SECTION:
SST
SST39VF160
MEMORY SECTION:
16-BIT X 1-CHIP
0x80000000
0x81000000
XTAL SECTION:
NULL
TCK SECTION:
11
9
SCRIPT SECTION:
Setmem+32-Bit+0xE002C014+0x0F814914
Setmem+32-Bit+0xFFE00000+0x1000FFEF
Setmem+32-Bit+0xFFE00004+0x1000FFEF
PGMOPTION SECTION:


lpc2200_ram.hfc 经过测试,该配置文件管用.
FLASH SECTION:
SST
SST39VF160
MEMORY SECTION:
16-BIT X 1-CHIP
0x81000000
0x40000000
XTAL SECTION:
NULL
TCK SECTION:
-1
-1
SCRIPT SECTION:
Setmem+32-Bit+0xE002C014+0x0F814914
Setmem+32-Bit+0xFFE00000+0x1000FFEF
Setmem+32-Bit+0xFFE00004+0x1000FFEF
PGMOPTION SECTION:

*************************************************************************
****以下为文件分析*********************************************************************************
LPC2200.hfc 文件分析
FLASH SECTION:
SST
SST39VF1601
MEMORY SECTION:
16
0x80000000 //Flash起始地址
0x40000000 //RAM起始地址
SCRIPT SECTION: //进行硬件的初始化,这些内容可以在H—Flasher中设置
Setmem+32-Bit+0xE002C014+0x0F814914 //设置总线模式
Setmem+32-Bit+0xFFE00000+0x1000FFEF //设置CS0
Setmem+32-Bit+0xFFE00004+0x1000FFEF //设置CS1
如果有多个外部存储芯片,可以增加初始化内容。
lpc2200_ram.hfc
FLASH SECTION:
SST
SST39VF1601
MEMORY SECTION:
16
0x81000000
0x40000000
SCRIPT SECTION:
Setmem+32-Bit+0xE002C014+0x0F814914
Setmem+32-Bit+0xFFE00000+0x1000FFEF
Setmem+32-Bit+0xFFE00004+0x1000FFEF

2009年6月18日星期四

hjtag Setting

恒通pcima卡 卡要在关机时插入,修改设置后要重起。









在恒通卡上插入easyjtag-h,连接板子jtag口。插入板子电源。双击H-jatag.



进入H-jata, setting设置








进入operation菜单, detect tagart. 可以看见

2009年6月17日星期三

周立功的lpc2100的启动代码的一个bug

http://ponymaggie.blog.sohu.com/115672010.html
在调试CAN的时候,发现了周立功的lpc2100的启动代码的一个bug. 写下来希望大家能避免。
以前做ARM7用过lpc2214和lpc2210,lpc2109这种lpc21xx系列的芯片是第一次用. 本以为启动代码可以通用,程序运行时才发现老是跑到数据中止中断里. 调了好久才发现是分散加载文件的问题.

找到mem_c.scf或mem_a.scf文件(两个文件的内容是一样的), 它原来的代码是这样的:

ROM_LOAD 0x00000000

{

ROM_EXEC 0x00000000

{

Startup.o (vectors, +First)

* (+RO)

}



IRAM 0x40000000

{

Startup.o (MyStacks)

* (+RW,+ZI)

}



HEAP +0 UNINIT

{

Startup.o (Heap)

}



STACKS 0x40004000 UNINIT

{

Startup.o (Stacks)

}

}

HEAP定位堆栈的底部,堆栈底的位置在ZI之上所以使用"+0",heap会从此地址增加。

STACKS定位堆栈顶,堆栈顶的位置在可以用来作为存储的内存的顶部。Stacks会从堆栈顶的地址下降。

算一下就可以知道, 从0x40000000到0x40004000是16kB,但是lpc2109只有8k的片内RAM.这就是为什么程序会进入数据中止中断里. 把0x40004000改成0x40002000后,程序运行正常. 另外如果要在ram里单步调试的话, 也要相应把mem_b.scf里的设置改一下. 方法同上.

2009年6月1日星期一

样才能让 keil realview 即能编译51单片机编译arm

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1915313&bbs_page_no=1&search_mode=4&search_text=zhangfan&bbs_id=9999

C51现在最新8。18;MDK最新3.50。两个同时安装,目标目录相同(c:\keil\)。LicManager正确注册51和MDK的Key,在建工程时,选芯片的时候就自动确认工具练了。
没有想象的那样要arm,51分别装在两个目录下,一个目录下(c:\keil\)即可。

关注者