lzh12a3nf 发表于 2023-8-1 22:56

基于APM32F4xx __WFI和__WFE的介绍

本帖最后由 lzh12a3nf 于 2023-8-1 22:57 编辑

1.PMU模块简介
    PMU,全程是Power Management Unit,即电源管理单元。它负责管理和控制设备的电源。通过PMU模块,APM32F4xx可以实现多种低功耗模式,包括待机模式、停机模式以及睡眠模式等。这些模式是的使得设备能够在完全关闭或最小功耗状态下运行,以节约能源并延长电池寿命。


2. 低功耗模式简介
    在系统或者电源复位后,微控制器默认处于Run模式。但当CPU不需要保持运行状态时,可以使用低功耗模式来节省电源。而在切换低功耗模式的过程中,涉及到两个关键的内核命令__WFI和__WFE,将通过下面的章节进行介绍。在低功耗模式中,其分为睡眠模式和深度睡眠模式;其中,在睡眠模式中,内核的工作是停止的,外设的工作是正常运行的。在深度睡眠模式中,其分为停止模式和待机模式。在停止模式中,所有时钟均为停止状态;在待机模式中,内核区域处于掉电状态。如下图:3.__WFI和__WFE简介
    WFI(Wait For Interrupt) 和 WFE(Wait For Event)是在ARM架构中的两个低功耗模式指令。它们主要作用便是让ARM核进入lower-power standby state模式。 3.1 __WFI和__WFE的异同点相同点:   1、让内核进入lower-power standby state模式,其中,中断和事件均可以唤醒内核。
不同点:1、对于__WFI来说,执行该内核命令之后,内核会立刻进入lower-power standby state模式,直到有WFI Wakeup event唤醒事件的发生。2、对于__WFE来说,执行该内核命令之后,不会立刻进入lower-power standby state,会先检查事件锁存器。如果事件锁存器为0,则立刻进入lower-power standby state,并等待WFE Wakeup event唤醒事件的发生;如果为1,该指令会清除事件锁存器,并执行完成。如下图:3.2 __WFI和__WFE的运用通过上面的介绍,本文将基于睡眠模式下,将分别对__WFI和__WFE指令进行运用。首先,我们来看下面的表格。对睡眠模式,如何通过调用__WFI和__WFE的指令进入和退出睡眠模式进行介绍。对于上面的表格,可知,当我们想要进入睡眠模式,可以分别调用__WFI和__WFE指令进入。当进入睡眠模式后,只关闭了内核时钟,对于其他的外设没有影响,因此,本文运用按键,设置外部信号的触发方式来完成此次实验。

3.基于APM32F4xx实现PMU_Sleep关键代码详解
    本文中,使用按键通过使能EINT线,分别从不同的命令中唤醒设备。接下来,
    (1)__WFI        通过配置按键1作为EINT线作为唤醒,接着调用__WFI内核命令进入睡眠模式。        其中,在APM_MINI_PBInit函数中,设置按键允许中断请求,并使能对应外设中断线(在NVIC中使能)。当按下按键1后,外部中断线便会产生和配置一致的边沿,产生中断请求,从而唤醒设备。

    (2)__WFE               通过配置按键1作为EINT线作为唤醒,接着调用__WFE内核命令进入睡眠模式。   
其中,APM_MINI_PBInit函数中,使能EINT线为事件模式,当按键1按下后,外部事件线会产生和配置一直的边沿时,产生1个事件请求脉冲,唤醒内核。    4.基于APM32F4xx的应用案例
上述关于APM32F4 Demo的代码附件,供大家参考。
如有问题,也请大家多多提出,谢谢!





caigang13 发表于 2023-8-2 07:26

差点看成WIFI,低功耗指令现在ARM的M核应该都支持吧。

WEI21 发表于 2023-8-2 08:14

下载来看看

langgq 发表于 2023-8-31 19:49

我也看成WIFI了

tpgf 发表于 2023-9-1 16:46

这两个指令是宏定义的产物是吗

qcliu 发表于 2023-9-1 17:22

除了这两种还有其他的低功耗模式吗

drer 发表于 2023-9-1 17:30

两种不同的睡眠模式的唤醒时间都是多少呢

wiba 发表于 2023-9-1 17:46

我们可以通过关闭一些外设来实现低功耗吗

coshi 发表于 2023-9-1 19:00

请问楼主这两种模式的唤醒源差别大吗?

kxsi 发表于 2023-9-1 20:15

这两种不同的模式之间功耗相差多少呢

lzh12a3nf 发表于 2023-9-3 00:21

tpgf 发表于 2023-9-1 16:46
这两个指令是宏定义的产物是吗

个人理解不完全是,它们不是由宏定义产生,是指令集架构的一部分。但在编译环境中,使用ARM的CMSIS库,是以宏定义来调用这些特殊指令的。

lzh12a3nf 发表于 2023-9-3 00:21

caigang13 发表于 2023-8-2 07:26
差点看成WIFI,低功耗指令现在ARM的M核应该都支持吧。

是的

lzh12a3nf 发表于 2023-9-3 00:22

qcliu 发表于 2023-9-1 17:22
除了这两种还有其他的低功耗模式吗

停止模式,待机模式

lzh12a3nf 发表于 2023-9-3 14:11

coshi 发表于 2023-9-1 19:00
请问楼主这两种模式的唤醒源差别大吗?

比如在两种不同模式下,同样给外部一个脉冲,如果是进入WFI,则要产生中断才能进行唤醒,产生中断时,需要经过中断的处理机制,比如内部判断是哪个中断,获取中断向量表等。如果是进入WFE,是可以不经过中断的,可以通过事件机制唤醒。

lzh12a3nf 发表于 2023-9-3 14:11

caigang13 发表于 2023-8-2 07:26
差点看成WIFI,低功耗指令现在ARM的M核应该都支持吧。

是的

lzh12a3nf 发表于 2023-9-3 14:16

tpgf 发表于 2023-9-1 16:46
这两个指令是宏定义的产物是吗

个人认为不完全是。这两个指令不是由宏定义产生的,是指令集架构的一部分。但这两个指令在编译环境中,使用内联汇编或者使用ARM的CMSIS库,以宏定义的形式来调用这些指令的。比如__WFI(),C语言中看起来是宏,但在CMSIS库中被定义为内联汇编函数,而不是预处理宏

lzh12a3nf 发表于 2023-9-3 15:16

qcliu 发表于 2023-9-1 17:22
除了这两种还有其他的低功耗模式吗

停止模式,待机模式

lzh12a3nf 发表于 2023-9-3 15:17

coshi 发表于 2023-9-1 19:00
请问楼主这两种模式的唤醒源差别大吗?

比如在两种不同模式下,同样给外部一个脉冲,如果是进入WFI,则要产生中断才能进行唤醒,产生中断时,需要经过中断的处理机制,比如内部判断是哪个中断,获取中断向量表等。如果是进入WFE,是可以不经过中断的,可以通过事件机制唤醒。

lzh12a3nf 发表于 2023-9-3 15:18

wiba 发表于 2023-9-1 17:46
我们可以通过关闭一些外设来实现低功耗吗

可以

lzh12a3nf 发表于 2023-9-3 15:19

kxsi 发表于 2023-9-1 20:15
这两种不同的模式之间功耗相差多少呢

WFE指令在空闲时能够提供更低的功耗,因为它能够在没有中断时仍然保持低功耗状态。相比之下,WFI指令需要至少一个中断信号才能让处理器恢复运行,因此可能会消耗更多功耗。
页: [1] 2
查看完整版本: 基于APM32F4xx __WFI和__WFE的介绍