CH582开启睡眠模式下低功耗测试

 RTC测量功耗总结:

CH582睡眠模式下低功耗测试
  睡眠模式下未唤醒时功耗 唤醒后恢复工作(无其他功能只有延时程序)功耗 一个周期(RTC唤醒+主程序延时2ms)平均功耗值
RTC定时1s唤醒 3.23uA 5.46mA 12.31uA
RTC定时250ms唤醒 3.22uA 5.41mA 54.46uA

 

 

 

 上图为手册中在睡眠模式下的功耗值,以此为参考依据。

    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

1、所有IO管脚,如果高阻状态端口是高电平,就设成上拉输入,如果高阻状态是低电平,设成下拉输入,如果高阻是中间状态,设成模拟输入。必须用到输出时,硬件上必须加上下拉。
2、不用的IO口可以设置为IPU/IPD/PP,如果IO为浮空状态,外部电路必须要用上拉或下拉,引脚浮空非常耗电。
3、芯片与外设相连时,外设脚为高电平芯片脚配成上拉,外设为低芯片也要为低电平,这样就能避免有电流。
4、睡眠模式不要使用外部晶振,两个晶振输入脚要remap成普通IO,并配置成IPU/IPD/PP,千万不能浮空,时钟使用内部RC振荡器。
5、如果用在32里:pwr的时钟要使能,即RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
6、关闭JTAG口,并设成普通IO;
7、不用的外设,复用的时钟要关闭。当用中断唤醒时,切记要保留。


 这里先使用外部中断引脚PB1的方式唤醒睡眠,RTC中断在后面;

    /* 配置唤醒源为 GPIO - PB1 */
    GPIOB_ModeCfg(GPIO_Pin_1, GPIO_ModeIN_PU);
    GPIOB_ITModeCfg(GPIO_Pin_1, GPIO_ITMode_FallEdge); /* 下降沿唤醒 */
    PFIC_EnableIRQ(GPIO_B_IRQn);
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);

 

  /*主程序*/
    while(1)
    {
        PRINT("sleep mode sleep \n");
        DelayMs(2);
        /* 注意当主频为80M时,Sleep睡眠唤醒中断不可调用flash内代码 */
        LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); /* 只保留30+2K SRAM 供电 */
        HSECFG_Current(HSE_RCur_100);                 /* 降为额定电流(低功耗函数中提升了HSE偏置电流) */
        DelayMs(5);
        PRINT("wake.. \n");
        DelayMs(200);
    }

唤醒后执行大概205ms的延时后继续进入睡眠状态;

/*********************************************************************
 * @fn      GPIOB_IRQHandler
 *
 * @brief   GPIOB中断函数,外部中断PB1唤醒睡眠
 *
 * @return  none
 */
__INTERRUPT
__HIGH_CODE
void GPIOB_IRQHandler(void)
{
    GPIOB_ClearITFlagBit(GPIO_Pin_1);
}

得到结果图如下:

其中 ,唤醒前与唤醒后放大查看图:

 

 下面为唤醒后,

接下来使用RTC唤醒的方式进行测试:

  RTC_TMRFunCfg(Period_1_S);    /* 定时1s的RTC闹钟 */
  PFIC_EnableIRQ(RTC_IRQn);     /* 使能RTC中断 */
  PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Short_Delay );  /* 使能RTC中断唤醒源 */

 

/*RTC闹钟唤醒中断*/
__INTERRUPT
__HIGH_CODE
void RTC_IRQHandler(void)
{
    if (RTC_GetITFlag(RTC_TMR_EVENT))
    {
        RTC_ClearITFlag(RTC_TMR_EVENT);
    }
}

 

 

接下来测试一下RTC定时250ms为周期唤醒:

  RTC_TMRFunCfg(Period_0_25_S);  /* 定时0.25s的RTC闹钟 */
  PFIC_EnableIRQ(RTC_IRQn);     /* 使能RTC中断 */
  PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Short_Delay );  /* 使能RTC中断唤醒电源 */

 

 

 

 

 

 

 

posted @ 2022-11-02 14:51  oTvTo  阅读(2615)  评论(0编辑  收藏  举报