本帖最后由 卡文迪许怪 于 2023-10-11 11:42 编辑
最近试了HC32L110低功耗。HC32L110C6PA-TSSOP20主时钟选择内部高速时钟。
启动使用了GPIO,lptime。
GPIO不使用的io都做了输入模式处理(除swd)。
lptime有中断。
一开始的时候5ua,正常运行,每1s唤醒一次。
但是运行了一天之后,我发现他功耗来到了60ua,这是为什么?
代码如下:
#include "main.h"
volatile int LptTest_L = 0;
volatile int LptTest_falg = 0;
int SYS_Status = 0;
int main(void)
{
Main_Init();
while (1) {
switch (SYS_Status) {
case (0): {
if (LptTest_L >= 1) {
Lpt_Stop();
if (User_do_check() == 0) {
SYS_Status++; //
} else {
SYS_Status = 2;
}
}
if (LptTest_falg == 1 && SYS_Status == 0) // nothing
{
LptTest_falg = 0;
Lpm_GotoLpmMode();
}
} break;
case (1): {
SYS_Status++;
// do something
} break;
case (2): {
SYS_Status++;
LptTest_L = 0;
Lpt_ARRSet(0x00);
Lpt_Run();
// run time
} break;
case (3): {
SYS_Status = 0;
Lpm_GotoLpmMode();
// low pow & clean Status
} break;
default:
break;
}
Base_NOP_Delay(10, 10);
}
}
int User_do_check(void)
{
int retval = 0;
User_GPIO_set(MOSB, 1);
Base_NOP_Delay(6000, 100);
User_GPIO_set(MOSB, 0);
return retval;
}
void Main_Init(void)
{
stc_clk_config_t stcClkCfg;
stcClkCfg.enClkSrc = ClkRCH;
stcClkCfg.enHClkDiv = ClkDiv1;
stcClkCfg.enPClkDiv = ClkDiv1;
Clk_Init(&stcClkCfg);
Clk_Enable(ClkRCL, TRUE); // 使能RCL
User_GPIO_Init(TRUE);
User_GPIO_set(GPO, 0);
User_GPIO_set(MOSA, 0);
User_GPIO_set(MOSB, 0); // 全关
// Uart_lp_Init (TRUE);
TIME_lp_Init(TRUE);
Base_NOP_Delay(6000, 100);
do {
Base_NOP_Delay(10, 10);
} while (1 == KEY_R()); // 注意:此处用户不能屏蔽,否则进入深度休眠模式导致SWD连接不上 //
Lpm_GotoLpmMode();
}
void LptInt(void)
{
if (TRUE == Lpt_GetIntFlag()) {
Lpt_ClearIntFlag();
LptTest_falg = 1;
LptTest_L++;
if (LptTest_L > 1000) {
LptTest_L = 0;
}
}
}
int TIME_lp_Init(int Set)
{
stc_lpt_config_t stcConfig; // time
stc_lpm_config_t stcLpmCfg; // Low Power Mode
DDL_ZERO_STRUCT(stcLpmCfg);
int retval = Ok;
uint16_t u16ArrData = 0;
if (Set) {
Clk_SetPeripheralGate(ClkPeripheralLpTim, TRUE);
stcConfig.enGateP = LptPositive;
stcConfig.enGate = LptGateDisable;
stcConfig.enTckSel = LptIRC32K;
stcConfig.enTog = LptTogDisable;
stcConfig.enCT = LptTimer;
stcConfig.enMD = LptMode2;
stcConfig.pfnLpTimCb = LptInt;
if (Lpt_Init(&stcConfig) != Ok)
retval = Error;
if (retval == Ok) {
// Low Power Mode Cfg
stcLpmCfg.enSEVONPEND = Se***dDisable;
stcLpmCfg.enSLEEPDEEP = SlpDpEnable;
stcLpmCfg.enSLEEPONEXIT = SlpExtDisable;
Lpm_Config(&stcLpmCfg);
// Lpt 中断使能
Lpt_ClearIntFlag();
Lpt_EnableIrq();
EnableNvic(LPTIM_IRQn, 2, TRUE);
// 设置重载值,计数初值,启动计数
Lpt_ARRSet(u16ArrData);
Lpt_Run();
}
} else {
Clk_SetPeripheralGate(ClkPeripheralLpTim, FALSE);
}
return retval;
}
|