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.
单片机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;
}
}
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的时候是正常的;