找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6334|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

MSP430單片機(jī)內(nèi)部資源總結(jié)(含程序)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71834 發(fā)表于 2015-1-8 09:29 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
                                     第一章   內(nèi)部資源篇

1:  把主系統(tǒng)時(shí)鐘設(shè)置為高頻晶體振蕩器:
#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默認(rèn)為1 時(shí)是沒(méi)有振蕩的
    BCSCTL2|=SELM_2;              ////MCLK=XT2(safe)

    ////////////////////////該段程序?yàn)榍袚Q主時(shí)鐘的程序

    for(;;);//do nothing
}


步驟:第一步:關(guān)閉看門(mén)狗
      第二步:打開(kāi)高頻晶體振蕩器    通過(guò)設(shè)置寄存器 BCSCTL1
      第三步:等待高頻晶體振蕩器起振    然后在進(jìn)行第四部的時(shí)鐘源切換
      第四步:設(shè)置主系統(tǒng)時(shí)鐘為高頻晶體振蕩器  通過(guò) 寄存器 BCSCTL2


2      低功耗模式:
#include  <msp430x14x.h>
#define uint unsigned int
void main(void)
{
  P6DIR |= BIT2;P6OUT |= BIT2;              //關(guān)電平轉(zhuǎn)換
  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
//  或者寫(xiě)      _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)
    //或者寫(xiě)       LPM3_EXIT;
}

步驟:  第一步:先寫(xiě)看門(mén)狗延時(shí)函數(shù)  ,開(kāi)看門(mén)狗中斷
        第二步:寫(xiě)進(jìn)入低功耗模式 開(kāi)總中斷  _EINT();  LPM3;
        第三步: 寫(xiě)應(yīng)用程序
        第四步:  寫(xiě)中斷函數(shù)  退出低功耗  LPM3_EXIT;


3  看門(mén)狗定時(shí)器與低功耗模式應(yīng)用


#include<msp430x14x.h>
int flag;

void main()
{
    WDTCTL=WDT_MDLY_32;
    IE1|=WDTIE;
    P2DIR|=BIT7;
    _EINT();//開(kāi)全局中斷
    LPM0;
}
#pragma vector=WDT_VECTOR
__interrupt void WDTDOG_time()
{
   flag++;
   if(flag==10)
   {
   P2OUT^=BIT7;
   flag=0;
   }
}

步驟:  第一步: 設(shè)置看門(mén)狗為定時(shí)模式
        第二步:使能看門(mén)狗中斷
        第三步: 開(kāi)全局中斷 //用簡(jiǎn)寫(xiě)模式 LPMx  必須寫(xiě)   _EINT();
        第四步: 寫(xiě)應(yīng)用程序
        第五步: 進(jìn)入低功耗模式
        第六步: 寫(xiě)看門(mén)狗中斷服務(wù)函數(shù)

4  低功耗模式下的時(shí)鐘源工作狀態(tài)驗(yàn)證  (2013 09 18)
/********************************************
此程序用看門(mén)狗定時(shí)器讓LED間隔閃爍

也可用來(lái)檢測(cè)不同低功耗模式下SMCLK 與ACLK的工作狀態(tài)

通過(guò)此程序 表面 LPM0 1 2 3情況下ACLK工作
LPM4情況下 ACLK不工作
SMCLK 在LPM2 3 4情況下不工作
在LPM 0 1情況下工作
但這與書(shū)本上說(shuō)的有點(diǎn)不同  


*********************************************/


#include<msp430x14x.h>
int flag;

void main()
{
     WDTCTL=WDT_MDLY_32;
   //WDTCTL=WDT_ADLY_1000;
    IE1|=WDTIE;
    P2DIR|=BIT7;
    _EINT();//開(kāi)全局中斷
    LPM0;
}
#pragma vector=WDT_VECTOR
__interrupt void WDTDOG_time()
{
   flag++;
   if(flag==2)
   {
   P2OUT^=BIT7;
   flag=0;
   }
}

5  定時(shí)器A  之連續(xù)計(jì)數(shù)模式  2013 09 20
#include<msp430x14x.h>
void main()
{
    WDTCTL=WDTHOLD+WDTPW;    //關(guān)狗
    P2DIR|=BIT1;

    CCTL0=CCIE;    //使能CCR0中斷
    CCR0=50000;   //這個(gè)CCR0 與TACCR0一樣  但多寫(xiě)成CCRO
    TACTL=TASSEL_2+MC_2;  //smclk  continue mode

    _EINT();  //開(kāi)全局中斷
    LPM1; //進(jìn)入低功耗
}
#pragma vector=TIMERA0_VECTOR
__interrupt void timerA ()
{
    P2OUT^=BIT1;
    CCR0+=50000;//連續(xù)計(jì)數(shù)模式下 CCR0必須加偏置 才能保持方波周期恒定
}

注意:  定時(shí)器A操作步驟:  
               第一步:  打開(kāi)定時(shí)器A的中斷
               第二步:  選擇定時(shí)器A的時(shí)鐘源  分頻器  計(jì)數(shù)模式



6      定時(shí)器A 之增計(jì)數(shù)模式   2013 09 20
/********************************
定時(shí)器A的增計(jì)數(shù)模式

************************************/


#include<msp430x14x.h>
void main()
{
   WDTCTL=WDTPW+WDTHOLD;   //關(guān)小狗
   P2DIR|=BIT2;
   CCTL0=CCIE;   //使能CCR0
   CCR0=50000;
   TACTL=TASSEL_2+MC_1;  //SMCLK  UP MODE
   _EINT();  //開(kāi)全局中斷
   LPM1;
   //_BIS_SR(LPM0_bits + GIE);
}

#pragma vector=TIMERA0_VECTOR
__interrupt void timeA0()
{
    P2OUT^=BIT2;
}

特別注意: 這個(gè)程序在編譯過(guò)程中若選擇F1612就不能實(shí)現(xiàn)功能  但選擇
      F149  F169都可以  這是神馬歌原因呢




7  定時(shí)器A的雙中斷運(yùn)用    2013 09 20
/****************************************************
定時(shí)器A工作在連續(xù)計(jì)數(shù)模式下 用CCRO在P2.0出產(chǎn)生一方波
  用溢出中斷在P2.7產(chǎn)生一方波

****************************************************/

#include<msp430x14x.h>
void main()
{
    WDTCTL=WDTPW+WDTHOLD;  //關(guān)小狗
    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中斷服務(wù)函數(shù)
#pragma vector=TIMERA0_VECTOR
__interrupt void timerA0()
{
  P2OUT^=BIT0;
  CCR0+=20000;//連續(xù)計(jì)數(shù)模式下 CCR0必須加偏置 才能保持方波周期恒定
}
//TimerA1  溢出中斷服務(wù)函數(shù)
#pragma vector=TIMERA1_VECTOR
__interrupt void  timerA1()
{
   switch(TAIV)
   {
     case 2 :  break;//CCR1
     case 4:  break;//CCR2
     case 10: P2OUT^=BIT7; break;
   }
}

//特別注意: 定時(shí)器A有4個(gè)中斷  CCRO  單獨(dú)使用一個(gè)中斷向量TIMERA0_VECTOR
           而CCR1  CCR2 溢出中斷 共用一個(gè)中斷向量


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:77403 發(fā)表于 2015-4-19 00:42 | 只看該作者
謝謝謝!。。。。。。。。!
回復(fù)

使用道具 舉報(bào)

板凳
ID:92785 發(fā)表于 2015-10-18 00:52 | 只看該作者
謝謝樓主分享了
回復(fù)

使用道具 舉報(bào)

地板
ID:79034 發(fā)表于 2015-12-2 11:47 | 只看該作者
正在學(xué)MSP430,不知道該如何下手。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表