新闻  |   论坛  |   博客  |   在线研讨会
简易JTAG调试
zhchxgh | 2009-07-12 01:03:26    阅读:3057   发布文章

许多朋友在应用简易JTAG调试和用我写的方法烧写程序的时候出现一些问题,因此我在这篇文章中详细解析大家所遇到的问题,以及解决的方法,避免以后学习的人再犯同样的错误,浪费宝贵的学习时间。
正常调试程序我们是应该用仿真器的,它调试稳定而且速度很快,不过它的不菲的价格也令很多希望学习ARM的朋友望而却步,因此价格便宜的简易JTAG就成了一种流行的折衷方案。但是正是由于它的“简易”给大家使用中制造许多麻烦,以至于要拿出一定的时间和精力来学习怎样能正确的使用它。下面我把大家经常出现的问题以及解决的方法列出来,以飨大家:
第一个问题就是烧写的问题,网上比较流行的两个通过简易JTAG烧写程序的软件就是FLUTED和FLASHPGM。FLUTED是一种WIN98下运行的比较简单的烧写软件,目前许多网友通过PORTTALK打开相应的硬件端口也可以在WIN2000下应用FLUTED软件。但是此软件烧写速度很慢,几十K的程序需要烧写十几分钟,而且烧写成功率比较低。根据我实际应用的经验,主要还是JTAG下载时复位有问题,需要关闭开发板的电源,等一会再上电,烧写时成功的几率就比较大了。另一个烧写软件就是FLASHPGM,此软件有良好的GUI操作界面,下载速度和成功率也很高,然而它的烧写速度与通过网口烧写的速度是无法比拟的。而且关于它的烧写方法即使中国EDA技术网提供了演示动画,大家在应用时也会出现一些问题,同时它需要WIGGLER接口小板的支持。
第二个问题就是调试的问题,通过简易JTAG调试程序需要先执行一个JTAG.EXE的软件在后台运行,此软件也是一个WIN98下的应用软件,也可以通过PORTTALK打开相应的硬件端口在WIN2000下应用。目前网上也提供了专门在WIN2000下应用的JTAG2000.EXE软件,可以直接在WIN2000下应用,具体装载方法请参阅软件包的说明文件。一般简易JTAG只支持SDT调试环境,虽然网上有支持通过简易JTAG在ADS集成环境中调试的软件包,但由于调试速度很慢,大家很少应用。JTAG.EXE软件原理是把发送到以太网的数据拦截下来,遵从JTAG协议,转换到并口上面,然后通过JTAG接口板,控制ARM板上面的CPU,进行硬件Debug调试的。但是我们在实际应用中发现,此软件对下载到SDRAM中的程序缺乏验证机制,也就是说虽然集成环境中显示下载成功,我们却不知道下载的数据是否正确。甚至我们在测试中发现,从开发板上取下简易JTAG,下载程序,在PC机的集成环境中仍旧显示下载成功。因此大家在单步调试程序的时候,程序跑飞那就是很自然的事情了。不过调试中单步程序跑飞,一般有几种原因:一是板子上的SDRAM没有驱动,二是下载程序不正确,三是下载的程序本身有BUG,四是简易JTAG调试有时候也不稳定,当然简易JTAG调试不稳定导致程序跑飞的时候很少,最后就有可能是你的板子硬件有问题了。
以上谈了简易JTAG的烧写和调试中遇到的一些问题,有些跑题,不过这些问题是大家经常遇到的,我通过此文一并提出来,希望大家能尽快上手学习ARM,而不要在一些小问题上浪费时间。下面我就详细介绍怎样通过网口烧写程序,虽然我在网上已经写过类似的文章,但文章的前提是板子中已经预烧了程序,其中暗含的意思就是我们已经初始化了板子上的SDRAM存储器。而这篇文章我会详细的教会大家怎样在没有预烧了程序的板子中(也就是说可以是空白的FLASH并没有初始化SDRAM),一步步通过网口烧入程序。
由于大家多数都是简易JTAG,因此我演示应用的集成调试环境是SDT251的ADW,当然此方法也可以在ADS中应用,但ADS调试是需要用到仿真器。用仿真器也可以用此方法烧写程序,就不用单独编写烧写软件了。
首先我们按照开发板的说明书正确连接开发板的硬件,需要有网线和串口线,串口线连接到开发板的串口0。此时如果我们面对的是一个没有任何程序的开发板,而我们要通过网口烧写程序,需要先把程序下载到SDRAM中去,因此我们第一项任务就是驱动SDRAM。驱动开发板的SDRAM非常简单,我们只要正确的配置ARM芯片的有关SDRAM的内部寄存器就可以了。我们可以通过SDT251集成调试环境中的armsd commands的let命令来配置寄存器(armsd commands调试命令详细说明请参阅ARM SDT参考指南的7.4节),具体的配置方法如下:
执行JTAG2000.EXE软件,让其在后台运行。然后打开SDT251的调试软件ADW,按照配置简易JTAG的方法正确配置目标环境,具体方法请参阅相关文章。接着在调试软件ADW的命令窗口输入:
let 0x01C80000=0x11110101
let 0x01C80004=0x00000600
let 0x01C80008=0x00007ffc
let 0x01C8000C=0x00007ffc
let 0x01C80010=0x00007ffc
let 0x01C80014=0x00007ffc
let 0x01C80018=0x00007ffc
let 0x01C8001C=0x00018000
let 0x01C80020=0x00018000
let 0x01C80024=0x0086060e
let 0x01C80028=0x10
let 0x01C8002C=0x20
let 0x01C80030=0x20
let命令直接把初始化数据写入指定的寄存器,关于配置数据的意义请参考44B0X的手册(163页)。初始化后我们就可以在SDT251中把程序下载到SDRAM中进行调试了。
我们也可以将命令事先写道一个文本文件中(如:memcfg.txt),通过obey命令来调用执行文件中的armsd commands命令,如图:

选择FILE->LOAD IMAGE导入工程中的model.axf文件。您可以在中国EDA技术网的ARM论坛免费下载包含此文件的整个工程以及程序源代码,工程名压缩包文件名为51EDA_Bios。
以前的文章中我用的是串口调试软件sscom32,此次我介绍一下如何应用WINDOWS中的超级终端进行调试。超级终端的设置方法如下:打开WIN2000的程序->附件->通讯->超级终端,如图所示:

将会弹出如下窗口:

输入任意名字,如:UART1,按“确定”弹出如下窗口:

由于我们是通过串口1来与开发板进行通信,因此直接按“确定”就可以了。按照下图选择波特率115200,8位数据,无奇偶校验,1位停止位,无数据流控制,按“确定”设置完毕。

此时我们回到SDT251的DUGGER窗口全速执行程序,在超级终端将会出现如下提示信息:
Bios for S3C44B0x
Flash ID is : 278200bf
IP address : 192.168.111.8
Build date:Dec 23 2003-20:18:31
\>
在提示符后输入load 0c00f000(load后面的地址可以为任意值,但不要超出SDRAM的地址范围,load与地址之间应该有空格)
此时将会出现如下提示信息:
No begin address for download, use address 0xc00f000
Load image file from host
Type tftp -i 192.168.111.8 put filename at the host PC
Press ESC key to exit
由于我们程序中网口采用的是查询方式,因此这时不要按下ESC键。
执行程序->附件->命令提示符,如果您在C:提示符后输入ping 192.168.111.8可ping通板子,命令提示符窗口会显示相应的信息。然后在此提示符后输入tftp -i 192.168.111.8 put C:\model.bin(路径是你要烧写的程序的路径)。回车后在超级终端窗口会出现以下提示信息:
Begin to receive filename: model.bin, transtype: octet. 
TFTP transfer finished, and receive ba50 bytes.
此处“receive ba50 bytes”是一条有用的信息,ba50是你要烧写程序的大小。
同时在命令提示符窗口也会看到Transfer successful: 47696 bytes in 1 second, 47696 bytes/s的提示信息。
在超级终端窗口中的提示符后输入prog 0 0c00f000 ba50 -no0(程序大小根据你烧写程序时上一步的提示显示而定,不一定是这里ba50)。这时超级终端窗口中会显示:
program flash begin @0x0, from ram data @0xc00f000, size = 47696Bytes
Are you sure? [y/n]
按y键
超级终端窗口中会显示:
Erase sector 0x0
program ok
Erase sector 0x3000
program ok
Erase sector 0x4000
program ok
......
烧写时间根据你的程序大小而定,我的程序几十K,烧写时间不到2秒。此时按下复位键就可以执行你新烧入的程序了。
上面我写的过程比较详细,包括了每一步的提示信息和图示,感觉好像比较繁琐,实际上大家只要熟练应用,就会感到通过网口烧写程序是非常快捷方便的。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客