我是靠谱客的博主 满意彩虹,最近开发中收集的这篇文章主要介绍STM32 低功耗睡眠模式(SLEEP)中断(INTERRUPT)唤醒实现及优化STM32 低功耗睡眠模式(SLEEP)中断(INTERRUPT)唤醒实现及优化,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

STM32 低功耗睡眠模式(SLEEP)中断(INTERRUPT)唤醒实现及优化

1. 介绍

STM32具有多种低功耗模式,当前以STM32L4系列的低功耗模式最为丰富,此处基于STM32L476和STM32CUBEIDE环境介绍睡眠模式(SLEEP)中断唤醒的实现(HAL库), 唤醒中断可为任一中断,本例以管脚中断为中断源。SLEEP模式只是停止CPU时钟和后续代码执行,唤醒(其实是continue的作用)后继续执行后面的代码,而不是重启之后从初始代码开始执行。

2. 低功耗模式

STM32L4的低功耗模式,包括传统的睡眠模式:
在这里插入图片描述
STM32L4系列各种低功耗模式的特性总结如下:
在这里插入图片描述

3. 管脚中断配置

STOP模式可以通过任一管脚中断(Interrupt)或事件(Event)的方式唤醒,这里介绍通用管脚中断唤醒的方式, 选择一个GPIO管脚进行配置,这里用PC13作为唤醒源。
设置PC13为GPIO_EXTI方式:
在这里插入图片描述
为PC13选择其中一种中断触发方式,包括上升沿触发,下降沿触发和电平变化触发(即上升沿下降沿都触发):
在这里插入图片描述
然后使能中断:
在这里插入图片描述
保存后生成代码:
在这里插入图片描述

4. SLEEP模式进入及中断唤醒

通过HAL库函数HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)可进入SLEEP模式,库函数有两个参数,第一个参数Regulator可选PWR_MAINREGULATOR_ON或PWR_LOWPOWERREGULATOR_ON,分别对应主电源保持打开和低功耗部分的电源保持打开。第二个参数SLEEPEntry指定唤醒时的来源,有两个可选:PWR_SLEEPENTRY_WFI 和 PWR_SLEEPENTRY_WFE, 分别对应中断唤醒和事件唤醒,这里我们用PWR_SLEEPENTRY_WFI,即中断唤醒。

如果要进入SLEEP模式,实施下面代码:

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);

HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);

然后当PC13管脚上产生电平变化触发管脚中断,睡眠状态就会被唤醒,继续给CPU供应时钟,执行后面的代码。

5. SLEEP模式进入及中断唤醒的优化

当设计中存在多种中断源,包括调试器中断和其它管脚中断时,这些中断不是想用于唤醒SLEEP状态的中断,此时就需要增加必要的设计,实现:

  1. 当指定的中断源产生中断时,唤醒SLEEP状态;
  2. 当非指定的中断源产生中断唤醒SLEEP后,立即重新进入SLEEP模式。

实现方式如下,先增加一个判断变量flag_recog:

uint8_t flag_recog = 0;

在进入SLEEP模式时,采用如下代码:

flag_recog = 0;
while(flag_recog == 0) HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);

flag_recog = 0;
while(flag_recog == 0) HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);

这样,当异常中断引起唤醒时,因为flag_recog保持为0,所以会再次执行进入SLEEP模式的代码。

当指定的唤醒中断到来时,如这里的PC13,则修改中断处理函数为:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if (GPIO_Pin==GPIO_PIN_13)
	{
		flag_recog = 1;
	}
}

从而在中断处理函数里将flag_recog设置为非0,在退出中断处理函数后,也会退出while(flag_recog == 0)的循环,执行后面的代码。

通过以上优化,提高了SLEEP低功耗模式应用的可靠性,避免异常时间的唤醒。

–End–

最后

以上就是满意彩虹为你收集整理的STM32 低功耗睡眠模式(SLEEP)中断(INTERRUPT)唤醒实现及优化STM32 低功耗睡眠模式(SLEEP)中断(INTERRUPT)唤醒实现及优化的全部内容,希望文章能够帮你解决STM32 低功耗睡眠模式(SLEEP)中断(INTERRUPT)唤醒实现及优化STM32 低功耗睡眠模式(SLEEP)中断(INTERRUPT)唤醒实现及优化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部