低功耗

低功耗

目录

低功耗

STM32中的电源系统

STM32 中的低功耗

相关代码


-- 首先我们先看我们做的项目如何降低功耗

-- 对于设备,功耗怎么降低?把设备上所有的电子模块,都进入低功耗模式。

对于空气质量检测仪,如何降低功耗:

  • 1、 屏幕可以息屏
  • 2、 DHT11采集数据之后,就进入休眠模式
  • 3、 Kqm6600有一个引脚,可以让模块进入休眠模式
  • 4、 Suo3t长时间无操作,自动进入休眠模式
  • 5、 单片机
    (STM32L系列—>专门用于低功耗的系列),那么为什么我们不用L系列,而用F系列呢?因为低功耗系列就会导致性能和功能有所降低。

那么F系列的单片机如何降低功耗?

  • 1、降低CPU的主频 -- 可能会导致程序运行速度变慢

alt text

可以更改CPU的主频,目前是最高的72MHz,可以降低到最高48MHz,甚至更低,但是降低主频的同时,功耗也会降低,整个程序的运行速度会变慢,可能会导致一些问题。

  • 2、将不必要的片上外设,关闭,以及对应的时钟也关闭
  • 3、设备可以设置低功耗模式,

-- 注:但是降低功耗的同时会导致性能及功能的降低,所以要在保证功能的基础上降低功耗。


-- 模块低功耗,我们已经知道了,接下来就说一下单片机自身如何实现低功耗

STM32中的电源系统

-- 首先我们应该了解单片机内部的电源

alt text

alt text

ADC 电源及参考电压(VDDA供电区域)。为了提高转换精度, STM32 的 ADC 配有独立的电源接口,方便进行单独的滤波。ADC 的工作电源使用 VDDA引脚输入,使用 VSSA作为独立的地连接, VREF引脚则为 ADC 提供测量使用的参考电压。

调压器供电电路(VDD/1.8V 供电区域)。在 STM32 的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及 RAM,调压器的输出电压约为 1.8V,因而使用调压器供电的这些电路区域被称为 1.8V 域。调压器可以运行在“运行模式”、“停止模式”以及“待机模式”。在运行模式下, 1.8V 域全功率运行;在停止模式下 1.8V 域运行在低功耗状态, 1.8V 区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及SRAM 的内容;在待机模式下,整个 1.8V 域都断电,该区域的内核寄存器及SRAM 内容都会丢失(备份区域的寄存器不受影响)。

备份域电路(后备供电区域)。STM32 的 LSE 振荡器、 RTC 及备份寄存器这些器件被包含进备份域电路中,这部分的电路可以通过 STM32 的 VBAT 引脚获取供电电源,在实际应用中一般会使用 3V 的钮扣电池对该引脚供电.

alt text

STM32 中的低功耗

按功耗由高到低排列, STM32 具有运行、睡眠、停止和待机四种工作模式。上电复位后 STM32 处于运行 状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不 同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。

-- 由此可以看出,单片机的低功耗主要是睡眠,停止,待机三种模式,那么他们的区别是什么呢?

alt text

-- 什么叫做单片机指令,如何区分是单片机的指令,前面有两个“__“的指令就是单片机指令,例如

alt text

-- 1、睡眠模式

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设, CM3 核心的外设全都还照常运行。
有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是 WFI(wait for interrupt)和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。 

alt text

-- 2、停止模式

在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分 电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次 停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒,在停止模式中可以选择电压调节器为开模 式或低功耗模式。 

alt text

-- 3、待机模式

待机模式,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后, 由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot 条件,从头开始执行程序。它有四种唤醒方式, 分别是 WKUP(PA0)引脚的上升沿, RTC 闹钟事件, NRST 引脚的复位和 IWDG(独立看门狗)复位。 

alt text

相关代码

-- 可以参考官方代码

-- 1、睡眠模式

  • 我们了解到进入各种低功耗模式时都需要调用 WFI 或 WFE 命令,它们实质上都是内核指令,在库文件 core_cm3.h 中把这些指令封装成了函数,

alt text

 

alt text

!!!注:开exti中断(唤醒的条件),把其他中断关了(以防影响实验结果),串口中断只要不发数据不会触发(所以可以开着)


    usart_init();
	exti_init();


	//睡眠模式
	printf("进入睡眠模式AAAA\r\n");
	__WFI();//进入睡眠模式	//执行的结果应该是不会执行以下代码,直到有中断唤醒
	printf("进入睡眠模式BBBB\r\n");

-- 效果图 

alt text

-- 2、停止模式

  • 直接调用 WFI 和 WFE 指令可以进入睡眠模式,而进入停止模式则还需要在调用指令前设置一些寄存器位, STM32 标准库把这部分的操作封装到 PWR_EnterSTOPMode 函数中了。 

    alt text

这个函数有两个输入参数,分别用于控制调压器的模式及选择使用 WFI 或 WFE 停止,代码中先是根据调 压器的模式配置 PWR_CR 寄存器,再把内核寄存器的 SLEEPDEEP 位置 1,这样再调用 WFI 或 WFE 命令时, STM32 就不是睡眠,而是进入停止模式了。函数结尾处的语句用于复位 SLEEPDEEP 位的状态,由于它是在 WFI 及 WFE 指令之后的,所以这部分代码是在 STM32 被唤醒的时候才会执行。
要注意的是进入停止模式后, STM32 的所有 I/O 都保持在停止前的状态,而当它被唤醒时, STM32 使用 HSI 作为系统时钟(8MHz)运行,由于系统时钟会影响很多外设的工作状态,所以一般我们在唤醒后会重新开启 HSE,把系统时钟设置回原来的状态。

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	usart_init();
	exti_init();
	key_init();

    printf("ABC %d %s\r\n", 20, "CBA");
    printf("ABC %d %s\r\n", 20, "CBA");
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
    SystemInit();//必须要加
    
    
    printf("ABC %d %s\r\n", 20, "CBA");
    printf("ABC %d %s\r\n", 20, "CBA");
    printf("ABC %d %s\r\n", 20, "CBA");

-- 3、待机模式

  • 类似地, STM32 标准库也提供了控制进入待机模式的函数:PWR_EnterSTANDBYMode

alt text

该函数中先配置了 PDDS 寄存器位及 SLEEPDEEP 寄存器位,接着调用__force_stores 函数确保存储操作完 毕后再调用 WFI 指令,从而进入待机模式。这里值得注意的是,待机模式也可以使用 WFE 指令进入的,如果 您有需要可以自行修改。在进入待机模式后,除了被使能了的用于唤醒的 I/O,其余 I/O 都进入高阻态,而从待 机模式唤醒后,相当于复位 STM32 芯片,程序重新从头开始执行。

alt text




    void System_EnterStandby(void)
    {
        //进入待机模式先设置唤醒方式 --- WKUP
        PWR_ClearFlag(PWR_FLAG_WU);
        PWR_WakeUpPinCmd(ENABLE);		//使能唤醒引脚
        PWR_EnterSTANDBYMode();
    }

    main函数中
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	//pwm_init();
	//dht11_init();
	//SysTick_Config(72000);
	usart_init();

    SysTick_Config(72000);
	printf("ABC %d %s\r\n", 20, "CBA");
	printf("ABC %d %s\r\n", 20, "CBA");
	System_EnterStandby();
	printf("ABC %d %s\r\n", 20, "CBA");
	printf("ABC %d %s\r\n", 20, "CBA");
	printf("ABC %d %s\r\n", 20, "CBA");
	//待机模式,重新唤醒后,类似于复位,就会从头执行,每次都打印两句话
	//再次点击下载程序时,就下载不进去了,因为进入待机模式了,什么都关了
	//首先按住板子的复位按键,然后点击下载,按大概0.5s,就可以了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值