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

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

单片机MSP430F6436

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

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

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

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

jian yu7:

程序如下:

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

void RTC_Init(void);

int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = 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);}//初始化IORTC_Init();

while (1){

P8OUT ^= BIT3;

__bis_SR_register(LPM4_bits+GIE);

}}

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

RTCCTL01 |= RTCRDYIE + RTCBCD + RTCHOLD; // BCD mode, RTC hold, enable RTC // event interruptRTCYEAR = 0x2011; // Year = 0x2011RTCMON = 0x10; // Month = 0x10 = OctoberRTCDAY = 0x07; // Day = 0x07 = 7thRTCDOW = 0x05; // Day of week = 0x05 = FridayRTCHOUR = 0x11; // Hour = 0x11RTCMIN = 0x59; // Minute = 0x59RTCSEC = 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;

}}

jian yu7:

回复 jian yu7:

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

jian yu7:

回复 jian yu7:

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

灰小子:

回复 jian yu7:

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

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

jian yu7:

回复 灰小子:

SMCLK关没关

dirtwillfly

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

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

jian yu7:

回复 jian yu7:

而且我做过实验,用其他定时器中断或者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的时候是正常的;

赞(0)
未经允许不得转载:TI中文支持网 » MSP430 进入LPM(2,3,4)后RTC中断异常
分享到: 更多 (0)