一:端口配置 1:P1DIR 設(shè)置為1,相應(yīng)管腳為輸出。設(shè)置為0.相應(yīng)管腳 為輸入狀態(tài)。 2:P1IE 設(shè)置為1,相應(yīng)管腳具有中斷功能。設(shè)置為0, 相應(yīng)管腳沒有中斷功能。 3:P1IES 設(shè)置為1,選擇下降沿觸發(fā)方式,設(shè)置為0,選 擇上升沿觸發(fā)方式。 4:P1IFG P1端口的中斷標(biāo)志寄存器,如果P1端口當(dāng)某 個(gè)管腳設(shè)置成中斷管腳,當(dāng)有中斷觸發(fā)時(shí),想應(yīng)比特為1 ; 如果沒有中斷觸發(fā),相應(yīng)比特為0. 5: P1IN P1端口輸入寄存器,在輸入模式下,讀取該寄 存器相應(yīng)管腳上的數(shù)據(jù)。 6: P1OUT P1端口的輸出去寄存器,在輸出模式下,如 果該寄存器相應(yīng)比特設(shè)置為1時(shí),相應(yīng)管腳輸出高電平; 如果該寄存器相應(yīng)比特為0時(shí),相應(yīng)管腳輸出低電平。 7: P1SEL寄存器 P1端口功能選擇寄存器,該寄存器主要 控制P1端口的I/O管腳作為一般I/O還是外圍模塊的功能 端口,該寄存器的相應(yīng)比特為1時(shí)候,相應(yīng)管腳為外圍功能 模塊,當(dāng)該寄存器為0時(shí),相應(yīng)管腳為一般I/O管腳。 二 LaunchPad 寫程序的必要頭文件和格式: /*=================================================== #include"msp430g2553.h" Void main() { WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗。 //WDTPW 是看門狗的密碼,寫錯(cuò)了會(huì)導(dǎo)致系統(tǒng)復(fù)位。 **(程序) } =====================================================*/ 三 點(diǎn)亮LED 僅僅是對(duì)IO 口的輸入輸出操作。與51 很不相同。 P1DIR|=BIT0;//設(shè)置P1.0 為輸出方向。===P1DIR|=0x01; //{P1DIR=BIT0;是設(shè)置P1.0 為輸出,其他全部為輸入方向。} //注意:LaunchPad 中很多操作是與,或,非等操作組成,時(shí)刻注意。 P1OUT|=BIT0;//這條指令就是設(shè)置P1.0 輸出為高電平。 這樣,就點(diǎn)亮了LED(接在P1.0 上的LED); 具體程序: #include"msp430g2553.h" Void main() { WDTCTL=WDTPW+WDTHOLD; P1DIR|=BIT0; P1OUT|=BIT0; While(1); } 四: 閃爍LED LaunchPad 上面自帶有2 個(gè)LED,一個(gè)接在P1.0 上,一個(gè)接在P1.6 上。 我們用2 個(gè)交替閃爍。 #include"msp430g2553.h" Void main();第一個(gè)字母大寫 { WDTCTL=WDTPW+WDTHOLD; P1DIR|=BIT0+BIT6;//設(shè)置P1.0 和P1.6 為輸出 P1OUT|=BIT0;//線讓LED0 亮。 While(1) { Unsigned int i=50000; While(i--); P1OUT^=0x41;//對(duì)P1.0 和P1.6 取反,所以LED0 和LED1 會(huì)交替閃爍。 } } 五:中斷系統(tǒng) LaunchPad 的中斷系統(tǒng)功能相當(dāng)強(qiáng)大,51 只有5 個(gè)中斷源,2 個(gè)定時(shí),2 個(gè)外部, 一個(gè)串行口。但是LaunchPad 的中斷源幾乎是所有的引腳和所用的定時(shí)器。 在這里,最重要的就是中斷向量的判斷了。 定時(shí)器一般都是: vector=TIMER0_A0_VECTOR vector=TIMER0_A1_VECTOR vector=TIMER1_A0_VECTOR vector=TIMER1_A1_VECTOR 引腳中斷的向量: vector=PORT1_VECTOR; P1 口的中斷向量。 判斷是哪個(gè)引腳的話,有2 種辦法: 舉例子:P1.3 和P1.4 都是中斷的輸入引腳。現(xiàn)在進(jìn)了中斷,我如何判斷是那個(gè)引 腳引起的呢? 第一種方法: vector=PORT1_VECTOR __interruput void Port1 (void) { If(P1IFG&BIT3);判斷的是P1.3 產(chǎn)生的中斷。 { ;要執(zhí)行的函數(shù)。 P1IFG=0x00;//清0 中斷標(biāo)志位。 } If(P1IFG&BIT4) { ;P1.4 產(chǎn)生的中端,執(zhí)行相應(yīng)的函數(shù)。 P1IFG=0x00; } } 第二種方法: vector=PORT1_VECTOR __interruput void Port1 (void) { P1IFG&=BIT3+BIT4;//因?yàn)橹挥玫搅薖1.0 和P1.4,其他的中斷標(biāo)志全部清零。 (或者:P1IFG=P1IFG&0x18) Switch(P1IFG) { Case 0x08: vector=3;break; //P1.3 產(chǎn)生的中斷 Case 0x10:vector=4;break;//P1.4 產(chǎn)生的中斷 } } 切記:進(jìn)入中斷函數(shù)后要做的第一件事是,清除中斷標(biāo)志。 例程: #include<msp430g2553.h> Void main(void)
{ WDTCTL=WDTPW+WDTHOLD; P1DIR|=BIT0; // 設(shè)置P1.0輸出 P1IES |=BIT3; // 設(shè)置從高到底跳變觸發(fā) P1IFG&=~BIT3// 清除中斷標(biāo)志位 P1IE |=BIT3 // 使P1.3能中斷 _BIS_SR(LPM_bits+GIE);// 啟動(dòng)LMP4節(jié)能模式 } #proagma vector=PORT1_VECTOR _interrupt void Port_1(void) { If(P1IFG&BIT3) { P1OUT^=BIT0; P1IFG&=~BIT3; } } 程序一開始 1 WDTCTL=WDTPW+WDTHOLD; HOLD住看門狗 2 P1DIR|=BIT0;將P1.0 設(shè)置為輸出口。lunchpad上的P1.O接有一個(gè)LED. 3. 接下來到P1IES |= BIT3; 在上一節(jié)中已經(jīng)介紹了,P1IES 寄存器是中斷沿選擇寄存器。這里是選擇位下降沿觸發(fā)中斷。 4. P1IFG &= ~BIT3; 為清除中斷標(biāo)志,保證程序正常運(yùn)行,當(dāng)然此句可以不寫,這里只是做為例子 5. P1IE |= BIT3; 在上一節(jié)中已經(jīng)介紹了,P1IE寄存器是使能中斷事件發(fā)生的寄存器。 - _BIS_SR(LPM4_bits + GIE);這里使程序進(jìn)入最低功耗(LPM4)狀態(tài)。靠中斷來觸發(fā)喚醒CPU,在文章開始已經(jīng)介紹有,假如在中斷函數(shù)中沒有寫有退出低功耗狀態(tài)的指令,程序會(huì)在進(jìn)入低功耗的下一句中卡死,不再運(yùn)行下去。另外_BIS_SR(GIE); 為打開總中斷的意思。
- 接下來到中斷函數(shù)的編寫。以此為例,詳細(xì)介紹中斷函數(shù)的編寫。如上所示,中斷函數(shù)編寫的規(guī)則為
#pragma vector= 中斷向量源 __interrupt void 函數(shù)名(void) |
|
摁住“Ctrl + 左鍵”點(diǎn)擊PORT1_VECTOR即可查看到所有的“中斷向量” 在上面的中斷向量中,加黑的位中斷向量源,寫入中斷函數(shù)編寫語法規(guī)則里面即可。而函數(shù)名則可以任意編寫。比如我要編寫一個(gè)有定時(shí)器1,CCR0寄存器溢出產(chǎn)生的中斷,則可以這樣編寫 #pragma vector= TIMER1_A0_VECTOR __interrupt void T1A0Int(void) { //程序代碼。。。 } |
假如是多IO輸入中斷,則如下所寫。 vector=PORT1_VECTOR __interrupt void Port1() { |
| //以下為參考處理程序,不使用的端口應(yīng)當(dāng)刪除其對(duì)于中斷源的判斷。 if((P1IFG&BIT0) == BIT0) { P2OUT&=~BIT0; //處理P1IN.0中斷 P1IFG &= ~BIT0; //清除中斷標(biāo)志 //以下填充用戶代碼 } else if((P1IFG&BIT1) ==BIT1) { P2OUT&=~BIT1; //處理P1IN.1中斷 P1IFG &= ~BIT1; //清除中斷標(biāo)志 //以下填充用戶代碼 } else if((P1IFG&BIT2) ==BIT2) { P2OUT&=~BIT2; //處理P1IN.2中斷 P1IFG &= ~BIT2; //清除中斷標(biāo)志 //以下填充用戶代碼 } else if((P1IFG&BIT3) ==BIT3) { //處理P1IN.3中斷 P1IFG &= ~BIT3; //清除中斷標(biāo)志 //以下填充用戶代碼 } else if((P1IFG&BIT4) ==BIT4) { P2OUT&=~BIT4; //處理P1IN.4中斷 P1IFG &= ~BIT4; //清除中斷標(biāo)志 //以下填充用戶代碼 } else if((P1IFG&BIT5) ==BIT5) { //處理P1IN.5中斷 P1IFG &= ~BIT5; //清除中斷標(biāo)志 //以下填充用戶代碼 } else if((P1IFG&BIT6) ==BIT6) { //處理P1IN.6中斷 P1IFG &= ~BIT6; //清除中斷標(biāo)志 //以下填充用戶代碼 } else { //處理P1IN.7中斷 P1IFG &= ~BIT7; //清除中斷標(biāo)志 //以下填充用戶代碼 } LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽 } |
|
六 定時(shí)器模塊 文先,介紹幾個(gè)英文縮寫的意思以及一些注意的地方。 1. Timer0/1 定時(shí)器0/1,在User's Guide中用的是TimerA/B,所指的也是Timer0/1 。G2553Datasheet中用的是Timer0/1 ,本文以G2553Datasheet為準(zhǔn)。全文以Timer0為例,Timer1類同。 2. TAxR(x = 0/1)定時(shí)器x對(duì)應(yīng)的計(jì)數(shù)器,這是一個(gè)只讀寄存器。硬件自動(dòng)驅(qū)動(dòng)計(jì)數(shù)。 - EQUy(y = 0/1/2)計(jì)數(shù)事件發(fā)生寄存器,當(dāng)TAxR = TAxCCRy時(shí)EQUy置1
定時(shí)器簡(jiǎn)介 MSPG2553共有兩個(gè)定時(shí)器,Timer0、Timer1,他們都是十六位的定時(shí)、計(jì)數(shù)器,內(nèi)含三個(gè)捕獲、比較寄存器。兩個(gè)定時(shí)器均支持多個(gè)捕獲、PWM輸出、間歇性計(jì)時(shí),定時(shí)器包含多個(gè)中斷源,可以是計(jì)數(shù)溢出中斷、捕獲中斷等等。 定時(shí)器包含: 同步十六位定時(shí),計(jì)數(shù)器運(yùn)行模式。 時(shí)鐘源從MCLK、SMCLK、ACLK任意選擇 三個(gè)比較,捕獲寄存器。 中斷向量寄存器能快速解碼的所有定時(shí)器中斷 Timer0組成框圖 下面簡(jiǎn)要介紹一下該硬件框圖的意思,從左上角看,首先是一個(gè)時(shí)鐘源選擇寄存器TASSELx,通過該寄存器選擇定時(shí)器的時(shí)鐘源,選擇了時(shí)鐘源后有一個(gè)分頻器Divider,相應(yīng)的設(shè)置寄存器是IDx,再過來就到一個(gè)定時(shí)器的核心部分,一個(gè)16位的定時(shí)器TAR。其右側(cè)有一個(gè)定時(shí)器的計(jì)數(shù)模塊,MCx寄存器用來設(shè)置計(jì)數(shù)模式。接下來,TAR正下方有三個(gè)橫線,右側(cè)標(biāo)有CCR0、CCR1、CCR2,意思是CCR1、CCR0的框圖和下方CCR2的框圖是一樣的。此處省略不寫。在CCR中,左上角為一個(gè)捕獲源選擇寄存器。可以從CCI2A、CCI2B、GND或者VCC選擇捕獲源,選擇捕獲源后有一個(gè)選擇捕獲模式寄存器Capture Mode,然后過來有一個(gè)捕獲溢出狀態(tài)寄存器COV,SCS同步/異步捕獲模式選擇位,然后連接到捕獲比較寄存器。下方為模式選擇寄存器,具體設(shè)置可以查看相應(yīng)的寄存器設(shè)置。 這里僅是大概介紹一下Timer0的寄存器,具體的設(shè)置使用還看參考相應(yīng)的寄存器并結(jié)合例程慢慢學(xué)習(xí)理解。 定時(shí)器運(yùn)行方式 下面簡(jiǎn)要重點(diǎn)介紹定時(shí)器計(jì)數(shù)模塊的四種模式以及7種輸出模式。 Timer0有一個(gè)在不斷計(jì)數(shù)的只讀寄存器TA0R。計(jì)數(shù)器的計(jì)數(shù)模式共有四種, 停止模式(Stop mode)、連續(xù)增計(jì)數(shù)模式(Up mode)、遞增計(jì)數(shù)模式(continuous mode)、增減計(jì)數(shù)模式(Up/down mode)。由上圖可知,這四種模式可以通過MCx寄存器進(jìn)行設(shè)置。 以上四種模式可以由下圖可以很好理解。 1. Stop模式計(jì)數(shù)器不工作。 2. 連續(xù)計(jì)數(shù)模式為計(jì)數(shù)器從零開始連續(xù)增計(jì)數(shù)一直到0xFFFF即65535,然后又重新從零開始計(jì)數(shù)。 3. 遞增計(jì)數(shù)模式與連續(xù)計(jì)數(shù)模式僅有一點(diǎn)點(diǎn)區(qū)別,遞增模式為計(jì)數(shù)器連續(xù)增加到TA0CCR0(即圖中的CCR0)中的值后又重新從零開始計(jì)數(shù)。TA0CCR0的值時(shí)可以在程序中直接賦值的。 4. 遞增遞減模式也很好理解,計(jì)數(shù)器從零開始計(jì)數(shù)到CCR0后又自動(dòng)減數(shù),到零后又增計(jì)數(shù),就像三角波一樣。 每一個(gè)捕獲比較模塊都有一個(gè)輸出單元,這個(gè)輸出單元專門用來產(chǎn)生以下如PWM的波形信號(hào),每一個(gè)輸出單元都可以通過配置OUTMOD寄存器的值來設(shè)定八種信號(hào)輸出模式, 接下來再介紹一下定時(shí)器的捕獲/比較功能,具體應(yīng)查看技術(shù)手冊(cè)。 捕獲模式 捕獲模式可以用來速度計(jì)算或時(shí)間測(cè)量.CCIxA ,CCIxB的捕獲源可以連接到外部引腳或者內(nèi)部信號(hào),可以設(shè)定CCIDx,CMx,位讓寄存器捕獲上升,下降,或者兩個(gè)信號(hào)的邊緣.輸入信號(hào)的電平可以通過CCI位的讀取. 當(dāng)設(shè)置寄存器CAP=1時(shí),使能捕獲模塊. 比較模式 比較模式設(shè)置CAP = 0的情況向,比較模式用于產(chǎn)生PWM信號(hào)。或者在指定時(shí)間里輸出終端信號(hào),當(dāng)TAxR計(jì)數(shù)到TACCRx時(shí) 建立起CCIFG位 中斷事件發(fā)生標(biāo)志位EQUx=1 EQUx的隱含改變將影響輸出模式 輸入信號(hào)CCI被鎖上SCCI
2. 遞增計(jì)數(shù)模式下的輸出 * **************************************************************** / / ****************************************************************** * TACTL寄存器,Timer_A 控制寄存器 * TASSEL_x:TA時(shí)鐘源選擇寄存器 * 00 TACLK * 01 ACLK * 10 SMCLK * 11 INCLK * IDx: 時(shí)鐘源分頻寄存器。為輸入時(shí)鐘分頻選擇 * 00 /1 * 01 /2 * 10 /4 * 11 /8 * * ************************************************************** / * 定時(shí)計(jì)數(shù)模塊 =四中模式+7種輸出方式 / ***************************************************************** * * MCx: 計(jì)數(shù)模式寄存器 模式控制,當(dāng)TA不用于節(jié)省功耗時(shí),將MCx=00h * 00 停止模式:定時(shí)器停止 * 01 增模式 :定時(shí)器計(jì)數(shù)到TACCR0 * 10 連續(xù)模式:定時(shí)器計(jì)數(shù)到0FFFFh * 11 增減模式:定時(shí)器計(jì)數(shù)到TACCR0 然后減到000h * * TACLR: 定時(shí)器清零。置位時(shí)會(huì)復(fù)位TAR,時(shí)鐘分頻和計(jì)數(shù)方向。 * TACLR位會(huì)自動(dòng)復(fù)位并讀出值為零。 * * TAIE: TA中斷允許。改為允許TAIFG中斷請(qǐng)求 * 0 中斷禁止 * 1 中斷允許 * TAIFG: TA中斷標(biāo)志位 * 0 無中斷掛起 * 1 中斷掛起 * ************************************************************** / / ***************************************************************** * * * TACCTLx,捕獲比較控制寄存器 * CMx: 捕獲模式 * 00 不捕獲 * 01 上升沿捕獲 * 10 下降沿捕獲 * 11 上升和下降同時(shí)捕 * CCISx: 捕獲比較選擇,改為選擇TACCRx的輸入信號(hào) * 00 CCIxA * 01 CCIxB * 10 GND * 11 VCC * SCS: 同步捕獲源,改為用于將捕獲通信和同步時(shí)鐘 * 0 異步捕獲 * 1 同步捕獲 * SCCI:同步的捕獲/比較輸入,所選擇的輸入信號(hào)由EQUx信號(hào)所存, * 并可通過該位讀取 * CAP: 捕獲模式 * 0 比較模式 * 1 捕獲模式 *OUTMODx:輸出模式位,對(duì)TACCR0無效 * 000 OUT 位的值 * 001 置位 * 010 翻轉(zhuǎn)/復(fù)位 * 011 復(fù)位/復(fù)位 * 100 翻轉(zhuǎn) * 101 復(fù)位 * 110 翻轉(zhuǎn)/置位 * 111 復(fù)位/置位 * CCIE: 捕獲比較中斷允許位 * 0 中斷禁止 * 1 中斷允許 * CCI: 捕獲比較輸入 * OUT: 對(duì)于輸出模式0,該位直接控制輸出狀態(tài) * COV: 捕獲溢出位。該位表示一個(gè)捕獲溢出發(fā)生,由軟件復(fù)位 * CCIFG:捕獲比較中斷標(biāo)志位 * 0 沒有中斷掛起 * 1 有中斷掛起 * ***************************************************************/ #include <msp430g2553.h> unsigned int A=10, B=20 ; void main (void) { WDTCTL = WDTPW + WDTHOLD; TACTL|=TASSEL_2+TACLR+MC_1+ID_3; // SMCLK時(shí)鐘 ;定時(shí)器清零;增模式 8分頻 CCTL0=CCIE; //捕獲中斷允許 CCR0=B; //TACCR0 裝載值 CCTL1=OUTMOD_7; //輸出模式復(fù)位 CCR1=A; // BCSCTL1 P1DIR=BIT6; P1SEL=BIT6; // _EINT(); //使能所有中斷 while(1); } /*#pragma vector=TIMER0_A0_VECTOR __interrupt void ta0_isr(void) { unsigned int i; for(i=0;i<num;i++) pwm=i; }*/ 定時(shí)器中斷 這里以定時(shí)器0為例,定時(shí)器1同。 定時(shí)器的中斷可有定時(shí)器TA0CCR0溢出產(chǎn)生,也可由TA0CCRx(x =1/2)溢出產(chǎn)生、捕獲/比較事件發(fā)生引起的中斷,前者有一個(gè)專用的中斷向量,TIMER0_A0_VECTOR,而后者用的TIMER0_A1_VECTOR,至于是哪一個(gè)中斷時(shí)間發(fā)生,還要根據(jù)標(biāo)志位來判斷。 下面以官方例程LaunchPad Lab2為例介紹定時(shí)器A的操作。 例一 #include <msp430g2553.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { while(1); // If calibration constants erased, trap CPU!! } BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO P1DIR = 0x40; // P1.6 output (green LED) P1OUT = 0; // LED off IFG1 &= ~OFIFG; // Clear OSCFault flag BCSCTL1 |= DIVA_3; // ACLK = VLO/8 BCSCTL2 |= SELM_3 + DIVM_3 + DIVS_3; // MCLK = DCO/8, SMCLK = DCO/8 // Configure TimerA TACTL = TASSEL_1 + MC_1 + TAIE; // Source: ACLK, UP mode CCR0 = 5100; //Timer count 5100 CCR1 = 2000; //Timer count 100 CCTL0 = CCIE; //CCR0 interrupt enabled CCTL1 = CCIE; //CCR1 interrupt enabled _BIS_SR(GIE); for(;;); } // Timer A0 interrupt service routine #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A0 (void) { P1OUT |= BIT6; // P1.6 output High } // Timer A1 Interrupt Vector (TA0IV) handler #pragma vector=TIMER0_A1_VECTOR __interrupt void Timer_A1(void) { switch( TA0IV ) { case 2: P1OUT &= ~BIT6; // P1.6 output Low |
|
程序一開始關(guān)閉看門狗,if語句作為時(shí)鐘校準(zhǔn)的范例,可以刪去。BCSCTL3 |= LFXT1S_2; 選擇超低頻時(shí)鐘源。然后設(shè)定輸出口,清除中斷標(biāo)志,時(shí)鐘源分頻設(shè)定,接下里組建定時(shí)器A,即定時(shí)器0,在詳細(xì)介紹代碼之前,首先看頭文件關(guān)于定時(shí)器相關(guān)寄存器的設(shè)定。 例二 下面舉一個(gè)無需中斷服務(wù)函數(shù)、硬件自動(dòng)實(shí)現(xiàn)產(chǎn)生兩路PWM的例子。 代碼很簡(jiǎn)單,初始化一下即可。 #include<msp430g2553.h> void Set_TimerB_PWM(void) { //使用系統(tǒng)初始化時(shí)的默認(rèn)時(shí)鐘1MHz,定時(shí)器B專門用于產(chǎn)生PWM 波形。 TA1CTL = TASSEL_2 + MC_1 + TACLR;//使用系統(tǒng)次主機(jī)SMCKL、增計(jì)數(shù)模式、清楚定時(shí)器B時(shí)鐘 TA1CCR0 = 5001 - 1;//在1MHz的主頻率下,1*10^6/5000=200Hz的中斷頻率 TA1CCR1 = 3751 - 2;//當(dāng)寄存器TACCR1的值小于3750時(shí),輸出口保持高電平。5000*3/4=3750,此路產(chǎn)生3:1的PWM波形。 TA1CCR2 = 1251 - 2;//當(dāng)寄存器TACCR1的值小于1250時(shí),輸出口保持高電平。5000*1/4=1250,產(chǎn)生1:3的PWM波 TA1CCTL1 = OUTMOD_7;//輸出模式7,計(jì)數(shù)器計(jì)數(shù)到5000計(jì)數(shù)器自動(dòng)置位,無需中斷服務(wù)子函數(shù)。 TA1CCTL2 = OUTMOD_7;//輸出模式7,計(jì)數(shù)器計(jì)數(shù)到5000計(jì)數(shù)器自動(dòng)置位,無需中斷服務(wù)子函數(shù)。 P2SEL |= BIT1 + BIT5;//只有這兩路可選(為什么是這兩路?在G2553Datasheet中有特別指明)。做第二功能使用(PWM輸出) P1DIR |= BIT6; //電機(jī)控制口CTL//這里與本例無關(guān) P1OUT &= ~BIT6; //start with 0 -->IN2,4為1,滅//這里與本例無關(guān) } |
初始化時(shí)鐘后直接調(diào)用該函數(shù)即可。 我這里使用的是定時(shí)器B(即Timer1)。詳細(xì)的介紹見以上備注。 七 時(shí)鐘配置 時(shí)鐘源:
外部晶體振蕩器 超低頻率振蕩器(VLO) 數(shù)字控制振蕩器(DCO)
時(shí)鐘信號(hào):
ACLK :Auxiliary clock.輔助時(shí)鐘。 MCLK :Master clock主時(shí)鐘。 SMCLK :Second Master clock次主機(jī)時(shí)鐘。 內(nèi)部晶體振蕩器產(chǎn)生時(shí)鐘后經(jīng)過DCOR、SCG0、RSELx、DCO等各個(gè)寄存器為MCLK、SMCLK提供時(shí)鐘源 內(nèi)部時(shí)鐘還有一個(gè)超低頻率內(nèi)置晶體振蕩器(VLO)在上圖的最上方。可作為低頻時(shí)鐘源。 另外一個(gè)部分是系統(tǒng)的外部時(shí)鐘,外部晶振經(jīng)過LFXT等各個(gè)寄存器設(shè)置后可以為MCLK、ACLK提供時(shí)鐘源。 上圖中SELM、SELS為時(shí)鐘源選擇寄存器。 上圖中DIVA、DIVM、DIVS都是分頻器,時(shí)鐘源可以經(jīng)過1/2/4/8分頻后為CPU提供時(shí)鐘,以降低功耗。
ADC10的時(shí)鐘部分框圖
Timer_A的結(jié)構(gòu)框圖 Timer_A不能選擇MCLK作為Timer_A的時(shí)鐘
CPU是處理器的核心部分,它使用的時(shí)鐘始終是MCLK。 上電后,系統(tǒng)默認(rèn)使用的主系統(tǒng)時(shí)鐘MCLK和子系統(tǒng)時(shí)鐘SMCLK是同為DCOCLK產(chǎn)生的1MHz時(shí)鐘,而輔助時(shí)鐘ACLK則為內(nèi)部VLOCLK產(chǎn)生的12KHz時(shí)鐘 MSP430低功耗模式 單片機(jī)中,功耗最低的單片機(jī)要MSP430單片機(jī),這是做手持設(shè)備最優(yōu)選擇,MSP430中,用到5種低功耗,LPM0,LPM1,LPM2,LPM3,LPM4,這五種低功耗各種解釋如下 : LPM0:CPU停止工作,MCLK時(shí)鐘停止,SMCLK、ACLK時(shí)鐘還在工作。 LPM1:CPU停止工作,MCLK時(shí)鐘停止,在活動(dòng)模式如果DCO沒有作為MCLK和SMCLK時(shí)鐘時(shí),則直流發(fā)生器被禁止,否則就保持活動(dòng)狀態(tài),SMCLK、ACLK時(shí)鐘依然還在工作。 LPM2:CPU停止工作,MCLK、SMCLK時(shí)鐘停止工作,如果DCO沒有作為MCLK、SMCLK,自動(dòng)被禁止直流發(fā)生器保持有效,ACLK還處于工作中。 LPM3:CPU停止工作,MCLK、SMCLK時(shí)鐘停止工作,DCO時(shí)鐘也停止工作,僅ACLK時(shí)鐘還處于工作狀態(tài)。 LPM4:CPU停止工作,MCLK、SMCLK時(shí)鐘停止工作,DCO時(shí)鐘也停止工作,ACLK也停止工作。此時(shí)功耗最低。 一般情況下,處理器進(jìn)入低功耗模式后,由中斷來喚醒,外部中斷或內(nèi)部中斷。 如果想進(jìn)入低功耗1,則程序可以為:_BIS_SR(LPM1_bits + GIE);退出低功耗1,則程序可以為:LPM1_EXIT; 進(jìn)入其他低功耗和退出低功耗一樣。 低功耗執(zhí)行的一個(gè)過程:程序從main函數(shù)入口開始執(zhí)行程序,當(dāng)遇到進(jìn)入低功耗程序時(shí),如:_BIS_SR(LPM1_bits + GIE);此時(shí)相當(dāng)于下面的程序處于停止?fàn)顟B(tài)不再執(zhí)行,當(dāng)有一個(gè)中斷來到,則會(huì)進(jìn)入中斷處理程序,自動(dòng)退出低功耗,如果在中斷中沒有沒有退出低功耗,當(dāng)中斷服務(wù)程序執(zhí)行完成后,又會(huì)重新進(jìn)入低功耗。
完整的Word格式文檔51黑下載地址:
|