6983|4

238

帖子

2

TA的资源

纯净的硅(高级)

楼主
 

lm3s 引脚死锁原理及解决办法! [复制链接]

lm3s 引脚死锁原理及解决办法!

GPIOAFSEL 寄存器是模式控制选择寄存器。向该寄存器中的任意位写“1”表示选择该GPIO线路为备用硬件控制(功能)所用。由于所有的位都在复位时都会清零,因此在默认的情况下,这些GPIO线路设置GPIO模式。对JTAG/SWD管脚的模式控制需要确认控制寄存器提供确认,其它的所有管脚的模式控制只依赖于GPIOAFSEL 寄存器。

确认控制寄存器提供一个保护层,以防止对重要的硬件外设进行意外编程。对 GPIOAFSEL保护位的写操作是没有用的,除非GPIOLOCK已被解锁GPIOCR的相应位已设为1,这时对GPIOAFSEL对应位进行写操作才有效。

重要: 除了5JTAG/SWD管脚(PB7 PC[3:0])之外,如图所示,所有GPIO管脚默认都是三态管脚(GPIOAFSEL=0, GPIODEN=0, GPIOPDR=0, GPIOPUR=0)。JTAG/SWD 管脚默认为 JTAG/SWD 功能(GPIOAFSEL=1, GPIODEN=1 GPIOPUR=1),如图1.2.13所示。通过上电复位(POR)或外部复位(RST),可以让这两组管脚都回到其默认状态。

默认情况其它管脚


如果JTAG管脚在设计中用作GPIO,那么PB7PC2不能同时接外部下拉电阻。如果这两个管脚在复位过程都被拉至低电平,那么控制器会出现不可预测的行为。一旦这种情况发生,应移除其中一个下拉电阻,或者把两个下拉电阻都移除,并且使用RST复位或关机后重新上电。

运用程序编程过程中,不注意配置JTAG/SWD管脚(PB7 PC[3:0])会让芯片死锁,死锁是怎么发生的呢?

死锁过程

在上电的一瞬间,由于处理器的运行速度很快,程序代码立即将JTAG管脚变成它们的GPIO功能,那么在JTAG管脚功能切换前调试器(下载器)将没有足够的时间T去连接和中止控制器。这会将调试器(下载器)锁在元件外,这就是死锁的原因。一但死锁,芯片几乎没法再使用。通过使用一个基于外部或软件的触发器来恢复JTAG功能的软件程序就可以避免这种情况发生。在IO数量足够的情况下,不使用JTAG管脚的GPIO功能,这样就不会让芯片死锁。

例如:配置GPIO模式。

#define HWREG(x)  (*((volatile unsigned long *)(x)))

#define GPIO_O_DIR                0x00000400

#define GPIO_DIR_MODE_IN        0x00000000 

#define GPIO_DIR_MODE_OUT      0x00000001 

#define GPIO_DIR_MODE_HW       0x00000002     

GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulPinIO)

{

    ASSERT(GPIOBaseValid(ulPort));

    ASSERT((ulPinIO == GPIO_DIR_MODE_IN) || (ulPinIO == GPIO_DIR_MODE_OUT) ||

           (ulPinIO == GPIO_DIR_MODE_HW));

   HWREG(ulPort + GPIO_O_DIR) = ((ulPinIO & 1) ?

                                  (HWREG(ulPort + GPIO_O_DIR) | ucPins) :

                                  (HWREG(ulPort + GPIO_O_DIR) & ~(ucPins)));

   HWREG(ulPort + GPIO_O_AFSEL) = ((ulPinIO & 2) ?

                                    (HWREG(ulPort + GPIO_O_AFSEL) | ucPins) :

                                    (HWREG(ulPort + GPIO_O_AFSEL) & ~(ucPins)));

}


同时,对于lm3s处理器可以使用lm-link和LMFlashProgrammer.msi进行解锁!在此就不具体描述!

还有另外一种方法,也是最基本、最有效的方法:

如果软件配置任意一个JTAG/SWD 管脚为 GPIO,并且失去与调试器进行通信的能力,则有一个调
试序列可用来恢复器件。当保持器件在复位期间大量擦除Flash存储器时,执行总共10个 JTAG到SWD 和 SWD到JTAG的切换序列。

恢复器件的序列为:

1. 发出和保持 RST 信号。
2. 执行 JTAG到SWD 的切换序列。
3. 执行 SWD到JTAG的切换序列。
4. 执行 JTAG到SWD 的切换序列。
5. 执行 SWD到JTAG的切换序列。
6. 执行 JTAG到SWD 的切换序列。
7. 执行 SWD到JTAG的切换序列。

8. 执行 JTAG到SWD 的切换序列。
9. 执行 SWD到JTAG的切换序列。
10. 执行 JTAG到SWD 的切换序列。
11. 执行 SWD到JTAG的切换序列。
12. 释放 RST 信号。
JTAG到SWD 和 SWD到JTAG 的切换序列在 “ARM 串行线调试(SWD)” 在 42页中描述。当执行
切换序列以用于恢复器件的调试功能时,应该仅执行切换序列的步骤1和步骤2。




最新回复

没图啊。。。可惜了。、  详情 回复 发表于 2012-6-30 14:36
 
点赞 关注
个人签名QQ:1795100002
E-mail:paulhyde@qq.com

回复
举报

1729

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
楼主,图挂了。
 
 

回复

231

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
LMFlashProgrammer.msi怎么解锁?
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 MouseCat 的帖子

如果出现JTAG接口连接失效的情况,可以通过LMFlashProgrammer编程工具软件来解锁。该软件可以在广州周立功单片机网站“http://www.ZLGMCU.com”或Luminary Micro官方网站“http://www.LuminaryMicro.com”下载到。解锁操作的具体步骤是:
􀁺 运行LMFlashProgrammer软件,把JTAG Speed(Hz)调到100,000以下;
􀁺 点击在Flash Utilties选项卡里的Erase按钮进行擦除操作,看能否恢复连接;
􀁺 如果不行,则切换到Other Utilties选项卡,在Debug Port Unlock复选框里选择芯片的家族:LM3S1000以下的为Sandstorm(沙暴)家族,LM3S1000以上的为Fury(狂暴)和DustDevil(尘魔)家族;
􀁺 先按住复位键不松手,再点击Other Utilties选项卡里的Unlock按钮进行解锁操作;
􀁺 操作完成后重新复位芯片即完成解锁操作,同时片内Flash内容也被擦除。
需要当心的是:对于Sandstorm家族(即LM3S100、300、600、800等),一旦JTAG接口因为误将其无防护地配置为GPIO接口而被锁定,则有可能再也无法恢复。为了防患于未然,我们建议在编写每一个应用程序时都必须要在main( )函数的开始处插入一段能够预防JTAG失效的代码(对于Fury和DustDevil家族也推荐这样做)。在Demo例程中jtagWait( )函数就是预防JTAG失效的范例代码,请认真参考。该函数的工作原理是:
􀁺 将能够有效预防JTAG失效的函数jtagWait( )插入到main( )函数的开始处;
如果出现JTAG接口连接失效的情况,可以通过LMFlashProgrammer编程工具软件来解锁。该软件可以在广州周立功单片机网站“http://www.ZLGMCU.com”或Luminary Micro官方网站“http://www.LuminaryMicro.com”下载到。解锁操作的具体步骤是:
􀁺 运行LMFlashProgrammer软件,把JTAG Speed(Hz)调到100,000以下;
􀁺 点击在Flash Utilties选项卡里的Erase按钮进行擦除操作,看能否恢复连接;
􀁺 如果不行,则切换到Other Utilties选项卡,在Debug Port Unlock复选框里选择芯片的家族:LM3S1000以下的为Sandstorm(沙暴)家族,LM3S1000以上的为Fury(狂暴)和DustDevil(尘魔)家族;
􀁺 先按住复位键不松手,再点击Other Utilties选项卡里的Unlock按钮进行解锁操作;
􀁺 操作完成后重新复位芯片即完成解锁操作,同时片内Flash内容也被擦除。
需要当心的是:对于Sandstorm家族(即LM3S100、300、600、800等),一旦JTAG接口因为误将其无防护地配置为GPIO接口而被锁定,则有可能再也无法恢复。为了防患于未然,我们建议在编写每一个应用程序时都必须要在main( )函数的开始处插入一段能够预防JTAG失效的代码(对于Fury和DustDevil家族也推荐这样做)。在Demo例程中jtagWait( )函数就是预防JTAG失效的范例代码,请认真参考。该函数的工作原理是:
􀁺 将能够有效预防JTAG失效的函数jtagWait( )插入到main( )函数的开始处;
􀁺 芯片正常复位时,由于KEY没有被按下,因此会直接运行后面的代码,即jtagWait( )函数不影响正常的操作;
􀁺 当需要JTAG连接时,先按住KEY不松手,再复位,则程序进入一个死循环,以等待JTAG连接,在此状态下连接是非常可靠的。
有了jtagWait( )函数的保障,我们就可以放心大胆地使用与JTAG接口复用的GPIO了,不必担心JTAG接口再被锁死的问题了!另外,我们还可以充分利用JTAG接口的这一特性来为自己的程序加密,以防非法复制。􀁺 芯片正常复位时,由于KEY没有被按下,因此会直接运行后面的代码,即jtagWait( )函数不影响正常的操作;
􀁺 当需要JTAG连接时,先按住KEY不松手,再复位,则程序进入一个死循环,以等待JTAG连接,在此状态下连接是非常可靠的。
有了jtagWait( )函数的保障,我们就可以放心大胆地使用与JTAG接口复用的GPIO了,不必担心JTAG接口再被锁死的问题了!另外,我们还可以充分利用JTAG接口的这一特性来为自己的程序加密,以防非法复制。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

5
 
没图啊。。。可惜了。、
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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