改的PM里的例程
int main()
{
? ? DelayMs(2);?
? ? SetSysClock( CLK_SOURCE_HSE_32MHz );? ? ? ? ? ? // 設(shè)置外部32M做主頻
? ? GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
? ? GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
? ??
/* 配置串口調(diào)試 */? ?
//? ? 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睡眠,喚醒時(shí)間大概需要 2048Tsys≈330us
HSE起振一般不超過(guò)1.2ms(500us-1200us),所以切換到外部HSE,需要 1.2ms-330us 這個(gè)時(shí)間可以保證HSE足夠穩(wěn)定,一般用于藍(lán)牙
DelayUs()函數(shù)時(shí)基于32M時(shí)鐘的書(shū)寫(xiě),此時(shí)主頻為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 做時(shí)鐘源
//? ? ? ? DelayUs((1200-330)/5);
//? ? }?
//? ? HSECFG_Current( HSE_RCur_100 );? ? ?// 降為額定電流(低功耗函數(shù)中提升了HSE偏置電流)
//? ? DelayUs(500/5);? ? ? ? ? ? ? ? ? ? ? ?// 等待穩(wěn)定 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
? ? }
}
理論驗(yàn)證流程是while(1) { 進(jìn)ldle -> IO喚醒 -> 進(jìn)sleep-> IO喚醒 }
理論電流讀表顯示是 1800μA (ldle) -> 1.3μA(sleep)
但是會(huì)很頻繁地出現(xiàn)在sleep模式喚醒后電流讀表變成450μA左右(程序跑飛?)