本帖最后由 卡文迪许怪 于 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;
- }
|