关于单片机中的NMI_Handler(不可屏蔽中断处理器)

控制/MCU

1815人已加入

描述

前言

该博客文章以MKL15Z4系列单片机为例,参考文档均来自NXP官方提供的芯片用户手册和数据手册;所使用的的开发环境是MCUXpresso。

正文

一、简单的介绍

首先请看两张截图:

一张是截取于单片机工程的驱动文件内容,另一张截取于芯片用户手册。通过对照我们不难发现标题中所说的NMI_Handler正是不可屏蔽中断,简称NMI。

NMI

NMI

在程序中NMI的实现函数也有定义,在芯片驱动函数中该函数是一个弱定义,表示允许用户在其他地方定义一个该函数,具体实现如下所示:

NMI

继续查看芯片用户手册,可以找到这样一句话,也是对NMI的解释:

NMI

看完这段话的解释似乎单片机有一个引脚能通过低电平触发NMI中断,于是我们就查一下有没有这个引脚,查找的结果如下图所示:

NMI

NMI对外的确有一个引脚与之相关联,该引脚的默认功能就是NMI。

总结以上信息,我们可以知道,当我们使用该引脚用作其它功能的时候,如果把NMI引脚在电路上接地,程序在启动的时候就会触发NMI中断,从而进入到NMI_Handler函数中去(如果是把该引脚复用为其它功能再输入低电平是不会触发NMI中断的)。

二、如何解决不能直接在NMI引脚上接地的问题

当我们需要在电路设计上接地的时候,需要关闭NIM中断,接下来我们看下面截图:

NMI

这是FOPT(flash操作寄存器)寄存器的信息,默认的时候NMI中断是打开的,如果想关闭该中断需要我们把NMI_DIS位置0。我们都知道NMI属于内部中断,通常芯片厂商只给我们提供了关闭外部中断的API函数,关闭内部中断的基本没有提供,那么我们该如何写该寄存器的值,从而关闭NMI中断?因为编译环境的不同,笔者这里只记录自己使用的编译环境中国关闭NMI中断的方法,对于使用不同编译环境的可以以此作为参考!

查看官方提供的寄存器的定义文件中有没有关于FOPT寄存器的定义;

NMI

NMI

这里有一处有关于FOPT寄存器的定义,但是该地址是从0x40020000开始的,而我使用的单片机FLASH的地址范围是0x0--0x20000,很显然该地址的内容我们是没法通过程序改的。继续搜索后面还一处有关FOPT的定义,如下图所示:

NMI

NMI

当看到这些内容后,我知道这正是我要找的内容,为了进一步证明我的判断我在用户手册上找到了这样一些内容,而这些描述和我在单片机的驱动文件中看到的一段程序是相吻合的:

NMI

NMI

NMI

我想此时就是你也应该知道该如何屏蔽NMI中断了,没错就是直接更改如下图圈起来的地方,把0xFFFFFFFE改成0xFFFFFBFE,即禁止NMI中断。

NMI

NMI

有些人可能会有疑问为何不在main函数中操作寄存器更改?我只能说这样是行不通的,NMI属于内部中断,并且默认是使能的,当你的NMI引脚接地,在你还没进入main函数中就会因检测到低电平触发NMI中断。

审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分