改的PM里的例程
int main()
{
DelayMs(2);
SetSysClock( CLK_SOURCE_HSE_32MHz ); // 设置外部32M做主频
GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
/* 配置串口调试 */
// DebugInit();
PRINT( "Start @ChipID=%02x\n", R8_CHIP_ID );
DelayMs(200);
#if 1
/* 配置唤醒源为 GPIO - PA6&PA5 */
GPIOA_ModeCfg( GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4, GPIO_ModeIN_PU );
GPIOA_ITModeCfg( GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4, GPIO_ITMode_FallEdge ); // 下降沿唤醒
NVIC_EnableIRQ( GPIO_IRQn );
PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE );
#endif
while(1){
#if 1
PRINT( "IDLE mode sleep \n");
DelayMs(1);
LowPower_Idle();
PRINT( "wake.. \n");
DelayMs(500);
#endif
#if 1
PRINT( "sleep mode sleep \n");
DelayMs(5000);
LowPower_Sleep( RB_PWR_RAM14K|RB_PWR_RAM2K ); //只保留14+2K SRAM 供电
/*
使用HSI/5=6.4M睡眠,唤醒时间大概需要 2048Tsys≈330us
HSE起振一般不超过1.2ms(500us-1200us),所以切换到外部HSE,需要 1.2ms-330us 这个时间可以保证HSE足够稳定,一般用于蓝牙
DelayUs()函数时基于32M时钟的书写,此时主频为6.4M,所以 DelayUs((1200-330)/5)
*/
// if(!(R8_HFCK_PWR_CTRL&RB_CLK_XT32M_PON)) { // 是否HSE上电
// PWR_UnitModCfg( ENABLE, UNIT_SYS_HSE ); // HSE上电
// DelayUs((1200)/5);
// }
// else if(!(R16_CLK_SYS_CFG&RB_CLK_OSC32M_XT)){ // 是否选择 HSI/5 做时钟源
// DelayUs((1200-330)/5);
// }
// HSECFG_Current( HSE_RCur_100 ); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
// DelayUs(500/5); // 等待稳定 1-5us
DelayMs(500);
// GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
// GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
SetSysClock( CLK_SOURCE_HSE_32MHz );
// PRINT( "wake.. \n");
DelayMs(5000);
#endif
}
}
理论验证流程是while(1) { 进ldle -> IO唤醒 -> 进sleep-> IO唤醒 }
理论电流读表显示是 1800μA (ldle) -> 1.3μA(sleep)
但是会很频繁地出现在sleep模式唤醒后电流读表变成450μA左右(程序跑飞?)