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

msp430F672xRTC 该怎么使用,才能保证掉电时钟不丢失

使用的MCU型号是MSP430F6721,电路板上面AUXVCC1和AUXVCC2引脚连接的是VCC,AUXVCC3引脚连接的是纽扣电池,这么连接对吗?

参考的例程如下:

#include <msp430.h>

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop WDT

if (SYSRSTIV == SYSRSTIV_LPM5WU)
{
// When woken up from LPM3.5, reinit since LPMx.5 will cause a BOR.
PMMCTL0_H = PMMPW_H; // open PMM
PM5CTL0 &= ~LOCKIO; // Clear LOCKBAK and enable ports
PMMCTL0_H = 0x00; // close PMM

P1DIR |= BIT0; // Configure P1.0 as GPIO output

// Reconfigure RTC to read RTC registers
RTCCTL0_H = RTCKEY_H; // Unlock RTC_C module
RTCCTL1 |= RTCBCD | RTCHOLD; // BCD mode, RTC hold
RTCCTL1 &= ~(RTCHOLD); // Start RTC calendar mode
RTCCTL0_H = 0; // Lock RTC_C module

// If woken up at noon, set LED and stay loop there
if((RTCHOUR == 0x12)&&(RTCMIN == 0x00)&&(RTCSEC == 0x00))
{
P1OUT |= BIT0; // Set P1.0 on
while(1);
}
// If values do not match, blink LED fast
else
{
while(1) // continuous loop
{
P1OUT ^= BIT0; // XOR P1.0
__delay_cycles(20000); // Delay
}
}
}

// GPIO Port Configuration for lowest power configuration
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;P5OUT = 0x00;P6OUT = 0x00;
P7OUT = 0x00;P8OUT = 0x00;P9OUT = 0x00;PJOUT = 0x00;
P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;P5DIR = 0xFF;P6DIR = 0xFF;
P7DIR = 0xFF;P8DIR = 0xFF;P9DIR = 0xFF;PJDIR = 0xFF;

// Initialize LFXT1
UCSCTL6 &= ~(XT1OFF); // Enable XT1
UCSCTL6 |= XCAP_3; // Internal load cap

// Loop until XT1, XT2 & DCO fault flag is cleared
do
{
UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag

// Configure RTC_C
RTCCTL0_H = RTCKEY_H; // Unlock RTC_C module
RTCCTL0_L |= RTCTEVIE; // Enable RTC time event interrupt
RTCCTL1 |= RTCBCD | RTCTEV_0 | RTCHOLD; // BCD mode, RTC hold, Set RTCTEV for 1 minute alarm
// 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

RTCCTL1 &= ~(RTCHOLD); // Start RTC calendar mode
RTCCTL0_H = 0; // Lock RTC_C module

// Enter LPM3.5
UCSCTL6 |= XT1OFF; // Turn off clock for LPMx.5 operation. ACLK will still
// remain active
PMMCTL0_H = PMMPW_H; // Open PMM Registers for write
PMMCTL0_L |= PMMREGOFF; // and set PMMREGOFF
__bis_SR_register(LPM4_bits | GIE); // Enter LPM3.5 mode with interrupts enabled
__no_operation();

// Code should NOT get here. This means that LPM3.5 was not properly entered.
// Ensure that an external power supply was ued. Or else JTAG will put the CPU
// in LPM0 mode.

// Stop the RTC
RTCCTL0_H = RTCKEY_H; // Unlock RTC_C module
RTCCTL1 |= RTCHOLD; // RTC hold
RTCCTL0_H = 0; // Lock RTC_C module

// Blink LED slowly if LPM3.5 not entered properly
while(1)
{
P1OUT ^= BIT0; // XOR P1.0
__delay_cycles(500000); // Delay
}
}

#pragma vector=RTC_VECTOR
__interrupt void rtc_isr(void)
{
switch (__even_in_range(RTCIV, 16))
{
case RTCIV_NONE: // No interrupts
break;
case RTCIV_RTCOFIFG: // RTCOFIFG
break;
case RTCIV_RTCRDYIFG: // RTCRDYIFG
break;
case RTCIV_RTCTEVIFG: // RTCEVIFG
PMMCTL0_H = PMMPW_H; // open PMM
PM5CTL0 &= ~LOCKIO; // Clear LOCKBAK and enable ports
PMMCTL0_H = 0x00; // close PMM
__bic_SR_register_on_exit(LPM4_bits); // Exit LPM4.5
__no_operation();
break;
case RTCIV_RTCAIFG: // RTCAIFG
break;
case RTCIV_RT0PSIFG: // RT0PSIFG
break;
case RTCIV_RT1PSIFG: // RT1PSIFG
break;
case 14: break; // Reserved
case 16: break; // Reserved
default: break;
}
}

关于这个例程有一些疑问
1,进入的是LPM3.5模式,RTC中断中为什么退出LPM4.5模式
2,什么情况下进入 if (SYSRSTIV == SYSRSTIV_LPM5WU) 语句,是断电吗
3,在 if (SYSRSTIV == SYSRSTIV_LPM5WU)语句中,并没有对RTC做中断设置,以前的RTC设置的
  应该已经改变了吧,这样RTC还能进中断吗
4,此程序掉电后,再重新上电,RTC时钟是否丢失

以前的贴子中有提到一下内容

当VCC掉电的时候,为了保证RTC继续工作,可以按照如下设置来实现:

连接电源到主电源DVcc,Avcc,这里为3.3v,连接备用电池到Auxvcc1,Auxvcc3,
这里为3.0v锂电池,将不用的备用电源引脚Auxvcc2接地,并在固件代码中关闭它。
如下是供电电源切换并关闭Auxvcc2:

AUX0MD=0;
AUX1MD=0;
AUX2MD=1;

设置下一次选择的供电电源:

AUX0OK=1;AUX1OK=1;AUX2OK=0;AUX2PRIO=0;

在程序中当检测到切换到AUXVCC1时,保存当前工作进入LPM3.5模式,直到VCC电源恢复。
检测VCC是否恢复使用端口1或者2的中断功能检测。

能否详细讲解一下

Lina Lian:

david wang4,

1. 关于硬件设计:

建议电路连接:

主电源连接至DVcc, AVcc;
连接备用电池到Auxvcc1,Auxvcc3
AUXVCC2连接至地Dvss, 并在程序中设置 AUX2MD=1;AUX2OK=0; (在AUXCTL1 Register中设置即可)

建议原因为:

MSP430F672x/3x 设计可有2个 Auxiliary supplies, AUXVCC1 and AUXVCC2,二者默认优先级2比1高,但由于客户系统只只有一个备用电池,故接1个就够了,不需要两个都接。

AUXVCC3是专门用于给Backup Subsystem供电的,故它必须接,因为想要实现掉电RTC仍然运行。

david wang41,进入的是LPM3.5模式,RTC中断中为什么退出LPM4.5模式

Q1 答: 其实此程序中一直进的都是LPM3.5,退出的也是LPM3.5, 原因是:请查看参考手册“Table 1-2. Operation Modes”,如下图 ,发现其实对于LPM4, LPM3.5, LPM4.5而言,SCG1,SCG0,OSCOFF和CPUOFFF设置均相同,LPM4和LPMx.5的不同是 PMMREGOFF 是否为1,而LPM3.5, LPM4.5的区别在于RTC是否运行。

这样,估计你应该明白了。

BR,

Lina

Lina Lian:

david wang4,

david wang42,什么情况下进入 if (SYSRSTIV == SYSRSTIV_LPM5WU) 语句,是断电吗

Q2答: 此程序是在检测SYSRSTIV register, 为了确定是由某种事件导致的系统复位。你放在CCS,或者IAR中看看SYSRSTIV_LPM5WU的含义,我觉得是为了检测确定此次BOR是否是由woken up from LPM3.5引起的。

因为在进入LPM3.5,自动切换到Backup Subsystem时, LOCKIO会被硬件自动至1,且Port口状态也会被锁定。你需要进行特殊处理,才能够保证RTC的保留,且将backup subsystem从locked状态释放。

详见User gudie Chapter 4:auxiliary supply system (AUX)以及Power Management Module and Supply Voltage Supervisor

david wang43,在 if (SYSRSTIV == SYSRSTIV_LPM5WU)语句中,并没有对RTC做中断设置,以前的RTC设置的  应该已经改变了吧,这样RTC还能进中断吗

Q3 答:同样参见User gudie Chapter 4:auxiliary supply system (AUX)以及Power Management Module and Supply Voltage Supervisor,需要 Reconfigure RTC,故其实在切换过程中,会导致RTC慢一点点的。

david wang44,此程序掉电后,再重新上电,RTC时钟是否丢失

Q4答:不会。但要注意相关电路设计和连接。

希望对你有帮助!O(∩_∩)O~

BR,

Lina

anson Wu:

回复 Lina Lian:

請問,使用AUXCTL1  Battery Backup System不是要在RTC_B mode下使用嗎

RTC_C mode也可使用Battery Backup System嗎

Lina Lian:

回复 anson Wu:

anson Wu,

你的理解是正确的,对于RTC_C应该称为:auxiliary supply system和Backup Subsystem。 

RTC_B对应为battery backup system。

朱岚斐:

回复 Lina Lian:

我想问一下msp430f5529开发板上又该怎么样接备用电池让他保持掉电也可以让rtc工作,我在f5529原理图中中没有看见有辅助电源接口。

灰小子:

回复 朱岚斐:

f5529没有提供专门的rtc备用电池的引脚。你可以把电池接到vcc,只要能保证vcc始终有连续的工作电压就可以了。

zheng xu:

回复 灰小子:

您好,我用的是F5659能使用掉电保持RTC功能么,如果能怎么接呢,F5659没有AUXVCC3,只有DVCC3和VBAT。

赞(0)
未经允许不得转载:TI中文支持网 » msp430F672xRTC 该怎么使用,才能保证掉电时钟不丢失
分享到: 更多 (0)