This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F149低功耗2/3模式无法进入计时中断

Other Parts Discussed in Thread: MSP430F149

//-------------TIMERA0 初始化---------------------
void TIMERA0_Inint(void)
{
CCTL0=CCIE; //CCR0中断允许
CCR0=10000-1;
//TACTL=TASSEL_2+MC_1; //选SMCLK,连续计数模式 1M
TACTL = TASSEL_1 + TAIE + MC_1; //选ACLK,增计数模式 无法进入??
_BIS_SR(GIE); //定时器TIMERA0_interrupt

}

int main(void)
{
uchar key1;
Clock_Init();
UART_Init();
P6_Init();
P2_Init();
Key_Scan();
TIMERA0_Inint();
//WDTCTL = WDT_MDLY_32; //1MHz, WDT 32mS interval timer
WDTCTL =WDT_ADLY_250; //32768, delay250mS
IE1 |= WDTIE; // Enable WDT interrupt
// WDTCTL = WDTPW + WDTHOLD; // Stop WDT
_EINT(); //开中断

while(1)
{

key1 = Key_Scan();
if(key1 != 0xff)
{

SendData(0xff);
SendData(key1/10%10 + '0');
SendData(key1%10 + '0');
SendData('\r');
key1 = 0xff;
}
else
_BIS_SR(LPM3_bits + GIE); //进入IPM低功耗

}
}

  • xianglie song,

    我看你的TImer时钟源选择是SMCLK, 在LPM2 or 3低功耗mode下,SMCLK是不可用的。故LPM2, LPM3下Timer没法工作起来,肯定进不去中断,唤醒CPU的。你一定要进LPM2, 3,把时钟源换成ACLK。

    一定要用SMCLK,只能设置为LPM0.

  • // TACTL=TASSEL_2+MC_1; //选SMCLK,连续计数模式 计数到CCR0值中断。 1M
    TACTL = TASSEL_1+ MC_1; //选ACLK,增计数模式 无法进入??

    程序已经屏蔽了SMCLK,选择的是ACLK,现在整个程序都是由ACLK做为时钟,XT2是关闭的。串口使用ACLK收发都正常。

    //**************MSP430串口初始化***************************
    void UART_Init()
    {
    U0CTL|=SWRST; //复位SWRST
    U0CTL|=CHAR; //8位数据模式
    //U0TCTL|=SSEL1; //SMCLK为串口时钟,最大115200
    U0TCTL|=SSEL0; //ACLK为串口时钟,最大9600
    U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
    U0BR0=baud_l; //N=UBR+(UxMCTL)/8
    U0MCTL=0x4a; //微调寄存器为,波特率bps
    ME1|=UTXE0; //UART0发送使能,允许发送
    ME1|=URXE0; //UART0接收使能,允许接收
    U0CTL&=~SWRST;
    IE1|=URXIE0; //接收中断使能位

    P3SEL|= BIT4; //设置IO口为普通I/O模式
    P3DIR|= BIT4; //设置IO口方向为输出
    P3SEL|= BIT5;
    //P3SEL=0x30;
    }

    就是计数中断在LPM2/3无法工作。

  •  

    如果Timer 选用ACLK,应该是可以进入LPM2/3的, 你先试试下面这段程序。是TI的例程,就是timer 从LPM3进行唤醒并闪灯的。


    你的程序里,你先把看门狗关了试试看,防止WDT 不喂狗,引起复位;

    其次,你的LPM3进入是在else 里,你检查下你的逻辑吧,看起来只有 if(key1 != 0xff) 大部分情况。

    总之,Timer 用时钟源 ACLK = 32768Hz LFXT1, 是可以从LPM3唤醒CPU的。




    //******************************************************************************
    // MSP-FET430P140 Demo - Timer_A, Toggle P1.0, CCR0 Up Mode ISR, 32kHz ACLK
    //
    // Description: Toggle P1.0 using software and the TA_0 ISR. Timer_A is
    // configured for up mode, thus the timer overflows when TAR counts
    // to CCR0. In this example, CCR0 is loaded with 1000-1.
    // Toggle rate = 32768/(2*1000) = 16.384
    // ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO ~800kHz
    // //* An external watch crystal on XIN XOUT is required for ACLK *//
    //
    // MSP430F149
    // ---------------
    // /|\| XIN|-
    // | | | 32kHz
    // --|RST XOUT|-
    // | |
    // | P1.0|-->LED
    //
    // M. Buccini
    // Texas Instruments Inc.
    // Feb 2005
    // Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
    //******************************************************************************

    #include <msp430.h>

    int main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    P1DIR |= 0x01; // P1.0 output
    CCTL0 = CCIE; // CCR0 interrupt enabled
    CCR0 = 1000-1;
    TACTL = TASSEL_1 + MC_1; // ACLK, upmode

    __bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
    }

    // Timer A0 interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=TIMERA0_VECTOR
    __interrupt void Timer_A (void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(TIMERA0_VECTOR))) Timer_A (void)
    #else
    #error Compiler not supported!
    #endif
    {
    P1OUT ^= 0x01; // Toggle P1.0
    }