上图为手册中在睡眠模式下的功耗值,以此为参考依据。
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、不用的外设,复用的时钟要关闭。当用中断唤醒时,切记要保留。
/* 配置唤醒源为 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, Short_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); }
得到结果图如下:
其中 ,唤醒前与唤醒后放大查看图:
下面为唤醒后,
标签:睡眠,Pin,唤醒,低功耗,GPIOB,IO,GPIO,CH582,LowerPowerSleep From: https://www.cnblogs.com/azou/p/16851017.html