使用的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。