582F睡眠功耗近50uA,请问如何降低?

icon_pdf.gifBTR-C1原理图.pdf

原理图已上传。相关代码如下 :


int main(void)

{

#if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)

    PWR_DCDCCfg(ENABLE);

#endif

    SetSysClock(CLK_SOURCE_PLL_60MHz);

#if (defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)

    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

#endif

……


#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)

//  cfg.WakeUpTime = WAKE_UP_RTC_MAX_TIME;

//  cfg.sleepCB = CH58X_LowPower; // 启用睡眠

#endif            

这一段程序因为不知道协议栈中的睡眠功能如果配置,用样板程序打印HAL_SLEEP,测试无法进入睡眠模式,所以删除了。



#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)

    if(events & HAL_PM_EVENT)

    {

      uint32_t sleep_time_cnt;

      if (BLEConnected == BLE_PAIRING)

        sleep_time_cnt = PAIRSLEEP_TIME_CNT;

      else {

        sleep_time_cnt = SLEEP_TIME_CNT;

      }

//        PRINT("* \n");

//      if (BLEConnected != BLE_CONNECTING)

      SleepTimer ++;

      if (SleepTimer >= sleep_time_cnt)

      {

        LowPower_Sleep(0);

//        LowPower_Shutdown(0);   //本来想调用这个函数的,但发现会不断的重启,但调用 LowPower_Sleep(0);就正常,不知道是什么情况,方便的话也麻烦解答一下,谢谢。

      }

      else {

        tmos_start_task(halTaskID, HAL_PM_EVENT, MS1_TO_SYSTEM_TIME(1000));

      }

      return events ^ HAL_PM_EVENT;

    }

#endif

这一段是我自己加的控制进入睡眠模式的代码,应该与这些代码无关。

#if(defined HAL_SLEEP) && (HAL_SLEEP == TRUE)

    HAL_SleepInit();

    SleepTimer = 0;

    tmos_start_task( halTaskID, HAL_PM_EVENT, 1000);    // 添加一个监测睡眠任务

#endif


void HAL_SleepInit(void)

{

#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)

  GPIOA_ModeCfg( GPIO_Pin_4 |GPIO_Pin_8 |GPIO_Pin_13, GPIO_ModeIN_PU );                //初始化IO状态

  GPIOA_ITModeCfg( GPIO_Pin_4 |GPIO_Pin_8 |GPIO_Pin_13, GPIO_ITMode_FallEdge );        // 设置下降沿唤醒

  PFIC_EnableIRQ( GPIO_A_IRQn );                              //开启GPIO中断 PA口

  GPIOB_ModeCfg( GPIO_Pin_13, GPIO_ModeIN_PU );                //初始化IO状态

  GPIOB_ITModeCfg( GPIO_Pin_13, GPIO_ITMode_FallEdge );        // 设置下降沿唤醒

  PFIC_EnableIRQ( GPIO_B_IRQn );                              //开启GPIO中断 PA口


  PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE, Long_Delay );//开启GPIO唤醒使能

#if 0

    sys_safe_access_enable();

    R8_SLP_WAKE_CTRL |= RB_SLP_RTC_WAKE; // RTC唤醒

    sys_safe_access_enable();

    R8_RTC_MODE_CTRL |= RB_RTC_TRIG_EN;  // 触发模式

    sys_safe_access_disable();              //

    PFIC_EnableIRQ(RTC_IRQn);

#endif

#endif

}

客户希望进入睡眠模式后只能通过按键唤醒,所以RTC部分注释掉了。



您好,50uA的休眠电流,能否看出是平均电流还是休眠底电流。

如果是平均电流,可以检查一下是不是还有哪些TMOS事件循环没有注释掉。

如果说TMOS事件循环都关掉了,是底电流高,大概是GPIO漏电导致的。休眠前要将GPIO配置为和休眠期间的外部电平接近的输入上拉/输入下拉,固定电平以减小漏电。未接出的引脚配置为输入上拉即可。测功耗时注意要拔掉除了电源线两根线之外的其他线材,包括USBtypeC数据线和接串口模块打印的杜邦线。

如果唤醒后需要执行无线通信,建议先执行一次RF校准事件,即halTaskID下的HAL_REG_INIT_EVENT事件。

使用LowPower_Shutdown(0);这个函数会使MCU进入shutdown休眠,shutdown也支持GPIO唤醒和RTC唤醒,但特性是唤醒后会复位MCU,功耗相比sleep更低。


感谢您的回复。


LowPower_Shutdown(0);为什么会重启?应该不是唤醒的原因,如果是,那么LowPower_Sleep(0);的表现应该也会不断的唤醒吧?


另外您提到的TMOS事件注释掉,应该如何操作呢?


还有咱们协议栈中的睡眠功能如何配置?好象只是简单的设置HAL_SLEEP为TRUE,不能实现睡眠功能。


不好意思,以前没有怎么接触过咱们的芯片,请多指教,谢谢



①shutdown休眠,唤醒后复位是特性;sleep休眠,唤醒后不会复位。

image.png

②TMOS事件有一部分是循环的,包括应用层的代码和库中的(比如说BLE广播,是由协议栈管理的,每隔一定时间发包)代码,测最低功耗时要关掉非必要的循环,关闭方法可以是直接注释掉相应的代码块,或者使用tmos_stop_task(),或者使用各种特定的方式关闭库中的循环,要看具体问题。

③跑BLE代码或者RF_PHY代码,一般情况下是只要置1使能HAL_SLEEP宏,让协议栈管理休眠就好。如果使能HAL_SLEEP宏前后没有功耗变化,检查是否成功启用了改宏,是否有执行到CH58X_LowPower内部。


那为什么会唤醒呢?唤醒才重启这个我知道,但如果是因为唤醒的话,LowPower_Sleep(0);进入的应该也会唤醒吧?


协议栈的睡眠模式没能正常工作,没有执行到CH58X_LowPower内部,但是什么原因呢?


您好,排查代码中是否有期望外的唤醒芯片的代码,sleep休眠支持RTC唤醒和GPIO唤醒,TMOS系统的唤醒属于RTC唤醒。

检查是否注释掉了所有TMOS事件。如果启用HAL_SLEEP后,协议栈检测到所有TMOS事件都停止了,不会进入休眠,协议栈需要拿到下一次唤醒的时间点,确保芯片有机会会被唤醒,不会一直休眠下去;如果业务逻辑中不需要每隔一段时间循环执行操作,可以自定义一个间隔23小时唤醒一次的事件,醒来后什么逻辑都不必执行,只是用于另TMOS系统能够正常休眠。

检查一下config.h中的HAL_SLEEP是否为灰色,若为灰色则表示此处宏配置不生效,需要在工程配置中修改。

2773877-20220823173402804-1668195416.png

2773877-20220823173840388-1573335845.jpg


感谢回复,我先试试,有不明白的再请教。谢谢!


只有登录才能回复,可以选择微信账号登录