代码附上,
官方例程抄的
不知道这样写有没有问题
Shutdown模式貌似没有问题,正常睡眠,正常唤醒。
但是Sleep模式唤醒之后,第2次睡眠唤醒后必出错
没有使用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 做时钟源
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 做时钟源
//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睡眠,唤醒时间大概需要 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(25/5); // 等待稳定 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();
}