本帖最后由 西门扫雪 于 2015-9-22 11:03 编辑
NMI引脚是芯片的不可屏蔽中断引脚,Kinetis芯片默认是使能NMI功能的(低电平有效),通常该引脚内部具有较小的内部上拉电阻,从大部分的应用来看,这个引脚的作用主要有两种,作为类似GPIO的中断引脚和作为低功耗唤醒引脚。
但是对于大部分应用来说,往往不需要这个引脚,特别是对于小封装的芯片,IO资源比较紧张,往往会考虑把这个复用功能的引脚用作GPIO, FTM等功能,但是由于这个引脚的特殊性(默认使能了NMI中断功能),往往会对应用带来麻烦。此处举例子来说明。 如果把这个引脚配置成GPIO输入用于检测外部按键输入,默认状态下拉到GND,原本打算在程序中把NMI功能Disable掉,配置成GPIO功能,但事实情况是还未等程序执行到配置该引脚到GPIO功能时,由于外部接低,已经导致芯片进入NMI中断,导致程序进入Default中断。更为烦恼的是,有些时候还会导致无法连接SWD下载,而且这个原因往往比较隐蔽,很难发现。所以,这个引脚如果复用为其它功能,一定要多加小心。
既然这个引脚带来那么多“痛苦”,那自然想到在芯片运行前去Disable其默认的NMI功能。Kinetis提供了两种方法去Disable NMI的中断功能:第一种:在MCU复位结束之后,在main函数中把该引脚配置成其它功能,等同于去使能NMI功能;第二种:在MCU复位之前Disable,对于大部分的Kinetis芯片来说,其工作原理是,MCU在处于复位状态时会把位于0x40D的flash nonvolatile option 配置字节的内容拷贝到FTFA_FOPT寄存器中,关于FTFA_FOPT中NMI的定义,0X40D Flash配置字节和如下MCU复位启动时FTFA_FOPT寄存器数据填充流程分别如下两个图:
尽管上文提到两种方法,但第一种方法由于是在MCU复位后才生效,所以应用中实用性不大,因为往往的情况是如果NMI引脚被拉低(如上面举例的情况),在程序还没执行到main函数中Dsable相关函数时,就会导致MCU进入NMI中断。所以第二种方式更为实用,在MCU复位之前就disable了NMI功能,即便该引脚默认被拉低,也不会引起中断。下面截图是IAR中disable NMI的配置字段,其本质也是修改0X40D字段。
谈了那么多,都是为下面讲题目中提到的NMI引脚在Kinetis KE系列和KL系列芯片的差异做铺垫的。KE是飞思卡尔5V系列的ARM内核芯片,其主要定位在于兼容替代原有的S08心裂MCU,所以在内部外设设计上与S08有点类似,同样在NMI的使用相对其他的Kinetis系列芯片也是有些特殊的,简而言之,KE的NMI只能在RESET后去Dsable其默认的NMI功能,而不能向KL那样在复位BOOT流程时去Disable其功能。具体描述和
disable的相关寄存器描述如下。 可见,在KE中如果去Disable NMI的中断功能,需要在代码中去操作SIM_SOPT0寄存器,当然使用过程中建议是越早越好,最好是放在通用寄存器初始化完成以及看门狗关闭前的第一句。另外,由于不能在复位前完成disable,这个引脚在设计时万万不能接低,尽管其内部有上拉。
使用建议:
尽管通常该引脚内部具有较小的内部上拉电阻,但如果可能的话,通常建议采用外部 4.7 kΩ至10 kΩ上拉电阻。需要特别提出的是,如果该引脚被外部电路拉低,即便该引脚被复用成其它功能(FTM或者GPIO),在下载程序时,也有可能导致芯片与仿真器连接异常。原因是芯片一上电,在程序还没有执行禁用NMI功能时,由于NMI引脚被外部拉低,程序就会已经进入NMI的中断程序,从而造成程序无法成功下载。此时则需要通过Flash NVM 配置字节禁用NMI功能,它与在程序中禁用 NMI引脚的区别在于,这种方**执行用户程序之前生效。
|