我们在做项目的时候,偶尔会遇到芯片IO管脚资源不够的问题,造成这种情况的原因有几种情况,一个是当初的需求分析没有做好,考虑不周,二是成本方面的考虑(小Pin脚的便宜些),还有就是产品对PCB板体积的苛刻要求也需要小封装的芯片,诸如此类吧。这个时候如果管脚资源的差的很多那就没有办法只能换片子了,但是如果差那么一两个的话,可能我们就会把“邪恶的目光”瞄向平时不怎么在意的NMI和Reset了,这也是木有办法的事,这两位平时坐“冷板凳”的也该登场了,呵呵。
还好现在芯片越做越强大,很多芯片都配备了功能强大的管脚复用功能,这还是没有办法的事情,小小的芯片里装的外设资源太多了,但是管脚就那么几个,所以只能复用了,不过NMI和Reset这两个管脚很多芯片没怎么敢动它们,毕竟这两个脚还是比较“敏感”的危险人物,颇有些老虎屁股摸不得的架势,但是总是有那么些个胆大的(实际上胆大的挺多,呵呵,现在大多芯片都可以支持将它们两个当成复用管脚)。下面我就说说如何把Freescale公司的Kinetis L系列(Cortex-M0+)的NMI脚和Reset脚复用成GPIO的方法及注意事项。
可能用过KL系列的人会对它的管脚复用功能比较熟稔,觉着像配置其他管脚那样配置下管脚控制寄存器PORTx_PCRn中的MUX位就可以了,但是NMI和Reset比较还是“身份地位”比较特殊,单纯在管脚控制寄存器中配置还不能释放这两个管脚对IO的控制(这两位“大爷”比较固执,呵呵),我们还需要在软件上将不可屏蔽中断(NMI)和外部复位(Reset)这两个功能彻底禁掉才可以,也就是说需要两个操作才能让他们挪窝给GPIO用(其他管脚只需要第一步就可以了),如下图,需要将FTFA_FOPT这个寄存器的Reset pin或者NMI pin功能禁掉,然后再在代码中将该引脚复用成GPIO功能,这样就可以保证该管脚正常输出,下面具体介绍下配置的过程:
(1)该寄存器FTFA_FOPT寄存器为flash重加载寄存器,即上电或者复位时从0x40d这个flash地址读取数据到该寄存器,所以可以在下载代码的时候修改该flash地址内容;
(2)打开工程下IAR工程中Vectors.h头文件,找到如下内容修改CONFIG_4(代表的地址范围为0x40c~0x40f地址内容),即将0x40D地址内容修改成0xF7(我这里只修改了Reset,NMI类似):
(3)在新版本的IAR中默认对0x400~0x40f地址范围保护不擦写,所以即使上面做了修改也没有真正擦写成功,这样可以通过配置IAR的flashloader来解除这个对这个地址的保护,配置方法可以参考我之前的一篇博客《浅谈知识产权保护方法之加密Kinetis K60(方案一)》;
(4)都配置完成后,再对Reset或者NMI管脚进行正常的复用功能配置就可以了。
呼。。。闲扯了不少,重点的东西还是在后面4个配置步骤,这里写出来也是提醒大家复用配置Reset或者NMI脚需要注意的问题,不过实际上我觉着吧一般情况下(不到万不得已)还是不要修改这两个管脚为好,毕竟这两个脚的确是比较敏感的,尽量不要去碰,免得引来不必要的麻烦。好了,到这了,洗洗睡觉去,未完待续~