『壹』 msp430單片機到底有哪些寄存器,分別幹嘛用
你要是想知道MSP430寄存器的話,我的建議是去看書,看那種比較基礎的,因為430的寄存器太多了,無論你是想了解還是想知道怎麼用,都不是一下子能懂的。
『貳』 51單片機Keil C51下使用printf輸出到串口,為何初始化了串口之後就可以使用了
因為是這樣的,在Keil\C51\LIB目錄下有個putchar.c文件,printf函數會調用該文件中的
putchar函數,putchar裡面的使用的寄存器都是標准51的(如TI,SBUF),它
們的地址是固定的,由此可知printf函數只針對串口0。
如果想讓printf函數支持串口1或串口2。。。那麼修改putchar函數的寄存器即可,比如SBUF改為SBUF1。但是能不能用printf函數對串口0,串口1。。。都適用呢
或者重定義putchar函數。
『叄』 msp430編程定時器B的中斷
微控論壇原創主貼 作者:bobo 微控論壇特約
因DC的邀請寫一個有關中斷的東東,我也接觸430不久只能以自己的心得體會更大家分享,若有紕漏懇請見諒。MSP430用戶手冊上有的中斷介紹我就不贅述了,大家可以看User Guider.我講的主要是書上沒有的,或者是點的不透的。希望對大家有用。
1.中斷嵌套,優先順序
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 的ADC10,ADC12(SD16不熟悉,沒發言權)模塊均有脈沖采樣模式和擴展采樣模式。只要選擇AD是由TA觸發采樣,然後把TA設置成PWM輸出模式,當然輸出PWM波的都是特殊功能腳,但是在這里它是不需要輸出的,所以引腳設置不必理會。值得關心的就是PWM的頻率,也就是你AD的采樣率。
3.看門狗復位
看門狗有2種工作模式:定時器 ,看門狗
定時器工作模式下WDTIFG在響應中斷服務程序有標志位自動復位,而在看門狗模式下,該標志位只能軟體清零。但是怎麼判斷復位是由於WDT工作在看門狗模式下的定時溢出引起的,還是看門狗寫密鑰錯誤引起的呢?………………………………
答案是沒有方法,至少我沒見過有什麼方法,也沒見過周邊的人有什麼方法。若有人知道方法謝謝分享。
4.經常有人會問這個語句的MOV.B #LPM0,0(SP)的作用。假如你在進入中斷函數之前,430是在LPM0下待機,若要求執行完中斷函數之後進入LPM3待機,在中斷函數里寫MOV.B #LPM3,SR是無效的。因為在進入中斷時430會把PC,SR壓棧,( SR內保存著低功耗模式的設置)即使你寫了MOV.B #LPM3,SR,在退出中斷出棧時SR會被重新設置成低功耗0,要達到這樣的目的,只能更改堆棧內SR的設置:MOV.B #LPM0,0(SP)。
5中斷向量:
430的中斷向量是FFE0H—FFFFH,一共32個位元組也就是FLASH的最後一段,430的FLASH有大有小,但是最後地址肯定是FFFFH(大FLASH超過64K的除外)所以它們的起始地址是不一樣的,而一般IAR默認編譯都是把程序放在FLASH開始的位置(不包括信息段)。
有個值得弄清楚的問題是:什麼是中斷向量?中斷向量實際就是保存中斷函數入口地址的存儲單元空間。就像FFFEH+FFFFH這2個位元組是復位中斷向量,那麼它存儲的就是主函數在FLASH內的起始地址,假如主函數保存在以0x1100為起始地址的FLASH塊內,那麼你會發現FFFFH 內保存的是0x11, FFFE內保存的是0x00.其他什麼TimerA,ADC12,所有的都一樣。只是你每次寫的程序長短不一,中斷函數放的位置不一樣。IAR編譯器都會給你定好,然後在你用JTAG燒寫程序的時候,把這個地址,燒寫到相應的中斷向量。因為中斷函數所處地址可以由用戶自定義,也可以讓IAR自動編譯,所以這個地址除了源代碼開發人員知道,其他人是不知道的,BSL就是應用這32個位元組的中斷向量內的內容的特殊性設置的密碼。但是有幾個東西在430是不變的,就是觸發中斷的條件滿足後,它到哪個地方去定址中斷服務函數的入口地址,是TI 在做430時就固化好,定死的。比方說上電復位的時候,它知道去FFFE,FFFF單元找地址,而不去FFE0,FFE2找地址,這個映射關系是430固化不變的。可有的時候你就是需要改變「中斷向量」,這怎麼辦?430FLASH程序自升級里有時就會碰到這個問題,方法是在430原來默認的中斷向量表內做一個跳轉操作,同樣以上電復位為例:
ORG 0x2345
PowerReset: mov.w &0xFCFE,PC
…………………………
…………………………
ORG 0xFFFE
DW PowerReset