通常所说的jtag大致分两类,一类用于测试芯片的电气特性,检测芯片是否有问题;一类用于debug;一般支持jtag的cpu内都包含了这两个模块。
一个含有jtag debug接口模块的cpu,只要时钟正常,就可以通过jtag接口访问cpu的内部寄存器和挂在cpu总线上的设备,如flash,ram,soc(比如4510b,44box,at91m系列)内置模块的寄存器,象uart,timers,gpio等等的寄存器。
上面说的只是jtag接口所具备的能力,要使用这些功能,还需要软件的配合,具体实现的功能则由具体的软件决定。例如下载程序到ram功能。了解soc的都知道,要使用外接的ram,需要参照socdatasheet的寄存器说明,设置ram的基地址,总线宽度,访问速度等等。
有的soc则还需要remap,才能正常工作。运行firmware时,这些设置由firmware的初始化程序完成。但如果使用jtag接口,相关的寄存器可能还处在上电值,甚至时错误值,ram不能正常工作,所以下载必然要失败。要正常使用,先要想办法设置ram。在adw中,可以在console窗口通过let 命令设置,在axd中可以在console窗口通过set命令设置。
下面是一个设置at91m40800的命令序列,关闭中断,设置cs0-cs3, 并进行remap,适用于axd(ads带的debug)
setmem 0xfffff124,0xffffffff,32 ---关闭所有中断
setmem 0xffe00000,0x0100253d,32 ---设置cs0 0xffe00004,0x02002021,32 ---设置cs1
setmem 0xffe00008,0x0300253d,32 ---设置cs2
setmem 0xffe0000c,0x0400253d,32 ---设置cs3
setmem 0xffe00020,1,32 ---remap
如果要在adw(sdt带的debug)中使用,则要改为:
let 0xfffff124=0xffffffff ---关闭所有中断
let 0xffe00000=0x0100253d ---设置cs0
let 0xffe00004=0x02002021 ---设置cs1
let 0xffe00008=0x0300253d ---设置cs2
let 0xffe0000c=0x0400253d ---设置cs3
let 0xffe00020=1 ---remap
为了方便使用,可以将上述命令保存为一个文件config.ini, 在console窗口输入 ob config.ini 即可执行。
使用其他debug,大体类似,只是命令和命令的格式不同。
设置ram时,设置的寄存器以及寄存器的值必须和要运行程序的设置一致。一般编译生成的目标文件是elf格式,或类似的格式,包含有目标码运行地址,运行地址在link时候确定。debug下载程序时根据elf文件中的地址信息下载程序到指定的地址。如果在把ram的基地址设置为0x10000000, 而在编译的时候指定firmware的开始地址在0x02000000, 下载的时候,目标码将被下载到0x02000000,显然下载会失败。
通过jtag下载程序前应关闭所有中断,这一点和firmware初始化时关闭中断的原因相同。在使用jtag接口的时候,各中断的使能未知,尤其是flash里有可执行码的情况,可能会有一些中断被使能。
使用jtag下载完代码,要执行时,有可能因为未完成初始化就产生了中断,导致程序异常。所以,需要先关闭中断,一般通过设置soc的中断控制寄存器完成。使用jtag写flash。在理论上,通过jtag可以访问cpu总线上的所有设备,所以应该可以写flash,但是flash写入方式和ram大不相同,需要特殊的命令,而且不同的flash擦除,编程命令不同,而且块的大小,数量也不同,很难提供这一项功能。所以一般debug不提供写flash功能,或者仅支持少量几种flash。目前就我知道的,针对arm,只有flashpgm这个软件提供写flash功能,但使用也非常麻烦。axd,adw都不提供写flash功能。
我写flash的方法时是,自己写一个简单的程序,专门用于写目标板的flash,利用jtag接口,下载到目标板,再把要烧写的目标码装成bin格式,也下到目标板(地址和烧flash的程序的地址不同),然后运行已经下载的烧flash的程序。使用这种方式,比起flashpgm的写flash,速度似乎要快一些。
关于简单jtag电缆。
目前有各种各样简单jtag电缆,其实只是一个电平转换电路,同时还起到保护作用。jtag的逻辑则由运行在pc上的软件实现,所以在理论上,任何一个简单jtag电缆,都可以支持各种应用软件,如debug等。我就曾使用同一个jtag电缆写xilinx
cpld,axd/adw调试程序。关键再于软件的支持,大多数软件都不提供设定功能,因而只能支持某种jtag电缆。
关于简单jtag电缆的速度。jtag是串行接口,使用打印口的简单jtag电缆,利用的是打印口的输出带锁存的特点,使用软件通过i/o产生jtag时序。由jtag标准决定,通过jtag写/读一个字节要一系列的操作,根据我的分析,使用简单jtag电缆,利用打印口,通过jtag输出一个字节到目标板,平均需要43个打印口i/o, 在我机器上(p4 1.7g),每秒大约可进行660k次 i/o 操作,所以下载速度大约在660k/43, 约等于15k byte/s. 对于其他机器,i/o速度大致相同,一般在600k ~ 800k.
关于如何提高jtag下载速度。
很明显,使用简单jtag电缆无法提高速度。要提高速度,大致有两种办法,
1。使用嵌入式系统提供jtag接口,嵌入式系统和微机之间通过usb/ethernet相连,这要求使用mcu。
2。使用cpld/fpga提供jtag接口,cpld/fpga和微机之间使用epp接口(一般微机打印口都支持epp模式),epp接口完成微机和cpld/fpga之间的数据传输,cpld/fpga完成jtag时序。
这两种方法本人都实现过。第一个方法可以达到比较高的速度,实测超过了200kbyte/s(注意:是byte,不是bit);但是相对来说,硬件复杂,制造相对复杂。第二种相对来说,下载速度要慢一些,最快时达到96kbyte/s,但电路简单,制造方便,而且速度可以满足需要。第二种方案还有一个缺点,由于进行i/o操作时,cpu不会被释放,因此在下载程序时,微机cpu显得很繁忙。
总的来说,本人认为,对于个人爱好者来说,第二种方法更可取。
3D模型取代了平面效果的显示
第三代半导体关键技术——氮化镓、碳化硅
魅族Pro6plus旧旗舰降价!魅族PRO7首发联发科X30让用户木讷,双面屏能否拯救你
通用输入隔离反激式 CC/CV LED 驱动器设计
基于虚拟处理器嵌入式中间件
嵌入式开发中JTAG接口详解
摩托罗拉Razr折叠手机将在印度上市该机搭载了骁龙710处理器
物联网的应用服务有范围规定吗
爬壁微型机器人的新型建造方法
光峰科技:与国际一流车企合作的产品,将在CES2023亮相
苹果M1芯片的Mac用户在复原电脑设定时设备无法正常运转
三星Galaxy A01亮相 定位大容量入门级百元机
滴滴正式启动造车项目 造车是互联网风口项目?
各路神仙都有套现腾讯股票 腾讯三个月蒸发6500亿
耐低温水表的原理及设计
人工气候室作用、功能分析
如何提高开态电路取电能力避免出现宕机的现象呢
东芝业务重组,华硕联想争夺东芝PC业务
安全PLC和普通PLC的区别 PLC能否代替安全控制器?
芯圣电子脚位兼容S003系列单片机—HC18M003介绍