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