msp430 學(xué)習經(jīng)驗總結
三、定時(shí)器A
四、TimerA的捕獲模式
五、寄存器
5.MSP430中斷嵌套機制
(1)430默認的是關(guān)閉中斷嵌套的,除非你在一個(gè)中斷程序中再次開(kāi)總中斷EINT。
(2)當進(jìn)入中斷程序時(shí),只要不在中斷中再次開(kāi)中斷,剛總中斷是關(guān)閉的,此時(shí)來(lái)中斷不管是比當前中斷的優(yōu)先級高還是低都不執行。
(3)若在中斷A中開(kāi)了總中斷,剛可以響應后來(lái)的中斷B(不管B的優(yōu)先級比A高還是低),B執行完現繼續執行。注意:進(jìn)入中斷B生總中斷同樣也會(huì )關(guān)閉,如果B中斷程序執行時(shí)需響應中斷C,則此時(shí)也要開(kāi)總中斷,若不需響應中斷,則不用開(kāi)中斷,B執行完后中跳出中斷程序進(jìn)入A程序時(shí),總中斷會(huì )自動(dòng)打開(kāi)。
(4)若在中斷中開(kāi)了總中斷,后來(lái)的中斷同時(shí)有多個(gè),則會(huì )按優(yōu)先級來(lái)執行,即中斷優(yōu)先級只有在多個(gè)中斷同時(shí)到來(lái)才起做用!中斷服務(wù)不執行搶先原則。
(5)對于單源中斷,只要響應中斷,系統硬件自動(dòng)清中斷標志位,對于TA/TB定時(shí)器的比較/捕獲中斷,只要訪(fǎng)問(wèn)TAIV/TBIV,標志位倍被自動(dòng)清除;對于多源中斷要手動(dòng)清標志位,比如P1/P2口中斷,要手工清除相應的標志,如果在這種中斷用“EINT();”開(kāi)中斷,而在打開(kāi)中斷前沒(méi)有清標志,就會(huì )有相同的中斷不斷嵌入,而導致堆棧溢出引起復位,所以在這類(lèi)中斷必須先清標志現打開(kāi)中斷開(kāi)關(guān)。
6.關(guān)于MSP430中斷機制--我的理解
因DC的邀請寫(xiě)一個(gè)有關(guān)中斷的東東,我也接觸430不久只能以自己的心得體會(huì )更大家分享,若有紕漏懇請見(jiàn)諒。MSP430用戶(hù)手冊上有的中斷介紹我就不贅述了,大家可以看User1.中斷嵌套,優(yōu)先級
430總中斷的控制位是狀態(tài)寄存器內的GIE位(該位在SR寄存器內),該位在復位狀態(tài)下,所有的可屏蔽中斷都不會(huì )發(fā)生響應??善帘沃袛嘤址譃閱沃袛嘣春投嘀袛嘣吹?。單中斷源的一般響應了中斷服務(wù)程序中斷標志位就自動(dòng)清零,而多中斷源的則要求查詢(xún)某個(gè)寄存器后中斷標志位才會(huì )清零。由于大多數人接觸的第一款單片機通常是51,51單片機CPU在響應低優(yōu)先級的中斷程序過(guò)程中若有更高優(yōu)先級的中斷發(fā)生,單片機就會(huì )去執行高優(yōu)先級,這個(gè)過(guò)程已經(jīng)產(chǎn)生了中斷嵌套。而430單片機則不同,如果在響應低優(yōu)先級中斷服務(wù)程序的時(shí)候,即使來(lái)了更高優(yōu)先級的中斷服務(wù)請求,430也會(huì )置之不理,直至低優(yōu)先級中斷服務(wù)程序執行完畢,才會(huì )去響應高優(yōu)先級中斷。這是因為430在響應中斷程序的時(shí)候,總中斷GIE是復位狀態(tài)的,如果要產(chǎn)生類(lèi)似51的中斷嵌套,只能在中斷函數內再次置位GIE位。
2.定時(shí)器TA
TimerA有2個(gè)中斷向量。TIMERA0,TIMERA1
TIMERA0只針對CCR0的計數溢出
TIMERA1再查詢(xún)TAIV后可知道是CCR1,還是CCR2,亦或TAIFG引起的,至于TAIFG是什么情況下置位的,則要看TA工作的模式
具體看用戶(hù)手冊。還有一點(diǎn)TA本身有PWM輸出功能,無(wú)須借用中斷功能。在這個(gè)問(wèn)題上經(jīng)常出現應用彎路的是如何結合TA和AD實(shí)行定時(shí)采樣的問(wèn)題,很多人都是在TA中斷里打開(kāi)AD這樣來(lái)做。這是不適宜的,因為430
3.看門(mén)狗復位
看門(mén)狗有2種工作模式:定時(shí)器
定時(shí)器工作模式下WDTIFG在響應中斷服務(wù)程序有標志位自動(dòng)復位,而在看門(mén)狗模式下,該標志位只能軟件清零。但是怎么判斷復位是由于WDT工作在看門(mén)狗模式下的定時(shí)溢出引起的,還是看門(mén)狗寫(xiě)密鑰錯誤引起的呢?………………………………
答案是沒(méi)有方法,至少我沒(méi)見(jiàn)過(guò)有什么方法,也沒(méi)見(jiàn)過(guò)周邊的人有什么方法。若有人知道方法謝謝分享。
4.經(jīng)常有人會(huì )問(wèn)這個(gè)語(yǔ)句的MOV.B
5中斷向量:
430的中斷向量是FFE0H—FFFFH,一共32個(gè)字節也就是FLASH的最后一段,430的FLASH有大有小,但是最后地址肯定是FFFFH(大FLASH超過(guò)64K的除外)所以它們的起始地址是不一樣的,而一般IAR默認編譯都是把程序放在FLASH開(kāi)始的位置(不包括信息段)。
有個(gè)值得弄清楚的問(wèn)題是:什么是中斷向量?中斷向量實(shí)際就是保存中斷函數入口地址的存儲單元空間。就像FFFEH+FFFFH這2個(gè)字節是復位中斷向量,那么它存儲的就是主函數在FLASH內的起始地址,假如主函數保存在以0x1100為起始地址的FLASH塊內,那么你會(huì )發(fā)現FFFFH
ORG
PowerReset:
…………………………
…………………………
ORG
DW
這樣的話(huà)0xFCFE就相當是0xFFFE的映射了。這個(gè)在430程序自升級的TI應用報告里就有。
評論