我正在设计一个由 CR2032锂电池供电的密钥卡、并使用 MSP430系列的 CC430F5133微控制器。 时钟源是 XT1上的一个外部32KHz 晶振。
在正常运行中、LPM4睡眠状态下的电流消耗为5.5uA。 每隔一段时间、睡眠电流为8.5uA。
我已将代码修整为以下内容:
#include #include #include "HAL_PMM.h" #define FOB_UBTN0BIT0 #define FOB_UBTN0_PORT_DIRP1DIR #define FOB_UBTN0_PORT_SELP1SEL #define FOB_UBTN1DIR 1DIR #define FOB_UBTN2_PORT_FOBTRF2_FOBTRF2_FOBTRF#define #define P2BTR_FOBTRF2_FOBTRF2_FOBTRY_FTRF2_FOBTRFIN_TRFIN_TRF#define #define #define P2BTRF2_FOBTRY_FIN_FOBTRFIN_TRF_FOBTRF_FOBTRF_TRF_TRF_TRF_TRF#define #define #define #FOBTRF2_FOBTRF_TRF_TRF_TRFIN_TRF_TRF_TRF_TRF_TRF_TRFIN_TRF_TRF_TRF_TRF_TRF_TRF_TR #define FOB_LED_PORT_OUTP3OUT #define FOB_LED_PORT_SELP3SEL 静态空初始化端口(void) { P1SEL = 0x00; P2SEL = 0x00; P3SEL = 0x00; P5SEL = 0x00; P1DIR = 0xFF; P2DIR = 0xFF; P3DIR = 0xFF; P5DIR = 0xFF; PJDIR = 0xFF; P1OUT = 0x00; P2DIR = 0x00; P3OUT = 0x00; P5OUT = 0x00; PJOUT = 0x00; //为 XOUT P5DS 的 XIN 设置端口5 |= BIT0+BIT1; P5OUT |= BIT0+BIT1; P5SEL |= BIT0+BIT1; P5DIR &=~ ~Ω(BTN0+BIT1);P5DIR B0_BIT0_BIT0_B0_BIT0_BIT0_BIT1;P0_BIT0_BIT0_BIT0_BIT0_BIT0_BIT0_B FOB_UBTN0_PORT_SEL 和=~FOB_UBTN0; FOB_UBTN1_PORT_DIR 和=~FOB_UBTN1; FOB_UBTN1_PORT_SEL 和=~FOB_UBTN1;FOB_UBTN2_PORT_DIR 和=~ ~FOB_UBTN2_FOBTN2;FOB_UBTN2_UBTN2_FOBTN2 FOCK_UBTN3_PORT_DIR 和=~FOB_UBTN1; FOB_UBTN3_PORT_SEL 和=~FOB_UBTN2; FOB_VREF_PORT_DIR 和=~FOB_VREF_PIN; FOB_LED_PORT_OUT 和=~FOB_LED1; FOB_DIR_FOB_D1;FOB_DIR | FOB_DIR FOK_LED_PORT_SEL &&~ ~ ~FOB_LED1;}void LFXT_Start (uint16_t xtdrive){UCSCTL6_L |= XT1DRIVE1_L + XT1DRIVE0_L;//针对 XT1启动的最高驱动设置,同时(SFRIFG1 & OFIFG){//检查 X1DRIFG + FAULTFFG + FFFF FAULT7 + XFFG FAULTFFG + FFFF FAULTFFG + FAULTFFG + FAULTFFT + FAULTFFG //清除 OFIFG 故障标志 } UCSCTL6 =(UCSCTL6 &~(XT1DRIVE_3))|(xdrive);//设置驱动模式 } int main (void) { //关闭 WDTCTL 的看门狗 = WDTPW + WDTHOLD; SFRIE1 &&=~WDTIE; SetVCore (0) ; XTIVSTART (0);TXDIV0) // RTCCTL01上的 RTC 计时器= RTCTEV0_H; __bis_SR_register (LPM4_BITS); }
SetVCode (0)函数来自 TI 示例项目的 HAL_PMM.c 模块。 我在上面显示的 LFXT_Start()也直接取自 TI 演示代码。
如您所见、这个修整后的代码中没有中断处理程序。 代码只会引导并直接进入睡眠状态并保持睡眠状态。
如果我切断电池电源、然后重新应用电池电源、通常在这段时间内等待500-1500ms、每10或20个电源周期中一次、睡眠电流为8.5uA。 在所有其他情况下、休眠电流为5.5uA。
在完整的产品源代码中(在我将其缩减至您在上面看到的内容之前)、我在密钥卡上有用于唤醒 CPU、执行一些处理、然后返回 LPM4睡眠状态的按钮。 当遥控器处于"坏"模式时、我可以反复重复此序列、并且它始终在8.5uA 的较高睡眠电流下返回睡眠状态。
但是,如果在 CPU 处于唤醒状态时,我只执行上面显示的 LFXT_Start()调用来重新定义时钟系统,问题就会消失,下一个睡眠周期会恢复到所需的5.5uA 睡眠电流,并在许多唤醒/睡眠周期后保持正确的睡眠电流。
作为另一个线索、如果我注释掉启动 RTC 计时器的代码、这也会导致问题消失(或使问题很难重现)。 在关闭 RTC 的情况下、我测试了超过150个功率周期、从未见过更高的睡眠电流。
是否有人可以提供一些有关如何调试的指导?
谢谢、
Bob