0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F10x低功耗之待机模式详解

嵌入式技术 ? 来源:嵌入式技术 ? 作者:嵌入式技术 ? 2022-06-08 09:16 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1.待机模式介绍

STM32F10x待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。 PLL、HSI和HSE振荡器也被断电。 SRAM寄存器内容丢失。只有备份的寄存器和待机电路维持供电。
在待机模式下,下列功能需要单独设置:

1.独立看门狗(IWDG):独立看门狗一旦启动,除了系统复位,它不能再被停止。可通过看门狗的键寄存器或硬件选择来启动IWDG。
2.实时时钟(RTC):可通过区域控制寄存器(RCC_BDCR)中的RTCEN位来设置。
3.内部RC振荡器(LSI RC):通过控制/状态寄存器(RCC_CSR)的LSION位来设置。
4.外部低速时钟LSE(32.768KHZ):通过备份域寄存器(RCC_BDCR)的LSEON位设置。

2.待机模式配置

退出待机模式
通过以下方式可退出待机模式:

  • 外部引脚复位引脚(NRST引脚)
  • 看门狗复位(IWDG)
  • WKUP引脚的上升沿触发(PA0)
  • RTC闹钟事件的上升沿触发

从待机模式唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有寄存器被复位;从待机模式唤醒的代码等同于复位重启。
进入待机模式配置步骤
1、设置Cortex?-M3系统控制寄存器中的SLEEPDEEP位(SCB_SCR参考Cortex-M3权威指南182页)。
2、开启PWR时钟(RCC_APB1的PWR位)
3、设置电源控制寄存器(PWR_CR)的PDDS位
4、清除电源控制/状态寄存器(PWR_CSR)中的WUF位
5、等待中断触发唤醒(WFI等待中断或者WFE等待事件)

/************进入待机模式配置***************************
**
**注:使用待机模式若通过KEY_UP触发这需要PWR_CSR的EWUP位
**
*******************************************************/
void SYS_standby_mode(void)
{
	SCB->SCR|=1<<2;//使能SLEEPDEEP位 Cortex-M3权威指南182页	
	RCC->APB1ENR|=1<<28; //使能电源时钟
	PWR->CSR|=1<<8;//设置WKUP唤醒(使用PA0唤醒需要配置)
	PWR->CR|=1<<1;//进入待机模式
	PWR->CR|=1<<2;//清除WUF唤醒位
	WFI_SET();//等待中断触发唤醒
}

WFI等待中断函数

//THUMB指令不支持汇编内联
//采用如下方法实现执行汇编指令WFI,等待下一个外部中断触发
void WFI_SET(void)
{
	__ASM volatile("wfi");		  
}

待机模式唤醒设置

待机模式唤醒通过检测PA0引脚的上升沿信号

/*************待机模式唤醒设置*********************
**唤醒方式:WKUP(PA0)上升沿
**				 RTC闹钟事件的上升沿
**				 NRST引脚上外部复位
**				 IWDG复位
**配置PA0上升沿触发中断
**通过检查PA0,按下3S退出待机模式,未按下进入待机模式
****************************************************/
void SYS_ExitStandyMode(void)
{
	RCC->APB2ENR|=1<<2;//开启PA时钟
	GPIOA->CRL&=0xFFFFFFF0;//清除原来寄存器中的值
	GPIOA->CRL|=0x00000008;//配置为上下拉输入方式
	RCC->APB2ENR|=1<<0;//AFIO
	AFIO->EXTICR[0]&=~(0xf<<0*4);//PA0作为外部中断0输入源	
	EXTI->IMR|=1<<0;//开启EXTI0中断请求
	EXTI->RTSR|=1<<0;//允许EXTI0上升沿触发
	STM32_NVIC_SetPriority(EXTI0_IRQn,1,1);//设置优先级	
	if(WKUP_Check()==0)SYS_standby_mode();	
}

WKUP按键检测函数
判断PA0引脚是否连续按下2S,连续按下2s则进入或退出待机模式。

/****************检测WKUP按键****************/
u8 WKUP_Check(void)
{
	u16 t=0;
	LED2=0;
	while(1)
	{
		if(KEY1)//检测是否按下
		{
			t++;
			Delay_Ms(10);
			if(t>=200)
			{
				LED2=1;
				return 1;
			}
		}
		else 
		{
			LED2=1;
			return 0;
		}
	}
}

主函数实现
1.系统初始化后直接进入待机模式
2.初始化通过RTC配置闹钟中断30s后唤醒
3.通过检测WKUP按键(PA0)持续按下3S后退出待机模式
4.在正常模式下可通过WKUP按键(PA0)持续按下3S进入待机模式或者通过按下KEY2进入待机模式

int main()
{
	u16 cnt=0;
	u8 key=0;
	Beep_Init();
	Led_Init();
	Key_Init();
	Usartx_Init(USART1,115200,72);
	TIMx_Init(TIM2,72,20*1000);
	printf("初始化完成\r\n");
	RTC_Init();//RTC配置
	Delay_Ms(1000);
	Delay_Ms(1000);
	SYS_ExitStandyMode();//待机模式设置
	while(1)
	{
		Delay_Ms(1);
		cnt++;
		if(cnt>=500)
		{
			cnt=0;
			LED1=!LED1;
		}
		key=Key_Scan();
		if(key==2)
		{
			SYS_standby_mode();//按键2按下进待机模式
		}
		if(usart1_flag)
		{
			usart1_rx_buff[usart1_cnt]='\0';
			printf("USART1:%s\r\n",usart1_rx_buff);
			usart1_flag=0;
			usart1_cnt=0;
		}
	}
}

闹钟中断触发唤醒,或者按键触发唤醒

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2295

    文章

    11034

    浏览量

    365958
  • STM32F10x
    +关注

    关注

    1

    文章

    81

    浏览量

    21077
  • 低功耗
    +关注

    关注

    12

    文章

    2829

    浏览量

    105090
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    低功耗单片机工作模式是怎样的?看完这篇你就懂了!

    在物联网、可穿戴设备、智能仪表等领域,低功耗单片机工作模式是设备延长续航能力的核心技术支撑。这类单片机通过精细化的电源管理机制,在保证核心功能运行的前提下,最大限度降低能耗。其工作模式通常分为
    的头像 发表于 07-14 10:39 ?188次阅读
    <b class='flag-5'>低功耗</b>单片机工作<b class='flag-5'>模式</b>是怎样的?看完这篇你就懂了!

    系统待机功耗过高如何破?聚徽分析嵌入式工业平板软件低功耗管理疑难应对

    剖析原因,并制定针对性的低功耗管理策略。本文将围绕嵌入式工业平板软件低功耗管理,为你解答疑难、提供应对方案。 一、待机功耗过高的软件层面成因 (一)驱动程序异常运行 驱动程序作为硬件与
    的头像 发表于 07-01 17:05 ?251次阅读

    【RA4L1-SENSOR】07 低功耗待机模式功耗实测

    从控制功耗入手, 提高设备的续行时间。 因此,RA芯片有专门管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。 RA2L1支持3种低功耗
    发表于 06-20 09:36

    AG32 MCU 如何进入低功耗模式

    ,这里就不赘述了。 4. 自动唤醒(AWU)从低功耗模式 RTC可用于从低功耗模式唤醒MCU,而不依赖于外部中断(自动唤醒模式
    发表于 04-21 11:29

    STM32F103x8 STM32F103xB单片机数据手册

    STM32F103x8STM32F103xB单片机数据手册
    发表于 04-14 14:55 ?2次下载

    使用VL53L1X-SATEL待机功耗远超手册值是怎么回事?

    如文章标题我在使用ST原厂VL53L1X-SATEL时发现待机功耗远超手册值,下图一是板的硬件原理图,下图二是功耗数据,下图三是数据手册关于这个器件的
    发表于 03-10 06:45

    【瑞萨RA2L1入门学习】05、待机模式按键外部中断唤醒 低功耗测试

    模式(Sleep Mode)、软件待机模式(Software Standby Mode)、贪睡模式(Snooze Mode) 2.2.1 睡眠模式
    发表于 01-29 23:08

    EE-334: 利用Blackfin处理器休眠状态实现待机低功耗

    电子发烧友网站提供《EE-334: 利用Blackfin处理器休眠状态实现待机低功耗.pdf》资料免费下载
    发表于 01-08 14:40 ?0次下载
    EE-334: 利用Blackfin处理器休眠状态实现<b class='flag-5'>待机</b><b class='flag-5'>低功耗</b>

    如何使用 UCC28056x 优化离线应用中的效率和待机功耗

    介绍了如何使用 UCC28056x 优化离线应用中的效率和待机功耗,以满足现代产品法规对低待机功耗和高转换效率的要求。
    的头像 发表于 12-17 16:29 ?1721次阅读
    如何使用 UCC28056<b class='flag-5'>x</b> 优化离线应用中的效率和<b class='flag-5'>待机</b><b class='flag-5'>功耗</b>

    如何实现EEPROM的低功耗模式

    内容进行擦除和重写。在许多应用中,尤其是在电池供电的设备中,低功耗模式对于延长设备的使用寿命至关重要。以下是实现EEPROM低功耗模式的一些方法: 1. 选择合适的EEPROM类型 选
    的头像 发表于 12-16 16:54 ?1060次阅读

    做ADS131E08的数据采集,板子是STM32F10X系列的,按技术手册上配置寄存器采集到的数据全为0,为什么?

    现在在做ADS131E08的数据采集,板子是STM32F10X系列的,按技术手册上配置寄存器采集到的数据全为0,有没有参考程序可以参考一下?
    发表于 12-06 07:42

    stm32低功耗设计技巧

    STM32低功耗设计是一个综合性的工作,需要在硬件设计和软件设计两个层面进行综合考虑和优化。以下是一些关键的STM32低功耗设计技巧: 一、硬件设计层面 选择
    的头像 发表于 11-19 15:52 ?1679次阅读

    APM32F10xx进入低功耗模式的问题分析

    近日,在学习APM32开发板关于PMU模块的内容,看到很多内容都是调用WFI内核指令进入低功耗模式,于是自己想尝试调用WFE内核指令进入低功耗模式,但在APM32
    的头像 发表于 10-18 16:13 ?886次阅读
    APM32<b class='flag-5'>F10</b>xx进入<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>的问题分析

    TLV320AIC32x4睡眠和待机模式

    电子发烧友网站提供《TLV320AIC32x4睡眠和待机模式.pdf》资料免费下载
    发表于 10-18 09:43 ?0次下载
    TLV320AIC32<b class='flag-5'>x</b>4睡眠和<b class='flag-5'>待机</b><b class='flag-5'>模式</b>

    【GD32 MCU 移植教程】9、从 STM32F10x 系列移植到 GD32F30x 系列

    GD32F30x 系列 MCU 是基于 Arm? Cortex?-M4 处理器的 32 位通用微控制器,与 STM32F10x 系列 MCU 保持高度兼容。本文主要从以下三个方面进行介绍:硬件资源
    的头像 发表于 09-07 09:57 ?2062次阅读
    【GD32 MCU 移植教程】9、从 <b class='flag-5'>STM32F10x</b> 系列移植到 GD32<b class='flag-5'>F30x</b> 系列