MSP430单片机内部资源总结

2019-07-19 15:27发布


第一章   内部资源篇

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 溢出中断 共用一个中断向量
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
dirtwillfly
1楼-- · 2019-07-19 17:01
感谢分享
usysm
2楼-- · 2019-07-19 19:53
这个不是msp430的定时器吗?
usysm
3楼-- · 2019-07-19 21:09
内部资源不光这么多吧!
Stannis
4楼-- · 2019-07-20 00:18
定时器A的双中断,要学习一下
geemi
5楼-- · 2019-07-20 03:46
 精彩回答 2  元偷偷看……

一周热门 更多>