lm3s 引脚死锁原理及解决办法!
GPIOAFSEL 寄存器是模式控制选择寄存器。向该寄存器中的任意位写“1”表示选择该GPIO线路为备用硬件控制(功能)所用。由于所有的位都在复位时都会清零,因此在默认的情况下,这些GPIO线路设置GPIO模式。对JTAG/SWD管脚的模式控制需要确认控制寄存器提供确认,其它的所有管脚的模式控制只依赖于GPIOAFSEL 寄存器。
确认控制寄存器提供一个保护层,以防止对重要的硬件外设进行意外编程。对 GPIOAFSEL保护位的写操作是没有用的,除非GPIOLOCK已被解锁GPIOCR的相应位已设为1,这时对GPIOAFSEL对应位进行写操作才有效。
重要: 除了5个JTAG/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,那么PB7和PC2不能同时接外部下拉电阻。如果这两个管脚在复位过程都被拉至低电平,那么控制器会出现不可预测的行为。一旦这种情况发生,应移除其中一个下拉电阻,或者把两个下拉电阻都移除,并且使用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。