打印
[APM32F4]

基于APM32F4xx __WFI和__WFE的介绍

[复制链接]
731|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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的代码附件,供大家参考。
如有问题,也请大家多多提出,谢谢!
PMU_Sleep Demo.rar (11.88 KB)






使用特权

评论回复
沙发
caigang13| | 2023-8-2 07:26 | 只看该作者
差点看成WIFI,低功耗指令现在ARM的M核应该都支持吧。

使用特权

评论回复
板凳
WEI21| | 2023-8-2 08:14 | 只看该作者
下载来看看

使用特权

评论回复
地板
langgq| | 2023-8-31 19:49 | 只看该作者
我也看成WIFI了

使用特权

评论回复
5
tpgf| | 2023-9-1 16:46 | 只看该作者
这两个指令是宏定义的产物是吗

使用特权

评论回复
6
qcliu| | 2023-9-1 17:22 | 只看该作者
除了这两种还有其他的低功耗模式吗

使用特权

评论回复
7
drer| | 2023-9-1 17:30 | 只看该作者
两种不同的睡眠模式的唤醒时间都是多少呢

使用特权

评论回复
8
wiba| | 2023-9-1 17:46 | 只看该作者
我们可以通过关闭一些外设来实现低功耗吗

使用特权

评论回复
9
coshi| | 2023-9-1 19:00 | 只看该作者
请问楼主这两种模式的唤醒源差别大吗?

使用特权

评论回复
10
kxsi| | 2023-9-1 20:15 | 只看该作者
这两种不同的模式之间功耗相差多少呢

使用特权

评论回复
11
lzh12a3nf|  楼主 | 2023-9-3 00:21 | 只看该作者
tpgf 发表于 2023-9-1 16:46
这两个指令是宏定义的产物是吗

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

使用特权

评论回复
12
lzh12a3nf|  楼主 | 2023-9-3 00:21 | 只看该作者
caigang13 发表于 2023-8-2 07:26
差点看成WIFI,低功耗指令现在ARM的M核应该都支持吧。

是的

使用特权

评论回复
13
lzh12a3nf|  楼主 | 2023-9-3 00:22 | 只看该作者
qcliu 发表于 2023-9-1 17:22
除了这两种还有其他的低功耗模式吗

停止模式,待机模式

使用特权

评论回复
14
lzh12a3nf|  楼主 | 2023-9-3 14:11 | 只看该作者
coshi 发表于 2023-9-1 19:00
请问楼主这两种模式的唤醒源差别大吗?

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

使用特权

评论回复
15
lzh12a3nf|  楼主 | 2023-9-3 14:11 | 只看该作者
caigang13 发表于 2023-8-2 07:26
差点看成WIFI,低功耗指令现在ARM的M核应该都支持吧。

是的

使用特权

评论回复
16
lzh12a3nf|  楼主 | 2023-9-3 14:16 | 只看该作者
tpgf 发表于 2023-9-1 16:46
这两个指令是宏定义的产物是吗

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

使用特权

评论回复
17
lzh12a3nf|  楼主 | 2023-9-3 15:16 | 只看该作者
qcliu 发表于 2023-9-1 17:22
除了这两种还有其他的低功耗模式吗

停止模式,待机模式

使用特权

评论回复
18
lzh12a3nf|  楼主 | 2023-9-3 15:17 | 只看该作者
coshi 发表于 2023-9-1 19:00
请问楼主这两种模式的唤醒源差别大吗?

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

使用特权

评论回复
19
lzh12a3nf|  楼主 | 2023-9-3 15:18 | 只看该作者
wiba 发表于 2023-9-1 17:46
我们可以通过关闭一些外设来实现低功耗吗

可以

使用特权

评论回复
20
lzh12a3nf|  楼主 | 2023-9-3 15:19 | 只看该作者
kxsi 发表于 2023-9-1 20:15
这两种不同的模式之间功耗相差多少呢

WFE指令在空闲时能够提供更低的功耗,因为它能够在没有中断时仍然保持低功耗状态。相比之下,WFI指令需要至少一个中断信号才能让处理器恢复运行,因此可能会消耗更多功耗。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

37

帖子

0

粉丝