69 lines
2.0 KiB
C
69 lines
2.0 KiB
C
#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);
|
||
|
||
}
|