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