打印
[技术问答]

第一次接触华大的片子,进入深度睡眠还有26ua,求大佬指点

[复制链接]
1839|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
18162813795|  楼主 | 2021-5-13 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     我把官方例程中低功耗程序烧进板子后,电流可以到1uA。  官方例程中程序使用的是复位默认RCH的时钟,我现在项目中使用的代码会配置成为PLL时钟,看了手册低功耗前需要把PLL重新配置为RCH,现在按照手册给的步骤配置了把PLL切换为RCH,进入深度睡眠还是有20多uA!!     请问下如果初始化的时候自己配置过时钟,然后进入低功耗后,要怎么重新配置下时钟才能降低功耗?   
     另外我自己试了下只要把官网例程中初始化的时候加上时钟配置初始化,比如自己配置为RCH,不使用复位后默认的时钟配置,程序进入深度睡眠后都是还有26uA。请问这是为啥?

使用特权

评论回复
沙发
martinhu| | 2021-5-13 11:11 | 只看该作者
官网GPIO example的deepsleep例子,如果加上RCH配置,测试功耗应该不会有问题,楼主是否加了其他代码?
如果是使用了PLL,使能前开启了BGR,那么切换回RCH的时候,BGR需要关闭,然后进DeepSleep。
因为BGR本身会耗电,但是使用PLL时候需要先开启BGR.
另外,关于悬空的,没有外接电路的引脚,需要使能上拉或者下拉的输入状态。

使用特权

评论回复
评论
18162813795 2021-5-13 12:36 回复TA
下面是切换到RCH的函数,后面关闭BGR了 void PLLChangeToRCH(void) { Sysctrl_SysClkSwitch(SysctrlClkRCH) ; //< 时钟切换 RCH Flash_WaitCycle(FlashWaitCycle0); //读时钟周期设置为0 Sysctrl_ClkSourceEnable(SysctrlClkPLL, FALSE); //关闭PLL M0P_BGR->CR_f.BGR_EN = FALSE; //关闭BGR } 下...  
板凳
18162813795|  楼主 | 2021-5-13 12:34 | 只看该作者
martinhu 发表于 2021-5-13 11:11
官网GPIO example的deepsleep例子,如果加上RCH配置,测试功耗应该不会有问题,楼主是否加了其他代码?
如 ...

下面是切换到RCH的函数,后面关闭BGR了
void PLLChangeToRCH(void)
{                                
       
        Sysctrl_SysClkSwitch(SysctrlClkRCH) ;        //< 时钟切换 RCH       
        Flash_WaitCycle(FlashWaitCycle0);                         //读时钟周期设置为0        
       Sysctrl_ClkSourceEnable(SysctrlClkPLL, FALSE); //关闭PLL       
        M0P_BGR->CR_f.BGR_EN = FALSE;   //关闭BGR                                                    
}   

下面这个是我初始化时候配置的PLL
void SysClockCfg(void)
{
    en_flash_waitcycle_t      enWaitCycle;
    stc_sysctrl_pll_cfg_t     stcPLLCfg;
   
    //结构体初始化清零
    DDL_ZERO_STRUCT(stcPLLCfg);
   
    enWaitCycle = FlashWaitCycle1;
    Flash_WaitCycle(enWaitCycle);   
   
    stcPLLCfg.enInFreq    = SysctrlPllInFreq4_6MHz;     //RCH 4MHz    内部高速时钟
    stcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;  //PLL 输出48MHz
    stcPLLCfg.enPllClkSrc = SysctrlPllRch;              //输入时钟源选择RCH
    stcPLLCfg.enPllMul    = SysctrlPllMul12;            //4MHz x 12 = 48MHz    倍频作用
       
    Sysctrl_SetPLLFreq(&stcPLLCfg);
       
    Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384);
       
    Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);
   
    Sysctrl_SysClkSwitch(SysctrlClkPLL);  ///< 时钟切换
    SystemCoreClockUpdate();
}


现在问题就很奇怪,当我把PLL配置取消掉,进入deepsleep有1uA,同样的硬件,当我配置PLL,延时5s后再调用PLLchanggeRCH(PLL时钟转为RCH),按照应用手册步骤来的,然后进入deepsleep就有26uA了,不知道这多出来的电流哪里来的?  感觉不像硬件

使用特权

评论回复
地板
18162813795|  楼主 | 2021-5-13 12:35 | 只看该作者
下面是切换到RCH的函数,后面关闭BGR了
void PLLChangeToRCH(void)
{                                
       
        Sysctrl_SysClkSwitch(SysctrlClkRCH) ;        //< 时钟切换 RCH       
        Flash_WaitCycle(FlashWaitCycle0);                         //读时钟周期设置为0        
       Sysctrl_ClkSourceEnable(SysctrlClkPLL, FALSE); //关闭PLL       
        M0P_BGR->CR_f.BGR_EN = FALSE;   //关闭BGR                                                    
}   

下面这个是我初始化时候配置的PLL
void SysClockCfg(void)
{
    en_flash_waitcycle_t      enWaitCycle;
    stc_sysctrl_pll_cfg_t     stcPLLCfg;
   
    //结构体初始化清零
    DDL_ZERO_STRUCT(stcPLLCfg);
   
    enWaitCycle = FlashWaitCycle1;
    Flash_WaitCycle(enWaitCycle);   
   
    stcPLLCfg.enInFreq    = SysctrlPllInFreq4_6MHz;     //RCH 4MHz    内部高速时钟
    stcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;  //PLL 输出48MHz
    stcPLLCfg.enPllClkSrc = SysctrlPllRch;              //输入时钟源选择RCH
    stcPLLCfg.enPllMul    = SysctrlPllMul12;            //4MHz x 12 = 48MHz    倍频作用
       
    Sysctrl_SetPLLFreq(&stcPLLCfg);
       
    Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384);
       
    Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);
   
    Sysctrl_SysClkSwitch(SysctrlClkPLL);  ///< 时钟切换
    SystemCoreClockUpdate();
}


现在问题就很奇怪,当我把PLL配置取消掉,进入deepsleep有1uA,同样的硬件,当我配置PLL,延时5s后再调用PLLchanggeRCH(PLL时钟转为RCH),按照应用手册步骤来的,然后进入deepsleep就有26uA了,不知道这多出来的电流哪里来的?  感觉不像硬件。

使用特权

评论回复
5
zhangjiyun125| | 2021-5-13 15:01 | 只看该作者
楼主可以考虑用我家的芯片,我们公司从事单片机软硬件设计有15-16年了,经验丰富; 专业承接单片机项目合作, 有兴趣请联系曾先生: 13530261732,QQ:  277839662,微信同号

使用特权

评论回复
6
martinhu| | 2021-5-13 15:04 | 只看该作者
楼主单步试试,M0P_BGR->CR_f.BGR_EN = FALSE;   //关闭BGR这句有没有起作用。
如果没起作用,先把ADC外设时钟使能,然后再关闭BGR,再把ADC外设时钟关闭。

使用特权

评论回复
评论
18162813795 2021-5-13 15:36 回复TA
感谢感谢 解决了 是这个ADC时钟使能的问题 
7
lichen5685| | 2022-6-12 00:08 | 只看该作者
遇到相同问题。开了PLL之后,进入低功耗,功耗在20多uA,始终降不下去。关闭BGR、关闭PLL不管用。不开PLL进入低功耗没有问题,我板子上MCU外加一颗RF芯片,低功耗在1.5uA。

使用特权

评论回复
8
yangxiaor520| | 2022-6-14 08:30 | 只看该作者
手册上说的是多少uA?

使用特权

评论回复
9
liaotian001| | 2022-6-15 09:26 | 只看该作者
30uA级别,就2个问题,一个是BGR打开,未关闭(非自动关闭,如需要软件开关),另一个就是IO配置成pull high, pull low,但是外部被force到电源/地的相反电压。 Spec在0.6uA,但很多在0.4~0.5uA,Spec是有冗余量的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

11

帖子

0

粉丝