TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430 低功耗 LPM0 疑问

有以下问题:

1、__bis_SR_register(CPUOFF + GIE);
     LPM0;

这个两个语句是否等效?

LPM0 是仅仅进入低功耗模式,但是没有开全局中断吗?

能否提供跟低功耗模式相关的所有宏定义?

2、我使用了两个模块 TimerA0 和 USCI,每隔1s USCI(配置成IIC,中断发送数据)发送一次数据,如何在两个中断期间转换低功耗模式?两个模块的中断能否同时开启?

进入timer低功耗时,需要关闭USCI中断吗?同理,进入USCI中断时,关闭Timer中断?

   发送完数据  进入timer中断

    CCTL0 |= CCIE; 先开启定时中断
    __bis_SR_register(CPUOFF + GIE);  进入定时模式
    CCTL0 &= ~CCIE;  关闭定时器中断

3、USCI 如何通过中断发送数据?我的有点问题

//硬件IIC 中断方式
  USCI_I2C_Init();
  IE2 |= UCB0TXIE; // Enable TX interrupt
   PTxData = u8MCP_Con;
  TXByteCtr = 6;
  while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
  UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
  __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts

  while(1)
 {
    
    PTxData = UCB0_TX;
    TXByteCtr = 2;
    
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition

    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
    delay_ms(1000);
    /*time_cnt = 0;
    IE2 &= ~UCB0TXIE;
    CCTL0 |= CCIE;
    __bis_SR_register(CPUOFF + GIE);
    CCTL0 &= ~CCIE;
    IE2 |= UCB0TXIE;*/

    
    TXByteCtr = 2;
    PTxData = &UCB0_TX[2];
    
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
    
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
    delay_ms(1000);
    /*time_cnt = 0;
    IE2 &= ~UCB0TXIE;
    CCTL0 |= CCIE;
    __bis_SR_register(CPUOFF + GIE);
    CCTL0 &= ~CCIE;
    IE2 |= UCB0TXIE;*/
 }

  return 0;
}

// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{  
  if (TXByteCtr)                            // Check TX byte counter
  {
    UCB0TXBUF = *PTxData++;                     // Load TX buffer
    TXByteCtr–;                            // Decrement TX byte counter
  }
  if (TXByteCtr)
  {
    UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
    IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
    __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
  }
}

// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
  CCR0 += 50000;                            // Add Offset to CCR0
  time_cnt++;
  if(time_cnt >= 20)
  {
    time_cnt = 0;
    __bic_SR_register_on_exit(CPUOFF);
  }
}

kqian0327:

你好,

你可以在G2xx.h头文件发现如下定义:

#define LPM0         _bis_SR_register(LPM0_bits)         /* Enter Low Power Mode 0 */

#define LPM0_bits              (CPUOFF)

….

#define __bis_SR_register(x)            _bis_SR_register(x)

所以回答你第一个问题,这两个语句不等效,一个多开了GIE全局中断,一个没有开。

相关定义在你main.c函数一看加的头文件#include "msp430g2302.h"里面。

使用在Main.c文件使用__bis_SR_register(CPUOFF + GIE)进入低功耗,在中断处理函数的第一句唤醒中断

:#define LPM0_EXIT    _bic_SR_register_on_exit(LPM0_bits) /* Exit Low Power Mode 0 */

3.发送中断的含义是当模块发送完数据之后产生中断,发送数据是在main函数里面发,一旦发送就自动产生中断。如果你在发送中断里面发送数据,那么程序退出中断之后会进入下一个发送中断,程序一直在发送中断子函数内运行。

你可以尝试让程序跑起来,跑一段时间后在发送中断自函数内设断点,你会发现程序会停在你设置的断点位置。

赞(0)
未经允许不得转载:TI中文支持网 » MSP430 低功耗 LPM0 疑问
分享到: 更多 (0)