代碼附上,
官方例程抄的
不知道這樣寫有沒有問題
Shutdown模式貌似沒有問題,正常睡眠,正常喚醒。
但是Sleep模式喚醒之后,第2次睡眠喚醒后必出錯(cuò)
沒有使用HAL里面的睡眠模式
/*******************************************************************************
* Function Name? : SystemShutdown
*******************************************************************************/
void SystemShutdown(void)
{?
?SYS_USB_STOP();?
?GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
?GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
?
?/* 配置喚醒源為 GPIO - PB4 */
?GPIOB_ITModeCfg( CtrKey, GPIO_ITMode_FallEdge );??????? // 下降沿喚醒
?NVIC_EnableIRQ( GPIO_IRQn );
?PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE );//喚醒模式GPIO,ALL=全部。USB\ETH\RTC\GPIO\BAT
?SetSysClock( CLK_SOURCE_HSI_32MHz );//選擇 HSI 做時(shí)鐘源?
?LowPower_Shutdown( NULL );
}
/*******************************************************************************
* Function Name? : SystemSleep
*******************************************************************************/
void SystemSleep(void)
{
?SYS_USB_STOP();
?GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
?GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
?/* 配置喚醒源為 GPIO - PB4 */
?GPIOB_ITModeCfg( CtrKey, GPIO_ITMode_FallEdge );??????? // 下降沿喚醒
?NVIC_EnableIRQ( GPIO_IRQn );
?PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE );//喚醒模式GPIO,ALL=全部。USB\ETH\RTC\GPIO\BAT
?SetSysClock( CLK_SOURCE_HSI_32MHz );//選擇 HSI 做時(shí)鐘源
?//LowPower_Halt_1();
?LowPower_Sleep( RB_PWR_RAM14K|RB_PWR_RAM2K );//只保留14+2K SRAM 供電
}
/*******************************************************************************
* Function Name? : SystemWakeup
*******************************************************************************/
void SystemWakeup(void)
{
?//while(!GPIOB_ReadPortPin(CtrKey)){}
/*
使用HSI/5=6.4M睡眠,喚醒時(shí)間大概需要 2048Tsys≈330us
HSE起振一般不超過1.2ms(500us-1200us),所以切換到外部HSE,需要 1.2ms-330us 這個(gè)時(shí)間可以保證HSE足夠穩(wěn)定,一般用于藍(lán)牙
DelayUs()函數(shù)時(shí)基于32M時(shí)鐘的書寫,此時(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(25/5);????????????????????? // 等待穩(wěn)定 1-5us?
?SetSysClock( CLK_SOURCE_HSE_32MHz );
?
?//DelayMs(5);
?SYS_USB_OPEN();
?//SYS_USB_INIT();
?LED_Init();
?LED_SystemSET(1,SYSLED_SWIN,LED_SysCountDefaultS,0xff);
?
}
void GPIO_IRQHandler(void)
{
?NVIC_DisableIRQ( GPIO_IRQn );
? GPIOB_ClearITFlagBit( CtrKey );?
?SystemWakeup();
}