JTAG的使用心得

发布者:快乐时刻最新更新时间:2011-09-28 关键字:JTAG 手机看文章 扫描二维码
随时随地手机看文章

  本人把这一段使用JTAG的一些心得写出来,希望能够对初学者有所帮助。

  通常所说的JTAG大致分两类,一类用于测试芯片的电气特性,检测芯片是否有问题;一类用于Debug;一般支持JTAG的CPU内都包含了这两个模块。

  一个含有JTAG Debug接口模块的CPU,只要时钟正常,就可以通过JTAG接口访问CPU的内部寄存器和挂在CPU总线上的设备,如FLASH,RAM,SOC(比如4510B,44Box,AT91M系列)内置模块的寄存器,象UART,Timers,GPIO等等的寄存器。

  上面说的只是JTAG接口所具备的能力,要使用这些功能,还需要软件的配合,具体实现的功能则由具体的软件决定。

  例如下载程序到RAM功能。了解SOC的都知道,要使用外接的RAM,需要参照SOC DataSheet的寄存器说明,设置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

  setmem 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显得很繁忙。

  总的来说,本人认为,对于个人爱好者来说,第二种方法更可取。

关键字:JTAG 引用地址:JTAG的使用心得

上一篇:Cortex-M4时代,忘掉MCU吧
下一篇:Fujitsu内置FR81S内核的高性能32位微控制器方案

推荐阅读最新更新时间:2024-03-16 12:42

STM32按键输入程序
简介:这是一个STM32按键输入程序,配有原理图及相关程序解析。KEY_Scan函数频繁调用了JTAG_Set函数,每次按键扫描的时候都禁用了JTAG和SWD。 原理图: 程序: delay_init();延时函数,以后再讲 LED_Init();KEY_Init();初始化LED灯何按键为上拉输入 KEY_Scan();
[单片机]
STM32按键输入程序
OK6410A 开发板 (八) 83 linux-5.11 OK6410A arm-gdb+JLinkGDBServer+Jlink+JTAG接口 调试 u-boot
之前在 https://blog.csdn.net/u011011827/article/details/118713517 中可以看到 可以调试裸机. 可见我加载了bin文件到0x50000000,这是外部sdram的空间 所以加载之前,必须要初始化,而这个初始化动作,u-boot帮忙给做了(我的板子烧好了u-boot) 在调试裸机前u-boot已经跑到cmdline了 当然你调试bin文件大小小于8KB的裸机程序时,可以将其加载到sram中,这样就不用初始化sdram了. 自己手动加载u-boot 到内存 u-boot 也是一个裸机程序,这个程序和 led.bin 不同 u-boot.bin 要大,但是两个的调试方
[单片机]
stm32f103系列芯片JTAG口当做普通IO使用
使用的芯片是stm32f103c8t6. 今天在调试板子时发现在PA15口上的LED灯无论输出高还是低都只有一个中间电平2.3V,后来百度说这个口(PA15--JTDI)默认用作JTAG调试口,需要配置下成普通IO口,于是按照那人的办法写了2句:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); 不写还好,一写呵呵哒,结果连原本用来下载、调试程序用的SWD口都不能用了。。。后来在STM32库中找到了正确的写法:RCC_APB2PeriphClockCmd(RCC_APB2Peri
[单片机]
利用单片机实现CPLD的在系统编程
一、问题的提出 嵌入式系统而灵活性的要求。一方面,应用环境会对嵌入式系统不断提出新的要求,需要更改最初的设计;另一方面指生产多个品种时希望尽量能在单一的硬件平台上实现。为了最大限度地满足灵活性的需要,嵌入式系统一般都设计而可编程逻辑器件CPLD。在设计阶段和现场运行之后的各个阶段,都可能会遇到设计的升级、修改和测试问题。FLASH的使用方便了程序的更新;带而在系统可编程(ISP)功能的可编程逻辑器件,使得不需重新设计印制板就可以改变原而的设计;网络技术的发展,又使得远程维护成为可能。 笔者设计的嵌入式系统,实现了远程维护,其组成结构如图1所示。其中CPLD采用了XILINX公司的XC9500系列。 二、JTAG简介
[单片机]
利用单片机实现CPLD的在系统编程
多核环境中的高效率调试方法
  毫无疑问,多核多线程是未来处理器的发展方向。回首处理器的发展历程,并行技术从指令级的超标量发展到线程级的超线程或者并发多线程,再到今天处理 器级的多内核,总的趋势都没有改变。英特尔、Sun和IBM等大公司目前已经投身到多核或者多线程技术的浪潮之中。当今的网络应用日趋复杂,对性能的要求 不断提高,无论是需求推动技术,还是技术激发了新的需求,并行技术都将是未来信息基础设施建设的必然选择。   对于嵌入式装置而言,多核技术可以提供更高的处理器性能、更有效的电源利用率,并且占用更少的物理空间,因而具有许多单核处理器无法具备的优势。与多核解决方案如影随形的,就是多处理器技术,也就是在同一块电路板或同一个集成系统中包含多个处理器。  
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved