1MSP430G2553概述
? 低電源電壓范圍:1.8V 至 3.6V
? 超低功耗
– 運(yùn)行模式:230μA(在 1MHz 頻率和 2.2V 電壓 條件下)
– 待機(jī)模式:0.5μA
– 關(guān)閉模式(RAM 保持):0.1μ
? 5 種節(jié)能模式
? 可在不到 1μs 的時(shí)間里超快速地從待機(jī)模式喚醒
? 16 位精簡(jiǎn)指令集 (RISC) 架構(gòu),62.5ns 指令周期時(shí)間
? 基本時(shí)鐘模塊配置
– 具有四種校準(zhǔn)頻率并高達(dá) 16MHz 的內(nèi)部頻率
– 內(nèi)部超低功耗低頻 (LF) 振蕩器
– 32kHz 晶振
– 外部數(shù)字時(shí)鐘源
? 兩個(gè) 16 位 Timer_A,分別具有三個(gè)捕獲/比較寄存器
? 多達(dá) 24 個(gè)支持觸摸感測(cè)的 I/O 引腳
? 通用串行通信接口 (USCI)
– 支持自動(dòng)波特率檢測(cè)的增強(qiáng)型通用異步收發(fā)器 (UART)
– IrDA 編碼器和解碼器
– 同步 SPI
– I2C?
? 用于模擬信號(hào)比較功能或者斜率模數(shù) (A/D) 轉(zhuǎn)換的 片載比較器
? 帶有內(nèi)部基準(zhǔn)、采樣與保持以及自動(dòng)掃描功能的 10位 200ksps 模數(shù) (A/D) 轉(zhuǎn)換器
? 欠壓檢測(cè)器
? 串行板上編程,無(wú)需外部編程電壓,利用安全熔絲實(shí)現(xiàn)可編程代碼保護(hù)
? 具有兩線(xiàn)制 (Spy-Bi-Wire) 接口的片上仿真邏輯電路
2系統(tǒng)時(shí)鐘
MSP430G2553有三種時(shí)鐘的功能:
MCLK:主時(shí)鐘,專(zhuān)門(mén)為CPU運(yùn)行提供的時(shí)鐘
SMCLK:子系統(tǒng)時(shí)鐘,專(zhuān)為一些需要高速時(shí)鐘的片內(nèi)外設(shè)提供服務(wù),比如定時(shí)器和ADC采樣
ACLK:輔助時(shí)鐘,供給那些只需要低頻時(shí)鐘的片內(nèi)外設(shè),比如LCD控制器
//將MSP430G2553的時(shí)鐘設(shè)置為:MCLK和SMCLK均為16MHz,ACLK設(shè)為內(nèi)部低頻振蕩器
DCOCTL=CALDCO_16MHz; //調(diào)取出廠(chǎng)校準(zhǔn)后儲(chǔ)存在Flash中的參數(shù)
BCSCTL1=CALBC1_16MHz;
BCSCTL3 |=LFXT1S1; //設(shè)為內(nèi)部低頻振蕩器
//將ACLK設(shè)為使用32.768KHz晶振且4分頻
BCSCTL |=DIVA_2;
//將MSP430G2553的時(shí)鐘設(shè)置為:MCLK為4MHz,SMCLK為2MHz,ACLK設(shè)為使用32.768KHz晶振
DCOCTL=CALDCO_8MHz; //先設(shè)置為8MHz
BCSCTL1=CALBC1_8MHz;
BCSCTL2 |=DIVM_1+DIVS_2; //再對(duì)MCLK2分頻,SMCLK4分頻
3GPIO與中斷功能
I/O口方向寄存器:PxDIR
I/O口輸入寄存器:PxIN
I/O口輸出寄存器:PxOUT
控制內(nèi)部上、下拉電阻寄存器:PxREN
MSP430G2553單片機(jī)的P1口與P2口帶中斷
是否允許I/O中斷寄存器:PxIE
中斷標(biāo)志位寄存器:PxIFG
中斷邊沿選擇寄存器:PxIES
MSP430G2553單片機(jī)是寫(xiě)位操作,例子如下:
//將P1.0置1,P1.1置0,P1.2取反,不影響其他位
P1OUT |=0X01; //按位"或",相當(dāng)于置1
P1OUT &=~0x02; //取反后再按位"與",相當(dāng)于置0
P1OUT ^=0x04; //按位"異或",相當(dāng)于取反
//將P1.0,P1.1,P1.2均置1,不影響其他位
P1OUT |=BIT0+BIT1+BIT2; //可用加法進(jìn)行批量設(shè)置
在實(shí)際編程中,可以用宏定義來(lái)消除“線(xiàn)與”邏輯帶來(lái)的不便。 例如,將P1.0設(shè)為“線(xiàn)與”邏輯輸出,可以用如下宏定義來(lái)描述:
#define P10_ON P1DIR &=~BIT0 //I/O設(shè)為輸入, 相當(dāng)于"線(xiàn)與"輸出1
#define P10_OFF P1DIR |=BIT0;P1OUT &=~BITO //I/O設(shè)為輸出,輸出0
MSP430G2553使用外部中斷步驟如下:
1:通過(guò)PxDIR將I/O口方向設(shè)為輸入
2:寫(xiě)PxIES可決定中斷的邊沿是上升沿、下降沿或兩種情況均中斷
3:如果是機(jī)械按鍵輸入,可以通過(guò)PxREN啟用內(nèi)部上(下)拉電阻,根據(jù)按鍵的接法,設(shè)定PxOUT決定最終是上拉電阻還是下拉電阻
4:配置PxIE寄存器可開(kāi)啟I/O中斷,“_enable_interrupts(); ”可開(kāi)啟總中斷
5:在中斷子函數(shù)中,通過(guò)if語(yǔ)句查詢(xún)具體中斷的I/O口,如果是機(jī)械按鍵輸入,還需要消抖代碼
6:根據(jù)具體I/O口的輸入,編寫(xiě)事件處理函數(shù)
7:退出中斷前,使用“PxIFG=0; ”來(lái)清除I/O中斷標(biāo)志位
4Timer_A定時(shí)器
MSP430G2553單片機(jī)的Timer_A模塊的整體構(gòu)造包括1個(gè)16位定時(shí)器和3個(gè)捕獲/比較模塊。
由于捕獲模塊Caputre和比較模塊Comparator共用了TACCRx寄存器,所以捕獲模塊Caputre的功能是寫(xiě)TACCRx,而比較模塊Comparator的功能是讀TACCRx模塊,所以捕獲和比較不能同時(shí)使用。 CAP寄存器位用于選擇捕獲/比較工作模式,CAP=0為比較,CAP=1為捕獲。
CCRx可以選擇檢測(cè)上升沿或下降沿,或者都檢測(cè)。 CCRx用于測(cè)定信號(hào)脈寬時(shí),只需要分別記錄上升沿時(shí)刻和下降沿時(shí)刻,兩個(gè)時(shí)刻相減就是脈寬; 而測(cè)量頻率時(shí),連續(xù)記錄兩次上升時(shí)刻,相減就是周期。
51單片機(jī)外部中斷法與捕獲法的區(qū)別:
外部中斷法:邊沿被檢測(cè)——觸發(fā)中斷——進(jìn)中斷子函數(shù)——讀取定時(shí)器值,這時(shí)讀取的定時(shí)器值和實(shí)際邊沿的時(shí)刻有較大的誤差
捕獲法:邊沿被檢測(cè)——立刻讀取定時(shí)器值TAR并鎖存到CCRx模塊內(nèi)TACCRx寄存器——觸發(fā)中斷——什么時(shí)候讀TACCRx都可以。 這樣的誤差延時(shí)就僅有10ns級(jí)
比較模式用于設(shè)定定時(shí)器的周期
比較模塊的OUTMODx設(shè)置。 普通PWM時(shí),超前PWM(上升沿在主定時(shí)器0位置)配置模式7,滯后PWM配置模式3; 帶死區(qū)PWM時(shí),兩路輸出都必須開(kāi)啟,并且一路模式為6,另一路必須為2。
注意: 雖然每個(gè)Timer_A模塊有3個(gè)捕獲/比較模塊(CCR0/1/2),但是CCR0的寄存器TACCR0已被用于設(shè)定PWM頻率,因此用CCR1和CCR2最多能生成2路獨(dú)立的PWM信號(hào)。 CCR0的比較值TACCR0用于設(shè)定周期,CCR1/2的比較值TACCR1/2用于設(shè)定占空比。
5WDT定時(shí)器
WDT(Watch Dog Timer)俗稱(chēng)看門(mén)狗
復(fù)位引腳被設(shè)置成NMI不可屏蔽中斷來(lái)使用,這個(gè)中斷和普通I/O外部中斷一樣,有中斷子函數(shù); 其區(qū)別是NMI中斷不需要開(kāi)總中斷使能(因?yàn)椴豢善帘?,所以?xún)?yōu)先級(jí)最高),NMI每次中斷后會(huì)自動(dòng)關(guān)閉NMI中斷使能。
//當(dāng)看門(mén)狗被設(shè)定為1s定時(shí)復(fù)位,那么"喂狗"的代碼是這樣的:
WDTCTL=WDT_ARST_1000; //該宏定義包含了喂狗,并重新設(shè)定看門(mén)狗定時(shí)值的代碼
變量知識(shí)點(diǎn):
全局變量:具有全局作用域,全局變量只需在一個(gè)源文件中定義,就可以作用于所有的源文件。
靜態(tài)全局變量:具有全局作用域,它與全局變量的區(qū)別在于如果程序包含多個(gè)文件的話(huà),它作用于定義它的文件里,不能作用到其它文件里,即被 static 關(guān)鍵字修飾過(guò)的變量具有文件作用域。
局部變量:具有局部作用域,它是自動(dòng)對(duì)象(auto),它在程序運(yùn)行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用執(zhí)行結(jié)束后,變量被撤銷(xiāo),其所占用的內(nèi)存也被收回。
靜態(tài)局部變量:具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運(yùn)行結(jié)束都一直存在。
int a = 0; //全局變量
static int b=0;//靜態(tài)全局變量
main()
{
int c; //局部變量
static int d;//靜態(tài)局部變量
}
狀態(tài)機(jī)知識(shí)點(diǎn):
狀態(tài)機(jī)也叫有限狀態(tài)機(jī),簡(jiǎn)稱(chēng)狀態(tài)機(jī)。 狀態(tài)機(jī)的概念來(lái)源于時(shí)序邏輯電路,又細(xì)分為Mealy狀態(tài)機(jī)和Moore狀態(tài)機(jī),兩者的區(qū)別在于是否根據(jù)狀態(tài)就能得出輸出結(jié)果。
單片機(jī)中借用了這兩種狀態(tài)機(jī)的思想,引申出“狀態(tài)中判斷事件”和“事件中查詢(xún)狀態(tài)”兩種單片機(jī)狀態(tài)的編程方法。
狀態(tài)中判斷事件:
這種方法類(lèi)似與Mealy型狀態(tài)機(jī)(不完全等同),即在switch語(yǔ)句中,還需判斷Event才能決定輸出的結(jié)果。
//--------狀態(tài)中查詢(xún)事件(Mealy狀態(tài)機(jī))---------
switch(State)
{
case 0: if(Event_0) Action2(); //路徑1
if(Event_1) {State=2; Action0();} //路徑3
if(Event_2) State=2; //路徑4
break;
case 1: if(Event_0) State2; //路徑5
if(Event_2) {State=0; Action2();} //路徑2
break;
case 2: if(Event_1) {State=1; Action1();} //路徑6
break;
default: break;
}
事件中查詢(xún)狀態(tài):
這種方法類(lèi)似于Moore型狀態(tài)機(jī)(不完全等同),在switch語(yǔ)句中,即無(wú)需再判斷Event,由當(dāng)前狀態(tài)就知道結(jié)果。
//--------事件中查詢(xún)狀態(tài)(Moore狀態(tài)機(jī))---------
if(Event_0) //中斷或掃描得知Event0事件發(fā)生
{
switch(State)
{
case 0: Action2(); break; //路徑1
case 1: State=2; break; //路徑5
default: break;
}
}
if(Event_1) //中斷或掃描得知Event1事件發(fā)生
{
switch(State)
{
case 0: State=2; Action0(); break; //路徑3
case 2: State=1; Action1(); break; //路徑6
default: break;
}
}
if(Event_2) //中斷或掃描得知Event2事件發(fā)生
{
switch(State)
{
case 0: State=2; break; //路徑4
case 1: State=0; Action2(); break; //路徑2
default: break;
}
}
兩種狀態(tài)機(jī)的優(yōu)缺與區(qū)別:
1:如果Event直接由中斷引發(fā),不需要if語(yǔ)句輪詢(xún)就能判斷,則用Moore型轉(zhuǎn)態(tài)機(jī)(事件中查詢(xún)狀態(tài))執(zhí)行速度快。 這是因?yàn)?,只需?zhí)行對(duì)應(yīng)Event的switch(State)語(yǔ)句,而且switch中只需State進(jìn)行判斷就可以輸出結(jié)果了。
2:如果Event本身就需要輪詢(xún)才能得出,則使用Mealy型狀態(tài)機(jī)(狀態(tài)中查詢(xún)事件)的代碼要簡(jiǎn)單。 因?yàn)闋顟B(tài)中查詢(xún)事件只有一個(gè)switch(State)語(yǔ)句。
評(píng)論