主题中讨论的其他器件: 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; }