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中断唤醒电源 */