找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5591|回复: 3
收起左侧

MSP430单片机内部资源总结(含程序)

[复制链接]
ID:71834 发表于 2015-1-8 09:29 | 显示全部楼层 |阅读模式
                                     第一章   内部资源篇

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 溢出中断 共用一个中断向量


回复

使用道具 举报

ID:77403 发表于 2015-4-19 00:42 | 显示全部楼层
谢谢谢!!!!!!!!!!!
回复

使用道具 举报

ID:92785 发表于 2015-10-18 00:52 | 显示全部楼层
谢谢楼主分享了
回复

使用道具 举报

ID:79034 发表于 2015-12-2 11:47 | 显示全部楼层
正在学MSP430,不知道该如何下手。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表