zoukankan      html  css  js  c++  java
  • 关于单片机中的NMI_Handler(不可屏蔽中断处理器)

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

    一、简单的介绍

      首先请看两张截图:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    #endif

  • 相关阅读:
    webkit and the browser
    【技术原创】京东商城价格图片分析解析源代码下载(C#),附演示程序 转
    maglev need 64bit linux version
    sed awk
    VMware公司SpringSource部门宣布收购Gemstone Systems公司
    新手?为什么需要关怀?
    【技术原创】京东商城价格图片分析解析源代码下载(C#),附演示程序 转
    【技术原创】京东商城价格图片分析解析源代码下载(C#),附演示程序 转
    C语言正则表达式库pcre介绍
    人工翻译
  • 原文地址:https://www.cnblogs.com/wenhao-Web/p/13618703.html
Copyright © 2011-2022 走看看