主题中讨论的其他器件: ENERGYTRACE
我目前正在 LaunchPad 开发板上与 MSP430fr4133 (首次使用 MSP430用户)合作、并尝试通过 LCD、电荷泵和 RTC 实现 LPM3.5数据表中公布的电流消耗。
ILPM3.5、LCD、CP 低功耗 μA 3.5、不包括 SVS (4) 3V 0.90 0.94 1.27 μ A
上面没有明确提到 RTC、但由于它是 LMP3.5、这是否意味着 RTC 正在运行? 我使用示例代码测量的电流约为3uA。 我基本上希望获得待机状态下的电流消耗、因此我每10秒左右对 RTC 进行一次计数、并查看这10秒间隔内的电流。 示例也使用了
#define LPM3_BITS (SCG1+SCG0+CPUOFF)
将器件置于 LPM3.5模式时。 但是、用户指南说也要设置 OSCOFF 位。 如果您不使用 XT1晶振、您是否只想设置 OSCOFF 位?
我还尝试将 RTC 和 LCD 参考时钟从 XT1切换为 VLO、但这没什么区别。 我已断开开发套件板上的所有连接、因此我连接的唯一跳线是 GND、因此无法与仿真器芯片通信。 作为测试、我创建了代码、仅将 GPIO 设置为输出/低电平、然后放入 LPM4.5、仅消耗0.03uA (不包括 SVS)、这符合数据表。 我试图查看开发板上的某个器件是否已连接并消耗了过多电流、但该测试似乎证明了这一理论。
我使用的代码在很大程度上是一个经过一些细微修改的示例。 我在这里有什么问题吗? 此代码仅在液晶屏上显示1234。
#define pos1 4 // Digit A1 - L4
#define pos2 6 // Digit A2 - L6
#define pos3 8 // Digit A3 - L8
#define pos4 10 // Digit A4 - L10
#define pos5 2 // Digit A5 - L2
#define pos6 18 // Digit A6 - L18
const char digit[10] =
{
0xFC, // "0"
0x60, // "1"
0xDB, // "2"
0xF3, // "3"
0x67, // "4"
0xB7, // "5"
0xBF, // "6"
0xE4, // "7"
0xFF, // "8"
0xF7 // "9"
};
void Init_GPIO(void);
void main (void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
if (SYSRSTIV == SYSRSTIV_LPM5WU) // If LPM3.5 wakeup
{
PMMCTL0_H = PMMPW_H; // Open PMM Registers for write
PMMCTL0_L |= PMMREGOFF_L; // and set PMMREGOFF
//PMMCTL0_L &= ~SVSHE_L;
__bis_SR_register(LPM3_bits | GIE); // Re-enter LPM3.5
}
else
{
// Initialize GPIO pins for low power
Init_GPIO();
// Configure XT1 oscillator
P4SEL0 |= BIT1 | BIT2; // P4.2~P4.1: crystal pins
do
{
CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1 & OFIFG); // Test oscillator fault flag
CSCTL6 = (CSCTL6 & ~(XT1DRIVE_3)) | XT1DRIVE_2; // Higher drive strength and current consumption for XT1 oscillator
// Disable the GPIO power-on default high-impedance mode
// to activate previously configured port settings
PM5CTL0 &= ~LOCKLPM5;
// Configure RTC
RTCCTL |= RTCSS__XT1CLK | RTCIE |RTCPS__10 ; // Initialize RTC to use XT1 and enable RTC interrupt
RTCMOD = 32768; // Set RTC modulo to 32768 to trigger interrupt each second
// Configure LCD pins
SYSCFG2 |= LCDPCTL; // R13/R23/R33/LCDCAP0/LCDCAP1 pins selected
// Just enabled A1-A4 for 4 digits
LCDPCTL0 = 0x330F;
LCDPCTL1 = 0x0033;
LCDPCTL2 = 0x0000;
LCDCTL0 = LCDSSEL_0 | LCDDIV_7; // flcd ref freq is xtclk
// LCD Operation - Mode 3, internal 3.08v, charge pump 256Hz
LCDVCTL = LCDCPEN | LCDREFEN | VLCD_6 | (LCDCPFSEL0 | LCDCPFSEL1 | LCDCPFSEL2 | LCDCPFSEL3);
LCDMEMCTL |= LCDCLRM; // Clear LCD memory
LCDCSSEL0 = 0x000F; // Configure COMs and SEGs
LCDCSSEL1 = 0x0000; // L0, L1, L2, L3: COM pins
LCDCSSEL2 = 0x0000;
LCDM0 = 0x21; // L0 = COM0, L1 = COM1
LCDM1 = 0x84; // L2 = COM2, L3 = COM3
LCDCTL0 |= LCD4MUX | LCDON; // Turn on LCD, 4-mux selected (LCD4MUX also includes LCDSON)
// Display 1 2 3 4
LCDMEM[pos1] = digit[1];
LCDMEM[pos2] = digit[2];
LCDMEM[pos3] = digit[3];
LCDMEM[pos4] = digit[4];
PMMCTL0_H = PMMPW_H; // Open PMM Registers for write
PMMCTL0_L |= PMMREGOFF_L; // and set PMMREGOFF
//PMMCTL0_L &= ~SVSHE_L;
__bis_SR_register(LPM3_bits | GIE); // Enter LPM3.5
__no_operation(); // For debugger
}
}
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = RTC_VECTOR
__interrupt void RTC_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(RTC_VECTOR))) RTC_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(RTCIV, RTCIV_RTCIF))
{
case RTCIV_NONE :
break;
case RTCIV_RTCIF:
break;
default:
break;
}
}
void Init_GPIO()
{
// Configure all GPIO to Output Low
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;
P5OUT = 0x00;P6OUT = 0x00;P7OUT = 0x00;P8OUT = 0x00;
P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;
P5DIR = 0xFF;P6DIR = 0xFF;P7DIR = 0xFF;P8DIR = 0xFF;
}