关于单片机中的NMI_Handler(不可屏蔽中断处理器)
該博客文章以MKL15Z4系列單片機(jī)為例,參考文檔均來(lái)自NXP官方提供的芯片用戶手冊(cè)和數(shù)據(jù)手冊(cè);所使用的的開(kāi)發(fā)環(huán)境是MCUXpresso。
一、簡(jiǎn)單的介紹
首先請(qǐng)看兩張截圖:
一張是截取于單片機(jī)工程的驅(qū)動(dòng)文件內(nèi)容,另一張截取于芯片用戶手冊(cè)。通過(guò)對(duì)照我們不難發(fā)現(xiàn)標(biāo)題中所說(shuō)的NMI_Handler正是不可屏蔽中斷,簡(jiǎn)稱(chēng)NMI。
在程序中NMI的實(shí)現(xiàn)函數(shù)也有定義,在芯片驅(qū)動(dòng)函數(shù)中該函數(shù)是一個(gè)弱定義,表示允許用戶在其他地方定義一個(gè)該函數(shù),具體實(shí)現(xiàn)如下所示:
繼續(xù)查看芯片用戶手冊(cè),可以找到這樣一句話,也是對(duì)NMI的解釋?zhuān)?/p>
看完這段話的解釋似乎單片機(jī)有一個(gè)引腳能通過(guò)低電平觸發(fā)NMI中斷,于是我們就查一下有沒(méi)有這個(gè)引腳,查找的結(jié)果如下圖所示:
NMI對(duì)外的確有一個(gè)引腳與之相關(guān)聯(lián),該引腳的默認(rèn)功能就是NMI。
總結(jié)以上信息,我們可以知道,當(dāng)我們使用該引腳用作其它功能的時(shí)候,如果把NMI引腳在電路上接地,程序在啟動(dòng)的時(shí)候就會(huì)觸發(fā)NMI中斷,從而進(jìn)入到NMI_Handler函數(shù)中去(如果是把該引腳復(fù)用為其它功能再輸入低電平是不會(huì)觸發(fā)NMI中斷的)。
二、如何解決不能直接在NMI引腳上接地的問(wèn)題
當(dāng)我們需要在電路設(shè)計(jì)上接地的時(shí)候,需要關(guān)閉NIM中斷,接下來(lái)我們看下面截圖:
這是FOPT(flash操作寄存器)寄存器的信息,默認(rèn)的時(shí)候NMI中斷是打開(kāi)的,如果想關(guān)閉該中斷需要我們把NMI_DIS位置0。我們都知道NMI屬于內(nèi)部中斷,通常芯片廠商只給我們提供了關(guān)閉外部中斷的API函數(shù),關(guān)閉內(nèi)部中斷的基本沒(méi)有提供,那么我們?cè)撊绾螌?xiě)該寄存器的值,從而關(guān)閉NMI中斷?因?yàn)榫幾g環(huán)境的不同,筆者這里只記錄自己使用的編譯環(huán)境關(guān)NMI中斷的方法,對(duì)于使用不同編譯環(huán)境的可以以此作為參考!
查看官方提供的寄存器的定義文件中有沒(méi)有關(guān)于FOPT寄存器的定義;
這里有一處有關(guān)于FOPT寄存器的定義,但是該地址是從0x40020000開(kāi)始的,而我使用的單片機(jī)FLASH的地址范圍是0x0--0x20000,很顯然該地址的內(nèi)容我們是沒(méi)法通過(guò)程序改的。繼續(xù)搜索后面還一處有關(guān)FOPT的定義,如下圖所示:
當(dāng)看到這些內(nèi)容后,我知道這正是我要找的內(nèi)容,為了進(jìn)一步證明我的判斷我在用戶手冊(cè)上找到了這樣一些內(nèi)容,而這些描述和我在單片機(jī)的驅(qū)動(dòng)文件中看到的一段程序是相吻合的:
我想此時(shí)就是你也應(yīng)該知道該如何屏蔽NMI中斷了,沒(méi)錯(cuò)就是直接更改如下圖圈起來(lái)的地方,把0xFFFFFFFE改成0xFFFFFBFE,即禁止NMI中斷。
有些人可能會(huì)有疑問(wèn)為何不在main函數(shù)中操作寄存器更改?我只能說(shuō)這樣是行不通的,NMI屬于內(nèi)部中斷,并且默認(rèn)是使能的,當(dāng)你的NMI引腳接地,在你還沒(méi)進(jìn)入main函數(shù)中就會(huì)因檢測(cè)到低電平觸發(fā)NMI中斷,
#endif
總結(jié)
以上是生活随笔為你收集整理的关于单片机中的NMI_Handler(不可屏蔽中断处理器)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 1.阿里云短信验证操作步骤
- 下一篇: 压缩软件Snappy的安装