為想學MSP430單片機的初學者,或者,你是剛轉到電子硬件嵌入式開發,如果你的電子基礎課程已經完成,想盡快掌握MSP430單片機,又糾結于怎樣盡快闖入MSP430學習過程的問題,現總結整理出新手開始學習MSP430的一些問題,和學習中有關注意事項和方法。 供有心學習MSP430單片機的童鞋參考吧。 當然,闖入MSP430學習,你需要有一些單片機的理論基礎,和比較強的C語言功底,學習MSP430單片機最好的方法是文武并進:“文”指學好片內模塊的資源知識;“武”則指動手能能力。基礎知識+動手實操,是一個非常有效的學習方法。文武并進必能學有所成。 進入各個電子產品公司的網站,招聘里面嵌入式占據了大半工程師職位。 廣義的嵌入式無非幾種:傳統的什么51單片機、 MSP430稱做嵌入式微控制器;ARM是嵌入式微處理器;當然還有DSP;FPGA。我們現在就不說別的,就說MSP430單片機,多數想學MSP430的童鞋,對89C51內核系列的單片機是很熟悉的,為了加深對MSP430 系列單片機的認識嗎,迅速闖入MSP430學習過程,就必須徹底了解MSP430單片機,我們不妨將51單片機和MSP430兩者進行一下比較。 第一點, 51內核單片機是8 位單片機。其指令是采用的被稱為“ CISC ”的復雜指令集,共具有111 條指令。而MSP430 單片機是16 位的單片機,采用了精簡指令集( RISC)結構,只有簡潔的27 條指令,大量的指令則是模擬指令,眾多的寄存器以及片內數據存儲器都可參加多種運算。這些內核指令均為單周期指令,功能強,運行的速度快。 第二點,MCU主要分為兩種工作模式:待機與執行。51內核單片機正常情況下消耗的電流為mA級 ,在掉電狀態下,其耗電電流仍約為3mA左右 ;即使在掉電方式下,電源電壓可以下降到2V ,但是為了保存內部RAM 中的數據,還需要提供約50uA的電流。 而430單片機功耗是在uA級的,工作電流極小,并且超低功耗,關斷狀態下的電流僅為0.1μA,待機電流為0.8μA,常規模式下的(250μA/1MIPS@3V),端口漏電流不足50 nA,并可零功耗掉電復位(BOR)。另外,該芯片屬低電器件,僅需1.8~3.6V電壓供電,因而可有效降低系統功耗。MSP430將低功耗模式擴展為7種,分別對應不同應用場合及任務的低功耗方式。以睡眠模式為例,包括深度睡眠模式RTC:只有時鐘在跑而其他都不動,目前,TI宣布其MSP430在RTC模式下最低功耗僅為360nA。同時也包括諸如液晶顯示驅動等需要幾十毫秒刷新一次的間歇性睡眠模式。所以,MSP430 的超低功耗更適合應用于使用電池供電的儀器、儀表類產品中。 第三點, 51內核單片機由于其內部總線是8 位的,受其結構本身的限制很大,模擬功能控制功能受限制。MSP430 系列其基本架構是16 位的,同時在其內部的數據總線經過轉換還存在8 位的總線,在加上本身就是混合型的結構,因而對它這樣的開放型的架構來說,無論擴展8 位的功能模塊,還是16 位的功能模塊,即使擴展模/ 數轉換或數/ 模轉換這類的功能模塊也是很方便的。 第四點,典型MCU的存儲結構有兩種。諾依曼結構——程序存儲器和數據存儲器統一編碼;哈佛結構——程序存儲器和數據存儲器;MSP430系列單片機屬于前者,而常用的51內核單片機系列屬于后者。 第五點,就是在開發工具上面。對51內核單片機來說,不少適合我們使用的開發工具。但是如何實現在線編程還是一個很大的問題。對于MSP430 系列而言,由于引進了Flash 型程序存儲器和JTAG 技術,不僅使開發工具變得簡便,而且價格也相對低廉,并且還可以實現在線編程。 那么說了以上這些,作為新手,到底怎么學習430這種16位低功耗的單片機呢?或者說有什么有什么效果比較好的方法嗎,答案是肯定。 網上有很多介紹MSP430單片機學習的方法,一定要結合自己的學習特點,集百家之長,善于總結別人的、自己的學習方法和效果,積極實踐。當然學習的方法都是相通的。大概對這些方法簡單總結,也就是下面幾點: 1. 作為430新手,首先看我們是否準備好以下幾樣硬件:電腦(帶有并口)1臺,MSP430FET仿真器1套,MSP430開發實驗板1套,和一些MSP430教程或電子教程資料等。 2. 選用MSP430仿真器。購買現成的MSP430JTAG仿真器如TI-MSP430JTAG 3. 選用MSP430開發板或目標板是學習一個重要的工具,建議購買一個開發板或目標板,同時也會得到很好的技術支持。如果自己制作的話也行,也未尚不可,那就看個人水平了。 4. 軟件工具,因為現在都有學習板的工具軟件,如IAR的EW430學習版,430GCC軟件還是免費的。建議還是使用IAR軟件較方便,因為使用的人群較多,有問題還可請教,容易解決。 5. MSP430學習資料及教程,<<MSP430系列16位超低功耗單片機原理與應用>> 清華大學出版社和一本關于430C語言編程應用的書本<<MSP430系列單片機實用C語言程序設計>>。 6. MSP430系列中硬件源資是非常豐富的。有看門狗(WDT)、定時器A (Timer_A)、定時器B(Timer_B)、比較器、串口0(USARTO)、串口1(USART1)、硬件乘法器、液晶驅動器、10位/12位ADC, 14位ADC,數十個可實現方向設置及中斷功能的并行輸入輸出端口、基本定時器(Basic Timer)。 7. 以下幾部分模塊硬件資源是作為初學者必須要了解學習的。
①WDT看門狗定時器: 新手們會看到很多編程實例中,開頭都有“WDTCTL = WDTPW +WDTHOLD;”語句。這是CUP執行關閉定時器的意思。在剛開始,我們沒必要關心這個,可以跳過這章節,只要大概地知道他的作用就好了?撮T狗定時器一般是用于防止程序失效而存在的,一般是用于完整的程序中使用。主程序中可不斷地清除看門狗定時器的計數值,以防定時器的值自動計滿后使CPU復位而重新開始工作。當程序發生錯誤時,無法正常清除看門狗的定時值時,則看門狗定時器計數溢出而產生CPU復位。 ②IO模塊:對于IO模塊可分為初級與提高兩階段,可以不必同一時段內進行理解。
a初學者必需了解幾個常用寄存器使用如P1OUT,P1IN,P1DIR,P1SEL寄存器。
b理解MSP430 IO口常用編程語法,這些都可以查看參考例程。
c結合書本介紹和個人理解,然后在開發板上進行實驗。例如比如LED、響聲之類的初級實驗。
d對于IO模塊:了解如何使用IO中斷,和IO中斷相關寄存器的使用。如果不太必要,可以跳過IO中斷的使用,而是去學習其他章節的基礎部分;當其他章節基礎學習到一定程序時回過頭再來學習這部分。另外,我們需要搞清楚IO模塊在什么時候為高阻狀態?高阻狀態時的漏電流為多少?IO驅動電流能力如何?等等一些常關注的參數時,我們都需要養成主動查看器件手冊的習慣。 中斷是430處理器的一大特色,因為幾乎每個外圍模塊都能產生,430可以在沒有任務時進入低功耗狀態,有事件時中斷喚醒cpu,處理完畢再次進入低功耗狀態。整個中斷的響應過程是這樣的,當有中斷請求時,如果cpu處于活動狀態,先完成當前命令;如果處于低功耗,先退出,將下一條指令的pc值壓入堆棧;如果有多個中斷請求,先響應優先級高的;執行完后,等待中斷請求標志位復位,要注意,單中斷源的中斷請求標志位自動復位,而多中斷的標志位需要軟件復位;然后系統總中斷允許位SR.GIE復位,相應的中斷向量值裝入pc,程序從這個地址繼續執行。這里要注意,中斷允許位SR.GIE和中斷嵌套問題。如果當你執行中斷程序過程中,希望可以響應更高級別的中斷請求時,必須在進入第一個中斷時把SR.GIE置位!∑鋵崳渌耐鈬K時鐘沿著時鐘和中斷這個核心來執行的。具體的結構我也不羅索了,可以參考430系列手冊。
、蹠r鐘模塊:系統時鐘是一個程序運行的指揮官,時序和中斷也是整個程序的核心和中軸線。430最多有三個振蕩器,DCO內部振蕩器;LFXT1外接低頻振蕩器,常見的32768HZ,不用外接負載電容;也可接高頻450KHZ-8M,需接負載電容;XT2接高頻450KHZ-8M,加外接電容。初學者若要使用到片中某模塊時幾乎都要使用不同的時鐘。時鐘模塊是提供整個單片機中各模塊的時鐘發生源,所以這章節是非常強調地要去認真理解的。
、.必須理解430有幾種時鐘信號:MCLK系統主時鐘,可分頻1 2 4 8,供cpu使用,其他外圍模塊在有選擇情況下也可使用;SMCLK系統子時鐘,供外圍模塊使用,可選則不同振蕩器產生的時鐘信號;ACLK輔助時鐘,只能由LFXT1產生,供外圍模塊。 ⑵.DCO,SMCLK,MCLK,ACLK各個時鐘有什么優點和缺點。
、.4個時鐘信號中,每個時鐘的通常頻率范圍是多少。
⑷.常規的時基控制寄存器設置和時鐘如何從引腳輸出等等。
、躎imaA模塊:⑴.初學者需要搞清TimerA的三個不同工作模式中TA、CCR1、CCR2與CCR0之間的關系。⑵.搞清楚TA、CCR1、CCR2與CCR0之間的中斷向量關系。⑶.綜合上面的理解,我們可以結合TimerA的例程來進行相關驗證,只有通過親自的操作才能有效地記住。⑷.利用TimerA實現PWM信號輸出、利用捕獲/比較功能實現捕獲信號等等。 8. 另外多大學習430學習單片機論壇上, 和網友交流,咨詢,多看別人出現的問題的解決方法。 可以說,只要經過上述方面認真折騰學習的話,其實MSP430單片機編程應用就有了基本入門階段,可以說已經闖入MSP430單片機有效學習過程,接下要繼續學習其他相關的模塊應用也不難了。那么剩下的一些模塊可以按需而用,按需而學。 但前提的就是需要熟悉幾個常用模塊基礎應用,以使用量最多的14x系列為例,初學者入門必學有IO模塊、時基模塊、定時器模塊等,以后可繼續強化學習如ADC12模數轉換、UART串行異步通訊模塊、比較器A模塊等等。 (2)MSP430F5529 通用I/O口的設置 初學,有什么錯誤或者不恰當的地方多多指正,大家一起交流學習。 第一章,先學習I/O。I/O的操作是最基本的,而且這些寄存器也都要牢牢掌握。MSP430難就難在它有大量的寄存器需要設置,雖然不是每個都必須掌握,但I/O控制寄存器我覺得肯定還要記住的。這個太基礎了啊啊-_' 大家手里要常備一份原理圖(PCB圖),方便查線和配置引腳 一、通用I/O的簡單操作(設置) 1.1 I/O的簡介 特點:①多種復用和設置(即可控制是否輸入、是否輸出、是否接上拉電阻、是否接下拉電阻、是否可接受中斷); ②一般情況下,P1和P2都是具有中斷能力的。從P1和P2接口的各個I/O管腳引入的中斷可以獨立的被使能并且設置為上升沿或者下降沿觸發。對應的中斷向量表分別為P1IV和P2IV,它們只能進行字操作,并且PAIV這個寄存器根本不存在。 ③P1、P2可合為PA,P3、P4可合為PB,…PC、PD。所以P1為8位BCD 0x00,PA為16位BCD 0x0000。當進行字操作寫入PA口時,所有的16位都被寫入這個端口;當利用字節操作寫入PA口的低字節時,高字節保持不變; ④由于430很多I/O和外圍電路接線,所以這里常用位操作。如事先定義(接下來也會用到,先在此聲明)BIT0=0X01、BIT1=0X02、BIT3=0X04…BIT7=0X80,那么將P1.1、P1.3的輸出設為1的時候,就可以這樣操作:P1OUT|=(BIT1+BIT3)。這樣顯得很清楚。 ⑤沒有用到的I/O,要統一拉低為好。此外,當讀入的數據長短小于端口最大長度時,那些沒有用到的位會被視零。 1.2 I/O的簡單配置 430I/O的配置是用軟件來實現的,是通過相應的配置寄存器來實現的。(用到某個I/O時,一定要先配置好該I/O,否則易出錯) 1.2.1 I/O方向設定寄存器PXDIR 如設定P1.1和P1.2為輸出狀態,操作為: P1DIR |=(BIT1+BIT2)等價于PADIR |=(BIT1+BIT2)也等價于PADIR_L|=(BIT1+BIT2。 拉高設定為輸出,拉低設定為輸入(默認)。 1.2.2 I/O輸入設定寄存器PXIN 如設定P1.1和P1.2的輸入為低電平,操作為: P1IN&=~(BIT1+BIT2)。 1.2.3 I/O輸出設定寄存器PXOUT 、佼只用為簡單的輸出時:如設定P1.1和P1.2輸出高電平,操作為: P1OUT |=(BIT1+BIT2)。 ②如果該引腳為正常I/O功能,且當前已設定為輸入方向,且上拉/下拉電阻寄存器是有效地。那么PXOUT可以用來配置上拉和下拉電阻: 低電平為下拉電阻; 高電平為上拉電阻; 1.2.4 上拉/下拉電阻使能寄存器PXREN 低電平該寄存器為無效狀態; 高電平該寄存器為有效狀態; 1.2.5 輸出驅動能力設置寄存器PXDS 弱化驅動可以減弱電磁干擾EMI,全力驅動會增強電磁干擾。默認為減弱驅動。 低電平表示減弱的驅動(默認); 高電平表示全力的驅動; 1.2.6 功能選擇寄存器PXSEL 用來聲明該端口是要應用于外圍電路的特殊功能(不決定輸入輸出方向),默認為低電平。 低電平表示普通的I/O(默認); 高電平表示該引腳將有連接外圍電路的特殊用途; 如:開發板初始化函數HAL_Board.c中有這樣一句程序: P5SEL |=(BIT2+BIT3)(=00001100); 這句話的意思就是聲明P5.2和P5.3將有特殊用途,實際上這兩個I/O接的是外部的高頻時鐘晶振(之后還要設定為輸入狀態才可以)。 此外需要注意的是,一旦某個I/O的PXSEL置高了,那么該引腳將不能再被用為中斷引腳。 總結,簡單的程序應用: /*實現LED的閃爍*/LED位于每個觸摸按鍵下方,具體接口請查詢原理圖 #include <msp430.h> 該頭文件內部包含430各個寄存器的配置情況 void main(void) { WDTCTL=WDTPW+WDTHOLD; //關閉看門狗 P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5); //P1.0-P1.5方向為輸出,BITX的定義在msp430.h中 P1OUT&=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5); //清零 /*P1SEL=0X00; PXDS=0X00;默認*/ inti=0,j=0; while(1) { if(i>5) i=0; else { switch(i) { case0:P1OUT=0x01;break; case1:P1OUT=0x02;break; case2:P1OUT=0x04;break; case3:P1OUT=0x08;break; case4:P1OUT=0x10;break; case5:P1OUT=0x20;break; } } i++; for(j=20000;j>0;j--); //延時 } }
|