【经验分享】LPC824 SWD引脚复用为普通GPIO注意点
一,文档说明
写这篇文档的目的是帮助有些网友在使用LPC824芯片的时候,因为引脚不够,想把SWD引脚,SWD功能禁止掉,然后复用为普通的GPIO功能。前不久,有客户在使用这个功能的时候,遇到了些非常难以琢磨的问题,所以我这边把相关经验分享出来,免得需要用同样功能的网友浪费时间去走弯路。
二,问题详情
使用官方的开发板LPCXpresso824 MAX 板,以及官方的SDK代码或者code bundle代码,在禁止SWD功能之后,初次上电,一切工作正常,被复用的IO也能翻转,但是多次使用按键复位之后,发现有些引脚被固定了,比如之前翻转LED的功能,LED却不能翻转了。不过,重新上电,一切工作正常,这个问题仅仅发生在使用外部按键复位。而且,也不是所有的板子都能复现这个问题。
经过多次长时间测试,发现官方的中国区LPC824lite的板子同样也有这个问题。 尝试过不使用代码方式去关闭SWD功能,而使用CRP1去关闭SWD功能,这种方法同样不起效果。
不过,在能复现问题的板子上,如果禁止掉SWD功能,并且把SWD_CLK引脚直接接地,多次复位外部复位按钮,问题却不会出现。但是这种方式却是没有太多意义的,毕竟需要将SWD引脚放出来作为GPIO使用。
后来,把这个问题和我们的相关部门一起调试后,总结出下面一些规律与解决方法。
三,解决方案
之前测试,当多次引脚复位之后,发现LED不能翻转了,以为是整个代码被卡住了,但是实际经过测试,发现P0_0-P0-5波形还是能够正常,只是P0-6到P0-26的IO状态被卡住了。 经过我们的相关部门调试,建议的解决方法如下:
在外部引脚复位的过程中,保证PIO0_4引脚为0, 复位完成后,PIO0_4可以释放,这样就不会在出现P0-6到P0-26被卡住的问题。 所以如果网友想把SWD引脚禁止掉作为IO工作,切记在外部复位的时候,拉低PIO0_4,否则很可能会出现上述描述的IO被卡住的问题。具体操作方法可以是: 拉低PIO0_4,复位外部引脚,拉高PIO0_4, 就跟进入ISP模式的方法类似。
希望这个workaround能够帮助到大家。
这里也附上禁止SWD功能的代码:
CLOCK_EnableClock(kCLOCK_Swm);
SWM0->PINENABLE0 |= 0X30; //disable the SWD function
/* Disable clock for switch matrix. */
CLOCK_DisableClock(kCLOCK_Swm);
|