MSP430有哪些可屏蔽中斷
中斷很大程度上體現(xiàn)了一款單片機(jī)的性能,從這一點(diǎn)將MSP430在中斷方面做得很不錯(cuò),主要是提供了非常豐富的中斷源,基本的有IO中斷,定時(shí)器中斷和一些接口中斷(SPI,UART,I2C)等等。
現(xiàn)在我就談?wù)勱P(guān)于MSP430中斷的一些特性,主要是在項(xiàng)目經(jīng)歷中感覺比較有用的問題,跟大家分享下。
第一,MSP430中斷的優(yōu)先級(jí)。
MSP430支持中斷優(yōu)先級(jí),但是優(yōu)先級(jí)的高低怎么獲知呢?它的用手手冊(cè)上有個(gè)很有意思的說法,我原文引用過來“The nearer a module is to the CPU/NMIRS, the higher the priority”,翻譯過來就是說離CPU/NMIRS越近,優(yōu)先級(jí)就越高。那我們?cè)趺粗滥莻(gè)模塊離CPU近啊,看datasheet給的框圖?總覺得這不可能讓一個(gè)做電子的人放心,比如框圖在中距CPU一樣進(jìn),那怎么區(qū)分呢?所以我們有另外一個(gè)更可靠的辦法,IAR為每一款型號(hào)的430都提供了對(duì)應(yīng)的頭問題,只靠看中斷向量地址就可以知道了。430的中斷向量表從地址值0xFFC0開始至0XFFFF結(jié)束,一共有32個(gè)表項(xiàng)(每個(gè)中斷向量對(duì)應(yīng)2byte),0XFFCO對(duì)應(yīng)的中斷向量的優(yōu)先級(jí)是最頂?shù)模?XFFFE對(duì)應(yīng)的中斷向量的優(yōu)先級(jí)是最高的,也就是從0xFFCO開始至0xFFFF,32個(gè)中斷優(yōu)先級(jí)由低至高。這樣就很容易弄清楚各中斷的優(yōu)先級(jí)了。
第二,MSP430中斷的響應(yīng)過程。
首先,當(dāng)然是中斷發(fā)生對(duì)應(yīng)的標(biāo)志為置1。這個(gè)時(shí)候的過程我詳述下,其實(shí)是翻譯的用戶手冊(cè)但是還是了解下好。
1. CPU會(huì)執(zhí)行完當(dāng)期的指令。
2. 指向下一條指令的PC被壓棧。
3. 狀態(tài)寄存器SR壓棧。
4. 選擇最好優(yōu)先級(jí)的中斷進(jìn)行服務(wù)。
5. 單源中斷的中斷標(biāo)志位會(huì)被自動(dòng)清零,這個(gè)地方需要小心下P1,P2這樣的中斷標(biāo)志位不會(huì)自動(dòng)清零,因?yàn)镻1、P2的IO中斷屬于多源中斷,就是說P1或者P2的8個(gè)IO對(duì)應(yīng)到了一個(gè)中斷向量上,單片機(jī)知道是P1或者P2發(fā)生了中斷,無論是P1的哪一個(gè)IO發(fā)生的都會(huì)指向P1的中斷向量,P2也是一樣的,所以需要在代碼中手動(dòng)清零。
6. 狀態(tài)寄存器SR被清零,將會(huì)終止任何低功耗狀態(tài),并且全局中斷使能被關(guān)閉(GIE)。這個(gè)地方與51很是有些不同,430響應(yīng)了中斷后會(huì)關(guān)閉全局中斷使能,不會(huì)響應(yīng)任何其他的中斷包括優(yōu)先級(jí)高的,就是說默認(rèn)狀態(tài)下是沒有中斷嵌套的,若用到中斷嵌套的話需要使用_EINT()打開全局中斷。
7. 中斷向量被裝載到PC,開始執(zhí)行中斷服務(wù)函數(shù)。
以上是整個(gè)中斷的接收過程,比較重要的地方我用彩色字體標(biāo)出了。
中斷返回就相對(duì)簡(jiǎn)單些,中斷服務(wù)函數(shù)會(huì)由RETI這條指令返回,SR被彈出,單片機(jī)恢復(fù)到中斷前的狀態(tài),PC也被彈出,繼續(xù)執(zhí)行指令。
第三,開中斷和中斷服務(wù)函數(shù)。
這個(gè)是讓我在項(xiàng)目中糾結(jié)過的地方,也請(qǐng)各位小心。
MSP430一旦開了外設(shè)的中斷,比如SPI的接收中斷。
在SPI的接收中斷被使能,單片機(jī)一旦發(fā)現(xiàn)SPI接收標(biāo)志置位,就會(huì)裝載中斷向量,但是我們?nèi)绻麤]有用到SPI的接收中斷,會(huì)怎樣呢?由于沒用到,所有就沒有寫SPI接收中斷的服務(wù)函數(shù),此時(shí)中斷向量里指向中斷服務(wù)函數(shù)地址值是啥?是全0。CPU從0-01FFh取指令,只會(huì)發(fā)生一件事。PUC,上電清零。接著PC會(huì)裝載0xFFFE中斷向量的內(nèi)容,也就是復(fù)位向量,程序會(huì)跳轉(zhuǎn)到給IAR我們做的啟動(dòng)代碼。程序再往下執(zhí)行會(huì)執(zhí)行到我們編寫的代碼的main()的第一句。這樣悲劇就誕生了,蕩機(jī)了!!!!
所以我在這希望初學(xué)430的朋友對(duì)于中斷,未使用的就不要使能。使能的就一定要寫中斷服務(wù)函數(shù),哪怕是空函數(shù)!
以上是我在430中斷使用中的一些經(jīng)驗(yàn),希望對(duì)各位有用!
編輯:admin 最后修改時(shí)間:2018-05-19