#include "../main/SystemInclude.h" void EXTI_PWR_Wakeup_irq_callback(void) { mcuModeSleeping = 0 ;//唤醒mcu并将标志位复位 //NVIC_DisableIRQ(EXTI4_7_IRQn); //printf("deepsleep out"); } static void SetupWakeupSources(PWR_WakeupWay_TypeDef wakeupWay) { if(wakeupWay == PWR_Wakeup_None) return ; if(wakeupWay & PWR_Wakeup_RTC) { } if(wakeupWay & PWR_Wakeup_EXTI) { GPIO_EXTI_Init(GPIO1,GPIO_PIN_7,EXTI_LINE_7,EXTI4_7_IRQn);//设置一个外部exti中断,等待进入中断然后中断清除标志位 Exti_register_irq_callback(EXTI_LINE_7,EXTI_PWR_Wakeup_irq_callback); } if(wakeupWay & PWR_Wakeup_LPTIM1) { } if(wakeupWay & PWR_Wakeup_LPTIM2) { } if(wakeupWay & PWR_Wakeup_IWDG) { } } /** * 执行休眠之前,调用此函数选择具体的休眠模式 * PWR_POWERMODE_t: 5种休眠模式 * PWR_MODE_SLEEP 睡眠模式(Cortex"-M0+内核停止,所有外设包括 Cortex"-M0+核心的外设,如 NVIC、系统时钟(SysTick)等仍在运行) * PWR_MODE_DEEP_SLEEP_1 深度休眠1(除了 32K LSI 和 LSE外,所有的时钟都已停止。不启用 low power LDO) * PWR_MODE_DEEP_SLEEP_2 深度休眠2(除了 32K LSI 和 LSE外,所有的时钟都已停止。启用 low power LDO) * PWR_MODE_SNOOZE ADC小睡模式(ADC 系统独立工作) * PWR_MODE_SHUTDOWN 关断模式(HPLDO 和 LPLDO 均关闭,数字域全部掉电) ***/ void EnterLowPowerModeWFI(PWR_POWERMODE_t mode) { delay_ms(800); // SetupWakeupSources(PWR_Wakeup_EXTI);// PWR_Wakeup_RTC|PWR_Wakeup_EXTI //使用外部中断源唤醒,使用前必须确定该中断可以触发 LHL_PWR_SetPowerMode(mode); LHL_PWR_EnterSleep(); } volatile u32 mcuModeSleeping; //PWR_POWERMODE_t LowPowerMode = PWR_MODE_DEEP_SLEEP_1 ; void LowPowerModeProcess(void) { // if (mcuModeSleeping==0) return ; //进入低功耗 mcuModeSleeping = 0 ; // printf("deepsleep in"); EnterLowPowerModeWFI(PWR_MODE_DEEP_SLEEP_1); // EnterLowPowerModeWFI(PWR_MODE_DEEP_SLEEP_2); // EnterLowPowerModeWFI(PWR_MODE_SNOOZE); // EnterLowPowerModeWFI(PWR_MODE_SHUTDOWN); // EnterLowPowerModeWFI(LowPowerMode); }