內部資源篇
1: 把主系統時鐘設置為高頻晶體振蕩器:
#include<msp430x14x.h>
void main()
{
WDTCTL=WDTPW+WDTHOLD;
P5DIR|=BIT4;
P5SEL|=BIT4; //p5.4選擇做為mclk的輸出端
BCSCTL1&=~XT2OFF; //XT2=HF XTAL
do
{ unsigned int i;
IFG1&=~OFIFG; //clear OSCFault Flag
for(i=0xff;i>0;i--); //Time for flag to set
}while((IFG1&OFIFG)); //OSCFault flag still OFIFG默認為1 時是沒有振蕩的
BCSCTL2|=SELM_2; ////MCLK=XT2(safe)
////////////////////////該段程序為切換主時鐘的程序
for(;;);//do nothing
}
步驟:第一步:關閉看門狗
第二步:打開高頻晶體振蕩器 通過設置寄存器 BCSCTL1
第三步:等待高頻晶體振蕩器起振 然后在進行第四部的時鐘源切換
第四步:設置主系統時鐘為高頻晶體振蕩器 通過 寄存器 BCSCTL2
2 低功耗模式:
#include <msp430x14x.h>
#define uint unsigned int
void main(void)
{
P6DIR |= BIT2;P6OUT |= BIT2; //關電平轉換
BCSCTL1 |= DIVA_2; // ACLK/4
WDTCTL = WDT_ADLY_1000; // WDT 1s/4 interval timer
IE1 |= WDTIE; // Enable WDT interrupt
while(1)
{
uint i;
_BIS_SR(LPM3_bits + GIE); // Enter LPM3
// 或者寫 _EINT(); LPM3;
P3OUT &= ~BIT5; // Set P3.5 LED on
for (i = 18000; i>0; i--); // Delay
P3OUT |= BIT5; // Clear P3.5 LED off
}
}
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
//或者寫 LPM3_EXIT;
}
步驟: 第一步:先寫看門狗延時函數 ,開看門狗中斷
第二步:寫進入低功耗模式 開總中斷 _EINT(); LPM3;
第三步: 寫應用程序
第四步: 寫中斷函數 退出低功耗 LPM3_EXIT;
3 看門狗定時器與低功耗模式應用
#include<msp430x14x.h>
int flag;
void main()
{
WDTCTL=WDT_MDLY_32;
IE1|=WDTIE;
P2DIR|=BIT7;
_EINT();//開全局中斷
LPM0;
}
#pragma vector=WDT_VECTOR
__interrupt void WDTDOG_time()
{
flag++;
if(flag==10)
{
P2OUT^=BIT7;
flag=0;
}
}
步驟: 第一步: 設置看門狗為定時模式
第二步:使能看門狗中斷
第三步: 開全局中斷 //用簡寫模式 LPMx 必須寫 _EINT();
第四步: 寫應用程序
第五步: 進入低功耗模式
第六步: 寫看門狗中斷服務函數
4 低功耗模式下的時鐘源工作狀態驗證 (2013 09 18)
/********************************************
此程序用看門狗定時器讓LED間隔閃爍
也可用來檢測不同低功耗模式下SMCLK 與ACLK的工作狀態
通過此程序 表面 LPM0 1 2 3情況下ACLK工作
LPM4情況下 ACLK不工作
SMCLK 在LPM2 3 4情況下不工作
在LPM 0 1情況下工作
但這與書本上說的有點不同
*********************************************/
#include<msp430x14x.h>
int flag;
void main()
{
WDTCTL=WDT_MDLY_32;
//WDTCTL=WDT_ADLY_1000;
IE1|=WDTIE;
P2DIR|=BIT7;
_EINT();//開全局中斷
LPM0;
}
#pragma vector=WDT_VECTOR
__interrupt void WDTDOG_time()
{
flag++;
if(flag==2)
{
P2OUT^=BIT7;
flag=0;
}
}
5 定時器A 之連續計數模式 2013 09 20
#include<msp430x14x.h>
void main()
{
WDTCTL=WDTHOLD+WDTPW; //關狗
P2DIR|=BIT1;
CCTL0=CCIE; //使能CCR0中斷
CCR0=50000; //這個CCR0 與TACCR0一樣 但多寫成CCRO
TACTL=TASSEL_2+MC_2; //smclk continue mode
_EINT(); //開全局中斷
LPM1; //進入低功耗
}
#pragma vector=TIMERA0_VECTOR
__interrupt void timerA ()
{
P2OUT^=BIT1;
CCR0+=50000;//連續計數模式下 CCR0必須加偏置 才能保持方波周期恒定
}
注意: 定時器A操作步驟:
第一步: 打開定時器A的中斷
第二步: 選擇定時器A的時鐘源 分頻器 計數模式
6 定時器A 之增計數模式 2013 09 20
/********************************
定時器A的增計數模式
************************************/
#include<msp430x14x.h>
void main()
{
WDTCTL=WDTPW+WDTHOLD; //關小狗
P2DIR|=BIT2;
CCTL0=CCIE; //使能CCR0
CCR0=50000;
TACTL=TASSEL_2+MC_1; //SMCLK UP MODE
_EINT(); //開全局中斷
LPM1;
//_BIS_SR(LPM0_bits + GIE);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void timeA0()
{
P2OUT^=BIT2;
}
特別注意: 這個程序在編譯過程中若選擇F1612就不能實現功能 但選擇
F149 F169都可以 這是神馬歌原因呢
7 定時器A的雙中斷運用 2013 09 20
/****************************************************
定時器A工作在連續計數模式下 用CCRO在P2.0出產生一方波
用溢出中斷在P2.7產生一方波
****************************************************/
#include<msp430x14x.h>
void main()
{
WDTCTL=WDTPW+WDTHOLD; //關小狗
P2DIR=BIT0+BIT7;
CCTL0=CCIE; //CCRO中斷允許
CCR0=20000;
TACTL|=MC_2+TASSEL_2+TAIE; //SMCLK CONTINUE MODE 溢出中斷允許
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
//TimerA0 CCRO中斷服務函數
#pragma vector=TIMERA0_VECTOR
__interrupt void timerA0()
{
P2OUT^=BIT0;
CCR0+=20000;//連續計數模式下 CCR0必須加偏置 才能保持方波周期恒定
}
//TimerA1 溢出中斷服務函數
#pragma vector=TIMERA1_VECTOR
__interrupt void timerA1()
{
switch(TAIV)
{
case 2 : break;//CCR1
case 4: break;//CCR2
case 10: P2OUT^=BIT7; break;
}
}
//特別注意: 定時器A有4個中斷 CCRO 單獨使用一個中斷向量TIMERA0_VECTOR
而CCR1 CCR2 溢出中斷 共用一個中斷向量