[ZLG-MCU] 关于JTAG锁死问题,必须要引起重视!

[复制链接]
19282|36
 楼主| zlgmcu 发表于 2008-3-13 10:09 | 显示全部楼层 |阅读模式
<big><br />  现在,调试LM3S系列单片机一般采用JTAG接口。用户在使用过程中,可能会出现芯片的JTAG接口锁死的问题,即用LM&nbsp;LINK调试器(或其它JTAG调试器)再也无法连接的情况。<br /><br />  一旦JTAG接口被锁死,则芯片一般只有报废处理(可联系我们维修)!!因此,我们在编写程序时千万要引起足够的重视,必须插入预防JTAG失效的代码。<br /><br />  导致芯片JTAG接口被锁死的原因有多种,如与JTAG接口复用的GPIO被占用、程序中存在定时中断(或其它中断)等等,但最常见的原因还是与JTAG接口复用的GPIO被占用,从而导致上电后JTAG调试器来不及与芯片连接。<br /><br />  附件Demo例程是个操作GPIO的简单示例,里面自带防止JTAG失效的代码,请先参考。该程序的工作原理是:将可以预防JTAG锁死的函数WaitJTAG()插入到main()函数的第一个可执行;芯片正常复位情况下,直接运行后面的代码,即WaitJTAG()函数不影响正常的操作;如果需要JTAG连接,则先按住KEY不松手,再复位,则程序进入一个死循环里,以等待JTAG连接。<br /><br />  例程中采用的按键KEY是PA2,配置为:<br />#define&nbsp;&nbsp;KEY_PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_PERIPH_GPIOA<br />#define&nbsp;&nbsp;KEY_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTA_BASE&nbsp;,&nbsp;GPIO_PIN_2<br /><br />  KEY配置为其它GPIO管脚也可以,例如PD4:<br />#define&nbsp;&nbsp;KEY_PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_PERIPH_GPIOD<br />#define&nbsp;&nbsp;KEY_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTD_BASE&nbsp;,&nbsp;GPIO_PIN_4<br /><br />  但是,要注意,KEY不可配置为与JTAG接口复用的GPIO上。<br /><br />  硬件电路设计注意事项。附件里还有一份LM3S系列单片机最小系统电路原理图及电路说明,请认真参考。作为预防JTAG失效的按键KEY当然不能接在与JTAG接口复用的GPIO上,程序当中也不能进行错误的配置。<br /><br /><br />附:与JTAG接口复用的GPIO管脚<br />=====================<br />GPIO管脚&nbsp;&nbsp;&nbsp;&nbsp;JTAG接口<br />---------------------<br />&nbsp;&nbsp;PB7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/TRST<br />&nbsp;&nbsp;PC0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCK<br />&nbsp;&nbsp;PC1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMS<br />&nbsp;&nbsp;PC2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TDI<br />&nbsp;&nbsp;PC3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TDO<br />=====================<br /></big><br /><br />(zlgmcu_wdx)<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20083/200831310914115.rar'>https://bbs.21ic.com/upfiles/img/20083/200831310914115.rar</a>
农民讲习所 发表于 2008-3-13 10:13 | 显示全部楼层

能不能使用极低的工作频率解决

这样可以还未到执行JTAG相关IO设置时,JTAG提前连接?<br />
 楼主| zlgmcu 发表于 2008-3-13 10:39 | 显示全部楼层

我试过,好像不行,会出现连接超时错误

(zlgmcu_wdx)
Andy1990zx 发表于 2008-3-13 11:22 | 显示全部楼层

请问这种维修要不要钱?

请问这种解锁维修要不要钱?
Andy1990zx 发表于 2008-3-13 11:42 | 显示全部楼层

DEMO程序不太好~

这是光盘里的DEMO<br />**--------------File&nbsp;Info-------------------------------------------------------------------------------<br />**&nbsp;File&nbsp;Name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;demo.c<br />**&nbsp;Last&nbsp;modified&nbsp;Date:&nbsp;&nbsp;2006-11-15&nbsp;<br />**&nbsp;Last&nbsp;Version:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v1.0<br />**&nbsp;Description:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cross&nbsp;Studio&nbsp;for&nbsp;ARM&nbsp;Demo程序<br />**&nbsp;<br />**------------------------------------------------------------------------------------------------------<br />**&nbsp;Created&nbsp;By:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Zhou&nbsp;Lishan<br />**&nbsp;Created&nbsp;date:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006-11-15&nbsp;<br />**&nbsp;Version:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v1.0<br />**&nbsp;Descriptions:<br />**<br />**------------------------------------------------------------------------------------------------------<br />**&nbsp;Modified&nbsp;by:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kang&nbsp;qinhua<br />**&nbsp;Modified&nbsp;date:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008.01.18<br />**&nbsp;Version:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v1.1<br />**&nbsp;Description:<br />**<br />********************************************************************************************************/<br />#include&nbsp;&quot;hw_ints.h&quot;<br />#include&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&quot;gpio.h&quot;<br />#include&nbsp;&quot;sysctl.h&quot;<br /><br />#define&nbsp;PINS&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PIN_4<br /><br />void&nbsp;delay(int&nbsp;d)<br />{<br />&nbsp;&nbsp;for(&nbsp;;&nbsp;d;&nbsp;--d);<br />}<br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlClockSet(SYSCTL_SYSDIV_1&nbsp;|&nbsp;SYSCTL_USE_OSC&nbsp;|&nbsp;SYSCTL_OSC_MAIN&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_XTAL_6MHZ);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTC_BASE,&nbsp;GPIO_PIN_4,&nbsp;GPIO_DIR_MODE_OUT);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTC_BASE,&nbsp;PINS,&nbsp;PINS);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(200000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTC_BASE,&nbsp;PINS,&nbsp;~PINS);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(200000);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />}<br /><br />首先,没加放JTAG失效的代码<br />然后,使用的是PC4(LED4)&nbsp;&nbsp;让很多粗心的人没有看清楚的就直接以为PC4-LED4,联想到PC2-LED2,PC3-LED3.................,而恰好PC2&nbsp;PC3都是JTAG引脚......<br />如果换用LED1就不会有这个问题了&nbsp;^_^
农民讲习所 发表于 2008-3-13 11:43 | 显示全部楼层

做个RS触发电路,JTAG有信号时RESET释放?

  
 楼主| zlgmcu 发表于 2008-3-13 13:39 | 显示全部楼层

开发板在保修期内维修一般是免费的

详细请咨询维修人员。<br /><br />(zlgmcu_wdx)
 楼主| zlgmcu 发表于 2008-3-14 08:46 | 显示全部楼层

5楼说到点子上了,光盘Demo确实存在误导的嫌疑

我们在下次修订产品版本时,会解决此问题的。<br /><br />(zlgmcu_wdx)
zheng79 发表于 2008-3-14 09:23 | 显示全部楼层

不明白

调试器不会复位CPU,再连接的吗?
wkman 发表于 2008-3-14 14:12 | 显示全部楼层

汗.还好,从来jtag口都是空出的,没有复用过...

  
liyihe 发表于 2008-3-18 21:07 | 显示全部楼层

jtag锁死了,北京的找谁维修

jtag锁死了,北京的找谁维修
apple163 发表于 2008-3-19 08:44 | 显示全部楼层

其实方法可以扩展到很多种;

比如你的IO很紧张(复用JTAG说明特别紧张),舍不得那个IO。你可以通过UART,SPI,IIC,等设置成等待JTAG。不过最好不要使用死循环,进入定时等待就可以了。一但等待JTAG超时还是要继续运行用户目标程序的,死循环不是什么好方案!
machunshui 发表于 2008-3-19 10:49 | 显示全部楼层

这岂不是一个比较严重的bug

&quot;导致芯片JTAG接口被锁死的原因有多种,如与JTAG接口复用的GPIO被占用、程序中存在定时中断(或其它中断)等等&quot;<br /><br />要是有&quot;程序中存在定时中断(或其它中断)等等,jtag就锁死导致芯片报废你“,<br /><br />这岂不是一个比较严重的bug?
machunshui 发表于 2008-3-19 11:00 | 显示全部楼层

应该要求luminary,从硬件上防止啊

应该要求luminary,从硬件上防止,<br /><br />或者编译器厂家修改jtag驱动解决,<br /><br />TJTAG可以无响应,<br /><br />但不能烧片子。
xwj 发表于 2008-3-19 11:22 | 显示全部楼层

是的,设计逻辑不完善造成的

应该象AVR一样,只有烧写熔丝才能关掉JTAG,不关JTAG的话对应IO口不能做IO使用<br /><br />至少关键引脚应该要有强制进入JTAG的逻辑
machunshui 发表于 2008-3-19 11:28 | 显示全部楼层

片子报废,这种事情最讨厌了。

片子报废,这种事情最讨厌了。<br /><br />以前象TI的tms320f2812,如果烧写flash时候,复位或者调电,flash就锁死了,<br />片子就报废,板子也基本报废。<br /><br />现在,没想到luminary也有JTAG锁死的情况。
machunshui 发表于 2008-3-20 08:16 | 显示全部楼层

zlg的解决方法仍然又缺陷

”芯片正常复位情况下,直接运行后面的代码,即WaitJTAG()函数不影响正常的操作;如果需要JTAG连接,则先按住KEY不松手,再复位,则程序进入一个死循环里,以等待JTAG连接。“<br /><br />用户要是忘记按key键盘,仍然会烧片子。<br /><br />先运行一个定时查询函数,可行否?<br /><br />zlg应该测试出lmlink的连接时间,保证定时查询函数的执行事件远远大于lmlink连接,<br /><br />可行否?
xhtxzxw 发表于 2008-3-20 16:43 | 显示全部楼层

嘿嘿

把晶体焊下来,再连接JTAG,删除flash,是不是就可以了?
machunshui 发表于 2008-3-20 17:10 | 显示全部楼层

原来不是硬件损坏

原来不是硬件损坏,而是每次jtag都来不及连接从而导致芯片报废。<br /><br />看来只有等lunminary出带固化bootloader的芯片,就没事了。
machunshui 发表于 2008-3-20 17:11 | 显示全部楼层

要是18楼的可行

要是18楼的可行,<br />这真是绝招!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

81

主题

1146

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部