主控芯片STM32L053R8T6;这次项目使用了低功耗,所以选择了STOP模式,使用外部中断和LPUART中断进行唤醒,STOP期间使用LPTIM进行喂狗,刚开始上电后一切正常,白天有触发信号唤醒再次STOP后也正常,但是一夜通电后,夜里没有触发信号,第二天一早无法唤醒。低功耗代码部分如下:
我做了个状态机,之前没做的时候STOP无法唤醒更为频繁,[C] 纯文本查看 复制代码
void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
HAL_IWDG_Refresh(&hiwdg);//喂狗
}
//进入STOP前的准备
void Ready_StopMode(void)
{
HAL_SuspendTick();//暂停滴答定时器
HAL_LCD_DeInit(&hlcd);//失能LCD
//允许外部中断唤醒
HAL_PWREx_EnableFastWakeUp();//使能快速唤醒 FWU = 1(配合ULP = 1 使用,忽略退出低功耗模式VREFINT启动时间时)
HAL_LPTIM_TimeOut_Start_IT(&hlptim1, 1000,1000);//启动LPTIM IT
//HAL_LPTIM_TimeOut_Stop_IT(&hlptim1);//停止中断
//--------------
HALL_POWER_CLOSE; //关闭电源霍尔开关
HAL_UARTEx_EnableStopMode(&hlpuart1);//允许串口在停止模式唤醒
STOP_STATE=STOP_MODE_ENTER;//更改模式,为下一步做准备
//-------------------------
}
//STOP唤醒准备
void Wakeup_StopMode(void)
{
// WIRE_MODE_SEND;//无线模式为发送模式,否则第一次唤醒发送不能正常
// HALL_POWER_OPEN; //关闭电源霍尔开关
SystemClock_Config();//初始化时钟
HAL_LCD_Init(&hlcd);//使能LCD
HAL_ResumeTick();//恢复滴答定时器
Disp_Power();//刷新电池图标
HAL_LPTIM_TimeOut_Stop_IT(&hlptim1);//停止LPTIM中断
if(SYS_STATE==DISABLE)//关机状态
{
//Spray_SysOFF();不用做初始化,默认GPIO是输入模式
LCDMENU=PAGE_SHUTDOWN;//显示关机
Disp_OFFSTATE();//显示关机
HAL_LCD_UpdateDisplayRequest(&hlcd);//刷新显示,关机状态下不会刷新显示
}
else if(SYS_STATE==ENABLE)
{
Disp_SenState();//刷新传感器对应图标
Disp_SprayState();
/*
if(VOICE_STATE==ENABLE)
{
Disp_SenTouch();
}
else
{
Clear_SenTouch();
}*/
}
//----------------
//HALL_POWER_OPEN; //关闭电源霍尔开关
//-----------------
STOP_STATE=STOP_MODE_NONE;
}
//打断
void Break_Stop(void)
{
TIMERCNT_STOP=0;//清除计数器
if(STOP_STATE!=STOP_MODE_NONE)//如果不在运行状态
{
STOP_STATE=STOP_MODE_WAKEUP;//执行唤醒步骤
}
}
然后主循环while(1)里调用了SPRAY_IDLE函数是这样的:
[C] 纯文本查看 复制代码 void SPRAY_IDLE(void)
{
if(STOP_STATE==STOP_MODE_NONE)//正常工作
{
BSP_IDLE();//执行各种逻辑
}
else if(STOP_STATE==STOP_MODE_READY)//准备进入
{
Ready_StopMode();
}
else if(STOP_STATE==STOP_MODE_ENTER)//在STOP中,为喂狗
{
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);//开启低功耗内核 进入停止模式
}
else if(STOP_STATE==STOP_MODE_WAKEUP)//在唤醒状态
{
Wakeup_StopMode();//执行唤醒初始化
}
}
大致的思路是不工作计时15秒后进入STOP,有信号后唤醒并执行逻辑,LPTIM喂狗唤醒后不操作其他的内容,再次进入STOP模式,但是超过一定时间没有触发信号后,不管什么信号来,都无法再次唤醒,白天在几个小时内有触发信号的话,就一切正常,还烦请大神帮忙看下问题出在哪里,困扰我半个月了,一直没找到问题,先谢谢大神们
|