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.

MSP430 进入LPM(2,3,4)后RTC中断异常

Other Parts Discussed in Thread: MSP430F6436

单片机MSP430F6436

程序初始化IO口,RTC后进入LPM(2,3,4)模式。RTC设置为秒中断。使用两个IO口指示进入中断情况。

使用IAR DEBUG的时候正常,不连接编程器时RTC秒中断异常;现象如下图:

黄线是电路板的功耗线,绿线是秒中断指示IO口。DEBUG模式时IO口每秒切换一次状态,符合程序逻辑。拔掉编程器时在秒中断到来之前也是正常的,但是秒中断一旦到来,IO口以跟MCLK相关的频率切换状态。感觉好像秒中断的中断标志位不能清除,一直快速进秒中断;

此问题在LPM2,LPM3,LPM4下出现,在AM,LPM0,LPM1下一切正常;

  • 程序如下:


    #include "io430.h"
    #include "in430.h"

    void RTC_Init(void);


    int main( void )
    {
    // Stop watchdog timer to prevent time out reset
    WDTCTL = WDTPW + WDTHOLD;

    {P6DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;

    P9DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
    P8DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
    P8OUT |=(BIT2+BIT3);

    P4DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;


    P3DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;

    P1REN |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
    P1OUT &=~(BIT0 + BIT1 + BIT4 + BIT5 + BIT6 + BIT7);
    P1OUT |= BIT2 + BIT3;

    P2REN |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
    P2OUT &=~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);

    P5REN |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
    P5OUT &=~( BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);
    P5OUT |= BIT0; 

    PJDIR |= BIT0 + BIT1 + BIT2 + BIT3 ;


    P7REN |= BIT4 + BIT5 + BIT7;
    P7OUT &=~( BIT5 + BIT7);
    P7OUT |= BIT4;
    __delay_cycles(100000);
    }

    //初始化IO

    RTC_Init();

    while (1)
    {



    P8OUT ^= BIT3;

    __bis_SR_register(LPM4_bits+GIE);

    }

    }


    void RTC_Init(void)
    {
    // Setup Clock
    UCSCTL6 &= ~(XT1OFF); // XT1 On
    UCSCTL6 |= XCAP_3; // Internal load cap
    while(BAKCTL & LOCKBAK) // Unlock XT1 pins for operation
    BAKCTL &= ~(LOCKBAK); 
    do
    {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
    // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG; // Clear fault flags
    }while (SFRIFG1&OFIFG); // Test oscillator fault flag

    RTCCTL01 |= RTCRDYIE + RTCBCD + RTCHOLD; // BCD mode, RTC hold, enable RTC 
    // event interrupt
    RTCYEAR = 0x2011; // Year = 0x2011
    RTCMON = 0x10; // Month = 0x10 = October
    RTCDAY = 0x07; // Day = 0x07 = 7th
    RTCDOW = 0x05; // Day of week = 0x05 = Friday
    RTCHOUR = 0x11; // Hour = 0x11
    RTCMIN = 0x59; // Minute = 0x59
    RTCSEC = 0x45; // Seconds = 0x45

    RTCCTL01 &= ~(RTCHOLD); // Start RTC calendar mode

    }

    #pragma vector=RTC_VECTOR
    __interrupt void RTC_B_ISR()
    {
    switch (RTCIV)
    {

    case 2:

    P8OUT ^= BIT2;


    __bic_SR_register_on_exit(LPM4_bits+GIE);


    break;

    }
    }

  • 令人疑惑的是。debug时一切正常。不DEBUG时就不正常。尝试过各个地方清除RTC的中断标志位。

  • 哪位大神能给个解释啊。。。。。

  • 把系统时钟输出,测量一下看是不是有变化

    还有lpm1和lpm2的主要区别是smclk在后者被关闭了,你注意有没有用到

  • SMCLK关没关

    dirtwillfly 说:

    把系统时钟输出,测量一下看是不是有变化

    还有lpm1和lpm2的主要区别是smclk在后者被关闭了,你注意有没有用到

    smclk关没关跟RTC中断没什么关系啊。这个单片机是RTC_B模块。RTC只能使用32.768kHz外部晶振时钟。

    现在的问题是在AM,LPM0,LPM1模式下,RTC是秒中断。在LPM2,LPM3,LPM4下RTC的秒中断变成几十k赫兹的中断。

    而且在LPM2,LPM3,LPM4下DEBUG的时候却没这个问题???不连编程器重新上电在LPM2,LPM3,LPM4下RTC的秒中断变成几十k赫兹的中断????

  • 而且我做过实验,用其他定时器中断或者IO口中断,都没有问题。只有RTC中断有问题。

    只要在LPM(2,3,4)下进入RTC中断。就会产生类似中断嵌套一样一直进入RTC中断。

    如果在RTC的中断中执行一下__bic_SR_register_on_exit(LPM4_bits+GIE);外面的程序还能跑一下。但是外面一开__bis_SR_register(LPM4_bits+GIE);就立即又进入RTC中断里了。好像RTC中断标志位一直清除不了一样;

    如果不在RTC中断里面关GIE,外面程序都不跑的,一直嵌套在RTC中断里了;



    最令人奇怪的DEBUG的时候是正常的;