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