[技术问答] HC32L110低功耗模式不稳定问题

[复制链接]
 楼主| 发表于 2023-10-11 11:34 | 显示全部楼层 |阅读模式
本帖最后由 卡文迪许怪 于 2023-10-11 11:42 编辑

最近试了HC32L110低功耗。HC32L110C6PA-TSSOP20主时钟选择内部高速时钟。
启动使用了GPIO,lptime。
GPIO不使用的io都做了输入模式处理(除swd)。
lptime有中断。

一开始的时候5ua,正常运行,每1s唤醒一次。
但是运行了一天之后,我发现他功耗来到了60ua,这是为什么?
代码如下:
  1. #include "main.h"

  2. volatile int LptTest_L    = 0;
  3. volatile int LptTest_falg = 0;

  4. int SYS_Status = 0;

  5. int main(void)
  6. {
  7.     Main_Init();
  8.     while (1) {
  9.         switch (SYS_Status) {
  10.             case (0): {
  11.                 if (LptTest_L >= 1) {
  12.                     Lpt_Stop();

  13.                     if (User_do_check() == 0) {
  14.                         SYS_Status++; //
  15.                     } else {
  16.                         SYS_Status = 2;
  17.                     }
  18.                 }
  19.                 if (LptTest_falg == 1 && SYS_Status == 0)        // nothing
  20.                 {
  21.                     LptTest_falg = 0;
  22.                     Lpm_GotoLpmMode();
  23.                 }
  24.             } break;
  25.             case (1): {
  26.                 SYS_Status++;
  27.                 // do something
  28.             } break;
  29.             case (2): {
  30.                 SYS_Status++;
  31.                 LptTest_L = 0;
  32.                                 Lpt_ARRSet(0x00);
  33.                 Lpt_Run();
  34.                 // run time
  35.             } break;
  36.             case (3): {
  37.                 SYS_Status = 0;
  38.                 Lpm_GotoLpmMode();
  39.                 // low pow & clean Status
  40.             } break;
  41.             default:
  42.                 break;
  43.         }
  44.                 Base_NOP_Delay(10, 10);
  45.     }
  46. }

  47. int User_do_check(void)
  48. {
  49.     int retval = 0;
  50.     User_GPIO_set(MOSB, 1);
  51.     Base_NOP_Delay(6000, 100);
  52.     User_GPIO_set(MOSB, 0);

  53.     return retval;
  54. }

  55. void Main_Init(void)
  56. {

  57.     stc_clk_config_t stcClkCfg;
  58.     stcClkCfg.enClkSrc  = ClkRCH;
  59.     stcClkCfg.enHClkDiv = ClkDiv1;
  60.     stcClkCfg.enPClkDiv = ClkDiv1;

  61.     Clk_Init(&stcClkCfg);

  62.     Clk_Enable(ClkRCL, TRUE); // 使能RCL


  63.     User_GPIO_Init(TRUE);
  64.     User_GPIO_set(GPO, 0);
  65.     User_GPIO_set(MOSA, 0);
  66.     User_GPIO_set(MOSB, 0); // 全关

  67.     //        Uart_lp_Init (TRUE);
  68.     TIME_lp_Init(TRUE);
  69.     Base_NOP_Delay(6000, 100);
  70.     do {
  71.         Base_NOP_Delay(10, 10);
  72.     } while (1 == KEY_R()); // 注意:此处用户不能屏蔽,否则进入深度休眠模式导致SWD连接不上 //


  73.     Lpm_GotoLpmMode();

  74. }

  75. void LptInt(void)
  76. {
  77.     if (TRUE == Lpt_GetIntFlag()) {
  78.         Lpt_ClearIntFlag();
  79.         LptTest_falg = 1;
  80.         LptTest_L++;
  81.         if (LptTest_L > 1000) {
  82.             LptTest_L = 0;
  83.         }
  84.     }
  85. }

  86. int TIME_lp_Init(int Set)
  87. {
  88.     stc_lpt_config_t stcConfig; // time
  89.     stc_lpm_config_t stcLpmCfg; // Low Power Mode
  90.     DDL_ZERO_STRUCT(stcLpmCfg);

  91.     int retval          = Ok;
  92.     uint16_t u16ArrData = 0;
  93.     if (Set) {
  94.         Clk_SetPeripheralGate(ClkPeripheralLpTim, TRUE);
  95.         stcConfig.enGateP  = LptPositive;
  96.         stcConfig.enGate   = LptGateDisable;
  97.         stcConfig.enTckSel = LptIRC32K;
  98.         stcConfig.enTog    = LptTogDisable;
  99.         stcConfig.enCT     = LptTimer;
  100.         stcConfig.enMD     = LptMode2;

  101.         stcConfig.pfnLpTimCb = LptInt;

  102.         if (Lpt_Init(&stcConfig) != Ok)
  103.             retval = Error;
  104.         if (retval == Ok) {
  105.             // Low Power Mode Cfg
  106.             stcLpmCfg.enSEVONPEND   = Se***dDisable;
  107.             stcLpmCfg.enSLEEPDEEP   = SlpDpEnable;
  108.             stcLpmCfg.enSLEEPONEXIT = SlpExtDisable;
  109.             Lpm_Config(&stcLpmCfg);

  110.             // Lpt 中断使能
  111.             Lpt_ClearIntFlag();
  112.             Lpt_EnableIrq();
  113.             EnableNvic(LPTIM_IRQn, 2, TRUE);

  114.             // 设置重载值,计数初值,启动计数
  115.             Lpt_ARRSet(u16ArrData);
  116.             Lpt_Run();
  117.         }
  118.     } else {
  119.         Clk_SetPeripheralGate(ClkPeripheralLpTim, FALSE);
  120.     }

  121.     return retval;
  122. }







发表于 2023-10-25 11:32 | 显示全部楼层
小华的芯片低功耗挺稳定的啊,咋还不稳定了?
发表于 2023-10-25 12:37 | 显示全部楼层
你是不是硬件受到干扰了啊
发表于 2023-10-25 13:52 | 显示全部楼层
一般情况是谁静电打到这电路板了或者受到其他干扰会这样,容易漏电
发表于 2023-10-25 15:12 | 显示全部楼层
是不是电容漏电了?
发表于 2023-10-25 16:45 | 显示全部楼层
你多测几个,看看都是功耗60微安吗?
发表于 2023-10-25 18:28 | 显示全部楼层
多测测,一般多测测才能判断是硬件问题,还是程序问题
发表于 2023-10-26 08:25 | 显示全部楼层
SWD好像也要处理一下吧
发表于 2023-10-26 09:18 | 显示全部楼层
你就按照官方的低功耗配置IO状态就行
发表于 2023-10-26 10:39 | 显示全部楼层
看代码好像没啥问题,但是你说一下增长60uA,不知道为啥
发表于 2023-10-26 13:14 | 显示全部楼层
是不是有的外设没处理好啊?没关闭吧

发表于 2023-10-26 17:47 | 显示全部楼层
建议不使用的GPIO关闭上下拉并输出低,或者配置下拉使能输出低。
配置上拉输入不太好,我实测有些芯片会有60~70uA的功耗
发表于 2023-11-2 10:10 | 显示全部楼层
如果重新断电 上电之后还能回到5ua的低功耗模式吗
发表于 2023-11-2 10:42 | 显示全部楼层
内部的这个高速时钟应该不是问题 能确定程序没有跑飞吗
发表于 2023-11-2 11:16 | 显示全部楼层
代码的运行环境怎么样 干扰厉害吗
发表于 2023-11-2 20:49 | 显示全部楼层
看代码的话 并没有复杂的功能 这个电流可以进行实时监控吗
发表于 2023-11-2 21:13 | 显示全部楼层
不同的芯片在低功耗的时候对引脚的处理有些不同
发表于 2023-11-2 21:48 | 显示全部楼层
这种现象是非常容易复现的还是偶尔一次的呢
发表于 2024-7-31 17:10 | 显示全部楼层
能教下我吗 我进入休眠后电流mA
发表于 2025-5-29 12:14 | 显示全部楼层
检查下IO口配置,特别是一些浮空状态的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝
快速回复 返回顶部 返回列表