尊敬的先生:
我将此板连接到一个简单的键盘、尝试将其设置为进入 LPM4模式、禁用所有 I/O 并禁用所有 SPI 和 I2C、确认 I/O 没有进行电流确认、已启用按键唤醒并可以唤醒。
在电流测试期间、移除了从 SBW_TST 到 GND 的所有9个跳线、移除了 JP8、电路板仍然接收到500uA 以上的电流。
请告知我错过了哪些程序。
非常感谢。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的先生:
我将此板连接到一个简单的键盘、尝试将其设置为进入 LPM4模式、禁用所有 I/O 并禁用所有 SPI 和 I2C、确认 I/O 没有进行电流确认、已启用按键唤醒并可以唤醒。
在电流测试期间、移除了从 SBW_TST 到 GND 的所有9个跳线、移除了 JP8、电路板仍然接收到500uA 以上的电流。
请告知我错过了哪些程序。
非常感谢。
尊敬的 Sean:
感谢您的答复。
我将这部分代码放到了睡眠例程中、 在睡眠模式下仍然需要大约50uA 的时间、并且无法再唤醒。
如果取出这行代码" UCSCTL4 = SELA_1;",则可以按键唤醒。
谢谢!
WDTCTL = WDTPW | WDTHOLD;//停止 WDT
//设置 UCS
UCSCTL4 = SELEA_1;//确保 VLO 为 ACLK 源
//端口配置
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;P5OUT = 0x00;P6OUT = 0x00;
P7OUT = 0x00;P8OUT = 0x00;PJOUT = 0x00;
P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;P5DIR = 0xFF;P6DIR = 0xFF;
P7DIR = 0xFF;P8DIR = 0xFF;PJDIR = 0xFF;
//禁用 VUSB LDO 和 SLDO
USBKEYPID = 0x9628;//将 USB KEY和 PID 设置为0x9628
//启用对 USB 配置寄存器的访问
USBPWRCTL &&~(SLDOEN+VUSBEN);//禁用 VUSB LDO 和 SLDO
USBKEYPID = 0x9600;//禁用对 USB 配置寄存器的访问
//禁用 SVS
PMMCTL0_H = PMMPW_H;// PMM 密码
SVSMHCTL &&~Ω(SVMHE+SVSHE);//禁用高侧 SVS
SVSMLCTL &=~Ω(SVMLE+SVSLE);//禁用低侧 SVS
_ bis_SR_register (LPM4_bits);//输入 LPM4
Sean、您好!
如果我运行演示代码 MSP430F55xx_LPM4.C、 只需要2.5uA。 但我的程序有2个设置例程、
增加 VCoreToLevel2();
initClock45C(); 25MHz
否则、它运行得太慢。
因此、当它具有这2个例程时、它将在 LPM4睡眠模式期间消耗大约500uA 的电流。
有什么解决方法的想法吗?
谢谢!
void initClockTo25MHz()
{
UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation
UCSCTL2 = FLLD_0 + 749; // 487; // Set DCO Multiplier 487 for 16MHz,
// (N + 1) * FLLRef = Fdco
// (487 + 1) * 32768 = 16MHz
// Set FLL Div = fDCOCLK
__bic_SR_register(SCG0); // Enable the FLL control loop
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 16 MHz / 32,768 Hz = 500000 = MCLK cycles for DCO to settle
__delay_cycles(750000);//
// __delay_cycles(500000);//
// 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
}
uint16_t setVCoreUp(uint8_t level){
uint32_t PMMRIE_backup, SVSMHCTL_backup, SVSMLCTL_backup;
//The code flow for increasing the Vcore has been altered to work around
//the erratum FLASH37.
//Please refer to the Errata sheet to know if a specific device is affected
//DO NOT ALTER THIS FUNCTION
//Open PMM registers for write access
PMMCTL0_H = 0xA5;
//Disable dedicated Interrupts
//Backup all registers
PMMRIE_backup = PMMRIE;
PMMRIE &= ~(SVMHVLRPE | SVSHPE | SVMLVLRPE |
SVSLPE | SVMHVLRIE | SVMHIE |
SVSMHDLYIE | SVMLVLRIE | SVMLIE |
SVSMLDLYIE
);
SVSMHCTL_backup = SVSMHCTL;
SVSMLCTL_backup = SVSMLCTL;
//Clear flags
PMMIFG = 0;
//Set SVM highside to new level and check if a VCore increase is possible
SVSMHCTL = SVMHE | SVSHE | (SVSMHRRL0 * level);
//Wait until SVM highside is settled
while((PMMIFG & SVSMHDLYIFG) == 0)
{
;
}
//Clear flag
PMMIFG &= ~SVSMHDLYIFG;
//Check if a VCore increase is possible
if((PMMIFG & SVMHIFG) == SVMHIFG)
{
//-> Vcc is too low for a Vcore increase
//recover the previous settings
PMMIFG &= ~SVSMHDLYIFG;
SVSMHCTL = SVSMHCTL_backup;
//Wait until SVM highside is settled
while((PMMIFG & SVSMHDLYIFG) == 0)
{
;
}
//Clear all Flags
PMMIFG &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
SVMLVLRIFG | SVMLIFG |
SVSMLDLYIFG
);
//Restore PMM interrupt enable register
PMMRIE = PMMRIE_backup;
//Lock PMM registers for write access
PMMCTL0_H = 0x00;
//return: voltage not set
return false;
}
//Set also SVS highside to new level
//Vcc is high enough for a Vcore increase
SVSMHCTL |= (SVSHRVL0 * level);
//Wait until SVM highside is settled
while((PMMIFG & SVSMHDLYIFG) == 0)
{
;
}
//Clear flag
PMMIFG &= ~SVSMHDLYIFG;
//Set VCore to new level
PMMCTL0_L = PMMCOREV0 * level;
//Set SVM, SVS low side to new level
SVSMLCTL = SVMLE | (SVSMLRRL0 * level) |
SVSLE | (SVSLRVL0 * level);
//Wait until SVM, SVS low side is settled
while((PMMIFG & SVSMLDLYIFG) == 0)
{
;
}
//Clear flag
PMMIFG &= ~SVSMLDLYIFG;
//SVS, SVM core and high side are now set to protect for the new core level
//Restore Low side settings
//Clear all other bits _except_ level settings
SVSMLCTL &= (SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 +
SVSMLRRL1 + SVSMLRRL2
);
//Clear level settings in the backup register,keep all other bits
SVSMLCTL_backup &=
~(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);
//Restore low-side SVS monitor settings
SVSMLCTL |= SVSMLCTL_backup;
//Restore High side settings
//Clear all other bits except level settings
SVSMHCTL &= (SVSHRVL0 + SVSHRVL1 +
SVSMHRRL0 + SVSMHRRL1 +
SVSMHRRL2
);
//Clear level settings in the backup register,keep all other bits
SVSMHCTL_backup &=
~(SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);
//Restore backup
SVSMHCTL |= SVSMHCTL_backup;
//Wait until high side, low side settled
while(((PMMIFG & SVSMLDLYIFG) == 0) &&
((PMMIFG & SVSMHDLYIFG) == 0))
{
;
}
//Clear all Flags
PMMIFG &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG
);
//Restore PMM interrupt enable register
PMMRIE = PMMRIE_backup;
//Lock PMM registers for write access
PMMCTL0_H = 0x00;
return true;
}
bool increaseVCoreToLevel2()
{
uint8_t level = 2;
uint8_t actlevel;
bool status = true;
//Set Mask for Max. level
level &= PMMCOREV_3;
//Get actual VCore
actlevel = PMMCTL0 & PMMCOREV_3;
//step by step increase or decrease
while((level != actlevel) && (status == true))
{
if(level > actlevel)
{
status = setVCoreUp(++actlevel);
}
}
return (status);
}尊敬的 Martin:
要 在一个线程中包含代码、请使用上面的代码格式、选择"插入"、"代码"、然后选择语言、这有助于我们阅读。
通过上述两个函数、我无法找到器件消耗电流的原因、该电流消耗应来自请求时钟的外设。 请阅读用户指南中的第5.2.11节。 因此、您可能需要在进入 LPM4之前设置一个断点、查看请求时钟的确切外设并禁用时钟、或设置 UCSCTL8寄存器位以禁用所有时钟请求(《用户指南》第5.4.9节)。
以下是由 P1.4MSP430F55xx_P1_03.c 唤醒的示例代码
此致、
肖恩
尊敬的 Sean:
我认为它不是由 I/O 问题引起的。 原因是当我使用演示代码 MSP430F55xx_LPM4.c 时、它可以以<3uA 的值进入 LPM4。
这意味着我的电路板没有 I/O 电流冲突。
但是、一旦我在上电期间添加了加速例程、请等待一秒钟、然后进入相同的睡眠模式、电流会超过1mA。
因此、同一个睡眠模式条目的工作方式不同。
我还尝试在睡眠模式之前添加这些内容、它仍然无法正常工作。
UCSCTL3=0;
UCSCTL4 = 0x44;
UCSCTL0 = 0x0000;//
UCSCTL1 = 0x20;//
UCSCTL2 = 0x106F;
请尝试添加加速例程、亲自观察。
非常感谢!
void initClockTofast()
{
BUCSCTL3 = UCSCTL3;
BUCSCTL4=UCSCTL4;
UCSCTL3 |= SELREF_2;//设置 DCO FLL 基准= REFO
UCSCTL4 |= SELA _2;//设置 ACLK = REFO
_ bis_SR_register (SCG0);//禁用 FLL 控制环路
BUCSCTL2 = UCSCTL2;
BUCSCTL1=UCSCTL1;
UCSCTL0=0x0000;//设置尽可能低的 DCOx、MODx
UCSCTL1=DCORSEL_5;//选择 DCO 范围16MHz 运行
UCSCTL2 = FLLD_0 + 487;//+ 749;// 487;//将 DCO 乘法器487设置为16MHz、749为25MHz。
//(N + 1)* FLLRef = Fdco
//(487 + 1)* 32768 = 16MHz
//设置 FLL Div = fDCOCLK
__BIC_SR_register (SCG0);//启用 FLL 控制环路
//当 DCO 范围位已存在时 DCO 最坏情况下的稳定时间
//更改了 n x 32 x 32 x f_MCLK / f_FLL_reference。 请见5xx 中的 UCS 章节
//针对优化进行 UG。
// 32 x 32 x 16 MHz / 32,768Hz = 500000 = DCO 的 MCLK 周期稳定
__delay_cycles (750000);//
//_delay_cycles (500000);//
//循环直到 XT1、XT2和 DCO 故障标志被清除
正确
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);//清除 XT2、XT1、DCO 故障标志
SFRIFG1并且=~OFIFG;//清除故障标志
—while (SFRIFG1&OFIFG);//测试振荡器的故障标志
}
Sean、您好!
这里是我在原始 MSP430F55xx_LPM4.c 代码的基础上修改的代码、只是在上电时增加了速度、延迟了一位并断电。
LPM4模式导致超过1mA。
我曾尝试在 LPM4之前添加这些值。 我使用了其他代码、尝试在修改 UCSCTLx 之前读出它们并取回这些值。 我会尝试添加这些函数、但实际上没有帮助。
UCSCTL3=0;
UCSCTL4 = 0x44;
UCSCTL0 = 0x0000;//
UCSCTL1 = 0x20;//
UCSCTL2 = 0x106F;
谢谢。
马丁
#include <msp430.h>
#include <stdint.h>
#include <stdbool.h>
//******************************************************************************
// Device Initialization *******************************************************
//******************************************************************************
uint16_t BUCSCTL2;
uint16_t BUCSCTL1;
uint16_t BUCSCTL3;
uint16_t BUCSCTL4;
void initClockTo25MHz()
{
BUCSCTL3 = UCSCTL3;
BUCSCTL4 = UCSCTL4;
UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
BUCSCTL2 = UCSCTL2;
BUCSCTL1 = UCSCTL1;
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation
UCSCTL2 = FLLD_0 + 487; // + 749; // 487; // Set DCO Multiplier 487 for 16MHz, 749 for 25Mhz.
// (N + 1) * FLLRef = Fdco
// (487 + 1) * 32768 = 16MHz
// Set FLL Div = fDCOCLK
__bic_SR_register(SCG0); // Enable the FLL control loop
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 16 MHz / 32,768 Hz = 500000 = MCLK cycles for DCO to settle
__delay_cycles(750000);//
// __delay_cycles(500000);//
// 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
}
int main(void)
{
// increaseVCoreToLevel2();
initClockTo25MHz();
__delay_cycles(750000);//
__delay_cycles(750000);//
__delay_cycles(750000);//
__delay_cycles(750000);//
__delay_cycles(750000);//
__delay_cycles(750000);//
__delay_cycles(750000);//
__delay_cycles(750000);//
__delay_cycles(750000);//
/**
UCSCTL3 = 0;
UCSCTL4 = 0x44;
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = 0x20; // Select DCO range 16MHz operation
UCSCTL2 = 0x101F;
// Setup UCS
**/
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
UCSCTL4 = SELA_1; // Ensure VLO is ACLK source
// Port Configuration
P1OUT = 0x00;P2OUT = 0x04;P3OUT = 0x00;P4OUT = 0x7f;P5OUT = 0x00;P6OUT = 0x00;
P7OUT = 0x00;P8OUT = 0x00;PJOUT = 0x00;
P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;P5DIR = 0xFF;P6DIR = 0xFF;
P7DIR = 0xFF;P8DIR = 0xFF;PJDIR = 0xFF;
// Disable VUSB LDO and SLDO
USBKEYPID = 0x9628; // set USB KEYandPID to 0x9628
// access to USB config registers enabled
USBPWRCTL &= ~(SLDOEN+VUSBEN); // Disable the VUSB LDO and the SLDO
USBKEYPID = 0x9600; // access to USB config registers disabled
// Disable SVS
PMMCTL0_H = PMMPW_H; // PMM Password
SVSMHCTL &= ~(SVMHE+SVSHE); // Disable High side SVS
SVSMLCTL &= ~(SVMLE+SVSLE); // Disable Low side SVS
__bis_SR_register(LPM4_bits); // Enter LPM4
__no_operation();
}作者:Martin
这是我使用 MSP-EXP430F5529LP 进行的测试。
首次使用 MSP430F55xx_LPM4.c 运行、电流读数为1.1uA、表明器件处于 LPM4中。

然后、在进入 LPM4之前、我添加了使用25MHz DCO 切换 P1.1的代码:
#include <msp430.h>
void SetVcoreUp (unsigned int level);
int main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
P1DIR |= BIT1; // P1.1 output
P1DIR |= BIT0; // ACLK set out to pins
P1SEL |= BIT0;
P2DIR |= BIT2; // SMCLK set out to pins
P2SEL |= BIT2;
P7DIR |= BIT7; // MCLK set out to pins
P7SEL |= BIT7;
// Increase Vcore setting to level3 to support fsystem=25MHz
// NOTE: Change core voltage one level at a time..
SetVcoreUp (0x01);
SetVcoreUp (0x02);
SetVcoreUp (0x03);
UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_7; // Select DCO range 50MHz operation
UCSCTL2 = FLLD_0 + 762; // Set DCO Multiplier for 25MHz
// (N + 1) * FLLRef = Fdco
// (762 + 1) * 32768 = 25MHz
// Set FLL Div = fDCOCLK/2
__bic_SR_register(SCG0); // Enable the FLL control loop
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 25 MHz / 32,768 Hz ~ 780k MCLK cycles for DCO to settle
__delay_cycles(782000);
// Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
P1OUT ^= BIT1; // Toggle P1.1
__delay_cycles(600000); // Delay
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
// Setup UCS
UCSCTL4 = SELA_1; // Ensure VLO is ACLK source
// Port Configuration
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;P5OUT = 0x00;P6OUT = 0x00;
P7OUT = 0x00;P8OUT = 0x00;PJOUT = 0x00;
P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;P5DIR = 0xFF;P6DIR = 0xFF;
P7DIR = 0xFF;P8DIR = 0xFF;PJDIR = 0xFF;
// Disable VUSB LDO and SLDO
USBKEYPID = 0x9628; // set USB KEYandPID to 0x9628
// access to USB config registers enabled
USBPWRCTL &= ~(SLDOEN+VUSBEN); // Disable the VUSB LDO and the SLDO
USBKEYPID = 0x9600; // access to USB config registers disabled
// Disable SVS
PMMCTL0_H = PMMPW_H; // PMM Password
SVSMHCTL &= ~(SVMHE+SVSHE); // Disable High side SVS
SVSMLCTL &= ~(SVMLE+SVSLE); // Disable Low side SVS
__bis_SR_register(LPM4_bits); // Enter LPM4
__no_operation();
}
void SetVcoreUp (unsigned int level)
{
// Open PMM registers for write
PMMCTL0_H = PMMPW_H;
// Set SVS/SVM high side new level
SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
// Set SVM low side to new level
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
// Wait till SVM is settled
while ((PMMIFG & SVSMLDLYIFG) == 0);
// Clear already set flags
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
// Set VCore to new level
PMMCTL0_L = PMMCOREV0 * level;
// Wait till new level reached
if ((PMMIFG & SVMLIFG))
while ((PMMIFG & SVMLVLRIFG) == 0);
// Set SVS/SVM low side to new level
SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
// Lock PMM registers for write access
PMMCTL0_H = 0x00;
}
电流读数为1.3uA、没有问题。

请尝试上面的代码吗?
此致、
肖恩