硬汉嵌入式论坛

 找回密码
 立即注册
查看: 587|回复: 10
收起左侧

[有问必答] 请教关于STM32L053停止模式时间长后无法唤醒的问题

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2023-7-29 08:46:21 | 显示全部楼层 |阅读模式
主控芯片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模式,但是超过一定时间没有触发信号后,不管什么信号来,都无法再次唤醒,白天在几个小时内有触发信号的话,就一切正常,还烦请大神帮忙看下问题出在哪里,困扰我半个月了,一直没找到问题,先谢谢大神们




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-7-29 09:08:17 | 显示全部楼层
程序跑飞了,这个选项有排查没,卡死在某个地方了。LPTIM回调加个IO翻转什么的,方便检测。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-7-29 09:12:48 | 显示全部楼层
eric2013 发表于 2023-7-29 09:08
程序跑飞了,这个选项有排查没,卡死在某个地方了。LPTIM回调加个IO翻转什么的,方便检测。

完全没有思路,程序跑飞怎么测试?上手STM32没多久,没有很深的理解,如果跑飞怎么处理?看门狗没动作啊?跑飞后看门狗不是应该动作么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-7-29 09:37:18 | 显示全部楼层
惠小厨 发表于 2023-7-29 09:12
完全没有思路,程序跑飞怎么测试?上手STM32没多久,没有很深的理解,如果跑飞怎么处理?看门狗没动作啊 ...

你的喂狗是在中断里面喂狗的,会有程序卡死了,中断还正常执行的情况。

函数HAL_LPTIM_CompareMatchCallback里面加个标志,程序里面每次检测到标志变化了,整个IO翻转试试。看看每次都正常执行没。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-7-29 10:04:11 | 显示全部楼层
eric2013 发表于 2023-7-29 09:37
你的喂狗是在中断里面喂狗的,会有程序卡死了,中断还正常执行的情况。

函数HAL_LPTIM_CompareMatchCa ...

收到,谢谢,您的意思是不是程序卡死在中断里了?一直在喂狗,所以导致看门狗没有复位,如果IO不反转了,是不是可以考虑把喂狗程序写在while里,放在 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);之前?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-7-29 10:34:29 | 显示全部楼层
惠小厨 发表于 2023-7-29 10:04
收到,谢谢,您的意思是不是程序卡死在中断里了?一直在喂狗,所以导致看门狗没有复位,如果IO不反转了, ...

卡死在其他中断或者任务程序里面了。

所以你在While里面测试下,看看任务程序在每次LPTIM唤醒后,还能正常执行不。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-8-1 09:26:23 | 显示全部楼层
eric2013 发表于 2023-7-29 10:34
卡死在其他中断或者任务程序里面了。

所以你在While里面测试下,看看任务程序在每次LPTIM唤醒后,还能 ...

我现在把喂狗程序在中断中拿了出来,加在了while(1)里,这样的话狗是起作用了,我上电用串口打个数,发现这样会周期性重启,大概间隔40分钟左右就会被狗咬,如果不加狗,不使用LPTIM唤醒喂狗,就不会出现问题,用按键唤醒的话,多长时间都可以。感觉像是卡死在了LPTIM的中断里,神奇的是在看门狗作用之前,如果收到触发过,时间就会顺延



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-8-2 09:25:06 | 显示全部楼层
惠小厨 发表于 2023-8-1 09:26
我现在把喂狗程序在中断中拿了出来,加在了while(1)里,这样的话狗是起作用了,我上电用串口打个数,发现 ...

LPTIM唤醒后频繁的重新配置系统时钟估计也有点影响,可以考虑测测你的重新配置系统时钟函数,每次都正常配置了没
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-8-2 19:50:37 | 显示全部楼层
eric2013 发表于 2023-8-2 09:25
LPTIM唤醒后频繁的重新配置系统时钟估计也有点影响,可以考虑测测你的重新配置系统时钟函数,每次都正常 ...

我在系统做了状态机,当LPTIM唤醒的时候,不会初始化时钟,使用默认恢复时钟MSI,现在有个情况,主时钟频率越高,重启的周期越长,现在用MSI的2M多的主频,大概10分钟重启,使用8M,40分钟左右,使用PLL32M,大概能稳定1:30秒,这些时长里只用LPTIM唤醒,不初始化任何时钟
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-10-25 08:34:07 | 显示全部楼层
eric2013 发表于 2023-8-2 09:25
LPTIM唤醒后频繁的重新配置系统时钟估计也有点影响,可以考虑测测你的重新配置系统时钟函数,每次都正常 ...

问题已经解决,赶进度所以没有及时更新结果,这段的设计在LPTIM的中断里进行喂狗,程序同时开了一个TIM2的定时器,在进入STOP模式的时候没有关掉,虽然不知道什么具体的原因,在进入STOP模式前,关闭TIM2定时器就不会出现问题了。这样看像卡在了PTIM的定时器中一直喂狗,所以看门狗并未起到作用
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-10-26 07:43:48 | 显示全部楼层
惠小厨 发表于 2023-10-25 08:34
问题已经解决,赶进度所以没有及时更新结果,这段的设计在LPTIM的中断里进行喂狗,程序同时开了一个TIM2 ...

谢谢告知最终原因。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 08:37 , Processed in 0.194719 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表