打印

关于msp430低功耗编程的例子请教一下

[复制链接]
4188|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heibaiyinjiag|  楼主 | 2013-4-10 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
复制内容到剪贴板
  • {初始化设置;
  • while(1)
  • {
  • if(Power)
  • {
  • GetData();//采集数据
  • if(ucIfbrk==0) //采集无错数据转换
  • {
  • DataChg();
  • DataSend();            //串口发送数据
  • UART0_Send_Byte('#');
  • delay_ms(1000);
  • }
  • else
  • {
  • UART0_Send_Byte('E');
  • ucIfbrk = 0;
  • }}}}
  • //开关P2.0中断
  • #pragma vector= PORT2_VECTOR
  • __interrupt void P2ISR(void)
  • {
  • if(P2IFG&BIT0)
  • {
  • delay_ms(8);//延时消抖
  • if(!(P2IN&BIT0))
  • {
  • if(Power)//若原来是开机状态,现在改为关机,
  • {
  • Power=0;
  • P2OUT =Power;//led关P2.1=0
  • P2IFG &=~BIT0;
  • _BIS_SR(LPM2_bits+GIE); // Enter LPM3
  • }
  • else///若原来是guan机状态,现在改为开机
  • {Power=1;
  • P2OUT =(Power<<1);//LED开
  • P2IFG &=~BIT0;
  • LPM2_EXIT; // Exit LPM3 on return
  • }
  • }
  • P2IFG &=~BIT0;
  • }



本人想搞个开关,实现按一下关机,按一下在进入工作状态,Power=1作为工作,power=0为低功耗,请教一下进入什么低功耗模式合适?相当与关机。
以上为我写的简单程序,发现中断部分呢正常工作,但是当Power——》0——》1这时,无法进入到while的循环中,请教问题在哪里?能否提供一两个例子让我看看?

相关帖子

沙发
smilingangel| | 2013-4-10 17:41 | 只看该作者
这个是什么问题的,我看下的啊。。。

使用特权

评论回复
板凳
smilingangel| | 2013-4-10 17:42 | 只看该作者
楼主可参考下我这个例程的。。。。。。

//******************************************************************************
//   MSP430x530x Demo - Enters LPM3 with ACLK = LFXT1, REF0 disabled,
//                      VUSB LDO and SLDO disabled, SVS disabled
//
//   Description: Configure ACLK = LFXT1 and enters LPM3. Measure current.
//   ACLK = LFXT1 = 32kHz, MCLK = SMCLK = default DCO
//
//                MSP430F530x
//             -----------------
//        /|\ |              XIN|-
//         |  |                 | 32kHz
//         ---|RST          XOUT|-
//            |                 |
//
//   B. Nisarga
//   Texas Instruments Inc.
//   Dec 2010
//   Built with CCSv4.2 and IAR Embedded Workbench Version: 4.21
//******************************************************************************
#include <msp430f5310.h>

#define uchar  unsigned char
#define uint   unsigned int

#define SYS14_WORKAROUND                    // Comment this line if silicon revision has SYS14 bug fixed

#ifdef SYS14_WORKAROUND
    #define INIT_MEMORY_ADDR 0x0900
    unsigned int *Address = ((unsigned int*)INIT_MEMORY_ADDR);
#endif
#define GREEN_ON    P6OUT |=BIT2      //P6.2
#define GREEN_OFF   P6OUT &=~BIT2
#define GREEN_ON_OFF P6OUT ^=BIT2
#define RED_ON      P6OUT &=~BIT3     //P6.3
#define RED_OFF     P6OUT |=BIT3
#define RED_ON_OFF  P6OUT ^=BIT3
typedef struct  {
  uint year ;       //
  uchar month;        //
  uchar day;     //
  uchar week;
  uchar hour;  //
  uchar min;     //
  uchar second;
  uchar flag;
      } time;
time RTC;
uchar flag =0;
void Init_Rtc(void)
{                                             // BCD码日历格式输出   
    RTCCTL01 = RTCBCD +  RTCHOLD + RTCMODE + RTCTEV_0 ;
    RTCPS0CTL =   RT0PSHOLD ;                 //配置两个计数器分频                                 
    RTCPS1CTL  =  RT1PSHOLD ;
   
      RTCSEC =  0x54;                           //初始化秒         
      RTCMIN =  0x59 ;                          //初始化分钟
      RTCHOUR = 0x12;                            //初始化小时
      RTCDOW = 0x01;                     
      RTCDAY =  0x15;                       //日期初始化                  
      RTCMON =  0x02 ;                      //初始化月份
      RTCYEAR = 0x2013;                     //初始化年份                 
      RTCAMINHR = 0x2200 + BIT7;            //闹钟小时和分钟设置
      RTCADOWDAY = 0x2402;                  //闹钟星期和日期设置
      
    RTCCTL01 &= ~RTCHOLD;                 //打开RTC模块              
    RTCPS0CTL &= ~RT0PSHOLD;              //打开RTCPS0CTL
    RTCPS1CTL &= ~RT1PSHOLD;              //打开RTCPS1CTL
    RTCCTL0 |= RTCAIE + RTCRDYIE;         //打开安全访问使能 ,闹钟使能      
}
void TimerB_Init(void)                    //Timerb 定时中断初始化,主要用于系统任务定时分配*****************
{  
  TBCTL = TBSSEL_1 + MC_1 + ID_2;             // 时钟源为ACLK=32768Hz, 增计数模式,4分频--8192                                                  //使能定时器溢出中断
  TBCCR0 =41;                                  //0.005s
  //TBCCR0 =8;                                  //0.001s
  // TBCCR0 = 409-1;                             //0.05s
  // TBCCR0 = 819;                              //0.1s  
// TBCCR0 = 4096-1;                          //0.5s
  //TBCTL = TBSSEL_2 + MC_1 + ID_3;           // 时钟源为SMCLK=8MHz, 增计数模式,8分频                                                  //使能定时器溢出中断
  //TBCCR0 = 50000-1;                                    //定时0.05S     
}

使用特权

评论回复
地板
smilingangel| | 2013-4-10 17:42 | 只看该作者
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  
#ifdef SYS14_WORKAROUND  
  *Address = 0x9628;
  *(Address+4) = 0x0800;
  *Address = 0x9600;  
#endif  
  
  // Enable XT1
  P5SEL |= BIT4+BIT5;                       // Port select XT1
  UCSCTL6 &= ~(XT1OFF);                     // XT1 On
  UCSCTL6 |= XCAP_3;                        // Internal load cap

  // Loop until XT1 & DCO stabilizes
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

  UCSCTL6 &= ~(XT1DRIVE_3);                 // Xtal is now stable, reduce drive
                                            // strength
  // Port Configuration
  P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;P5OUT = 0x00;P6OUT = 0x00;
  PJOUT = 0x00;
  P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;P5DIR = 0xFF;P6DIR = 0xFF;
  PJDIR = 0xFF;
  TimerB_Init();
  Init_Rtc();
    P1DIR &=~BIT7;                          // p1.7作为中断使用 设置为输入  ---预留接外部中断信号
     P1REN |=BIT7;                          //使能上下拉电阻
     P1OUT |=BIT7;                          // 上拉电阻
     P1SEL &=~BIT7;                          //设置为普通I/O口功能
     P1IES |=BIT7;                           //1.7下降沿触发中断
     P1IE |=BIT7;     
     P1IFG  =0;   
     _EINT();   
     TBCCTL0 |= CCIE;
  // Disable SVS
  PMMCTL0_H = PMMPW_H;                // PMM Password
  SVSMHCTL &= ~(SVMHE+SVSHE);         // Disable High side SVS
  SVSMLCTL &= ~(SVMLE+SVSLE);         // Disable Low side SVS
  GREEN_ON;
  RED_ON;
  for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
  
  while(1)
  {
    if(flag ==0x01)
    {
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      GREEN_ON_OFF;
      RED_OFF;
    }      
    else if(flag ==0x02)
    {
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
      for(uchar i=0;i<255;i++);
       RED_ON_OFF;
       GREEN_OFF;
    }
    else
    {
      __bis_SR_register(LPM3_bits);       // Enter LPM3
      __no_operation();                   // For debugger
      _NOP();
      _NOP();
      _NOP();
    }
   
  }
}

使用特权

评论回复
5
smilingangel| | 2013-4-10 17:43 | 只看该作者
是由P1.7口的按键的来实现切换的

#pragma  vector=PORT1_VECTOR
__interrupt  void P1_ISR(void)
{
  if((P1IFG &0x80)==0x80)    //p1.7
  {
    if(flag ==0)
    flag =0x01;
    else if(flag ==0x01)
      flag =0x02;
    else
      flag =0;
     LPM3_EXIT;
    _NOP();
  }
   P1IFG=0;                              
}

使用特权

评论回复
6
superman2012| | 2013-4-10 23:46 | 只看该作者
楼上的430单片机编写的历程挺不错,谢谢分享

使用特权

评论回复
7
vivilzb1985| | 2013-4-11 09:40 | 只看该作者
_BIS_SR(LPM2_bits+GIE); // Enter LPM3
??楼主是标识错误??

使用特权

评论回复
8
vivilzb1985| | 2013-4-11 09:41 | 只看该作者
上边的当然是只可放主函数的程序中的啦,,,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

1008

帖子

2

粉丝