12下一页
返回列表 发新帖我要提问本帖赏金: 30.00元(功能说明)

[APM32F1] Standby模式 RTC唤醒与WKUP唤醒

[复制链接]
7196|41
 楼主| Alden 发表于 2023-8-15 14:46 | 显示全部楼层 |阅读模式
本帖最后由 Alden 于 2023-8-24 18:24 编辑

#技术资源# #申请原创#

部分应用中,会有功耗要求,在功耗要求比较高的场景,要提高使用电池供电设备的待机时间。
就需要关闭耗电高的器件、比如LCD屏幕、LED灯等,MCU也可以配置到低功耗状态来进一步降低。

APM32F103系列低功耗模式有三种:睡眠模式、停止模式和待机模式。通过关闭内核、时钟源、设置调压器来降低功耗。
每种低功耗模式的功耗、唤醒启动时间、唤醒方式、唤醒后数据的保存存在差异;功耗越低,唤醒时间越长,唤醒方式越少,唤醒后保存的数据越少,用户可以根据需求选择最合适的低功耗模式。下图是三种低功耗模式的差异

db4288bbcf9739309c6c68e625db724.png


APM32F103系列查看数据手册,可以看到各工作模式下的功耗差异。
根据主频和外设使用情况的不同:
Run mode:19.4~32.9mA
Sleep mode:5.2~21.5mA
Stop mode:20uA左右
Standby mode:4uA左右
可以看到各低功耗模式的功耗差异还是非常大的,特别的是standby模式,可以满足绝大部分低功耗需求。

Standby模式功耗最低,但待机时内核停止工作,外设也停止工作,内核寄存器、内存的数据会丢失。唤醒后相当于程序复位从头开始执行。
唤醒的方式可以通过WKUP 引脚的上升沿, RTC 闹钟、唤醒、入侵事件或 NRST 引脚外部复位及 IWDT

一般常用的就是通过WKUP 引脚或RTC来唤醒MCU。接下来简单测试下这两种方式。
WKUP唤醒的配置比较简单,只需要配置PMU_CSTS的WKUPCFG位即可。
bef74aa02653484e6d489adf83c7a28.png
对应库函数为:    PMU_EnableWakeUpPin();
然后在进入standby前清除唤醒标志位,避免标志位干扰即可:
        PMU_ClearStatusFlag(PMU_FLAG_WUE);
        PMU_EnterSTANDBYMode();


而RTC的唤醒首先需要对RTC进行初始化。
  1. void RTC_Init(void)
  2. {
  3.     if(PMU_ReadStatusFlag(PMU_FLAG_SB) == SET)
  4.     {
  5.         APM_MINI_LEDOn(LED3);

  6.         PMU_ClearStatusFlag(PMU_FLAG_SB);

  7.         RTC_WaitForSynchro();
  8.     }
  9.                
  10.     else
  11.     {
  12.         BAKPR_Reset();

  13.                           RCM_EnableLSI();
  14.         while(RCM_ReadStatusFlag(RCM_FLAG_LSIRDY) == RESET);
  15.         RCM_ConfigRTCCLK(RCM_RTCCLK_LSI);
  16.         RCM_EnableRTCCLK();

  17.         RTC_WaitForSynchro();
  18.                           RTC_ConfigPrescaler(40000);
  19.         RTC_WaitForLastTask();
  20.     }
  21. }
这里使用LSI作为时钟源,Standby唤醒虽然主程序会从头运行,但RTC的配置不受影响,所以根据PMU_CSTS的待机标志,可以不用重复配置RTC,节省初始化时间。
再配置SysTick中断和按键PA1的中断,分别做系统运行闪烁指示和按键进入Standby的判断。
同时在EINT1_IRQHandler中进入standby前,进行RTC闹钟配置,让MCU进standby唤醒3秒后自动唤醒。
  1. void SysTick_Handler(void)
  2. {
  3.     APM_MINI_LEDToggle(LED2);
  4. }

  5. void EINT1_IRQHandler(void)
  6. {
  7.     if(EINT_ReadIntFlag(KEY1_BUTTON_EINT_LINE) != RESET)
  8.     {
  9.         EINT_ClearIntFlag(KEY1_BUTTON_EINT_LINE);
  10.         APM_MINI_LEDOn(LED2);

  11.         RTC_ClearStatusFlag(RTC_FLAG_SEC);
  12.         while(RTC_ReadStatusFlag(RTC_FLAG_SEC) == RESET);

  13.         RTC_ConfigAlarm(RTC_ReadCounter()+ 3);
  14.         RTC_WaitForLastTask();
  15.                                 PMU_ClearStatusFlag(PMU_FLAG_WUE);
  16.         PMU_EnterSTANDBYMode();
  17.     }
  18. }
对应main中进行初始化配置。
  1. int main(void)
  2. {
  3.     RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)(RCM_APB1_PERIPH_PMU | RCM_APB1_PERIPH_BAKR));

  4.     APM_MINI_LEDInit(LED2);
  5.     APM_MINI_LEDInit(LED3);
  6.     APM_MINI_PBInit(BUTTON_KEY1, BUTTON_MODE_EINT);

  7.     APM_MINI_LEDOn(LED2);
  8.     APM_MINI_LEDOff(LED3);

  9.     PMU_EnableWakeUpPin();
  10.     PMU_EnableBackupAccess();

  11.     RTC_Init();

  12.     SysTick_Init();

  13.     while(1)
  14.     {
  15.                           if(PMU_ReadStatusFlag(PMU_FLAG_WUE) == SET)
  16.     {
  17.         APM_MINI_LEDOn(LED3);

  18.     }
  19.                 else
  20.                 {
  21.                         APM_MINI_LEDOff(LED3);
  22.                 }
  23.     }
  24. }
运行效果为:
上电LED2闪烁 ,表示MCU在运行状态。
按下PA1的按键,LED2熄灭,MCU进入standby模式。
3秒后MCU自动唤醒,或者给PA0一个上升沿信号也可以唤醒。
唤醒后,LED2继续闪烁,LED3常亮,表示进入过了standby模式。

而我main中多了一句:
        if(PMU_ReadStatusFlag(PMU_FLAG_WUE) == SET)
    {
        APM_MINI_LEDOn(LED3);
    }

这是为了验证用户手册说的:
aac0e4211784c605aae12984511c6dc.png
实测也是运行状态下,如果PA0也就是WKUP引脚是高电平,这个标志位就会置位,并且由于标志位一直置位,如果保持PA0一直是高电平的状态进入standby,RTC闹钟无法唤醒MCU,需要PA0有个上升沿型号才行。
所以,应用中使用WUKP需要保持空闲状态低电平,需要唤醒时拉高,避免标志位不对。
补充下standby模式下的功耗,只有3uA,还是相当不错的。
839260d1de723392ce0c3546f6ef586.jpg

打赏榜单

21小跑堂 打赏了 30.00 元 2023-08-23
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

@21小跑堂 :补充了低功耗电流哈  发表于 2023-8-24 18:25
基于APM32F103的Standby模式的进入与唤醒,既然测试了低功耗的进入与唤醒,最好可以加测一下低功耗的电流消耗,二姨觉得会更好。  发表于 2023-8-23 16:44
 楼主| Alden 发表于 2023-8-15 14:47 | 显示全部楼层
forgot 发表于 2023-8-30 18:45 来自手机 | 显示全部楼层
不错,好帖
lzbf 发表于 2023-9-5 09:55 | 显示全部楼层
一些单片机还可能具有WKUP(唤醒引脚)功能。
mmbs 发表于 2023-9-5 10:13 | 显示全部楼层
在Standby模式中,RTC可以配置为唤醒触发源。当RTC计时器到达预设的唤醒时间或日期时,它会发出唤醒信号,从而将微控制器从Standby模式唤醒。
cashrwood 发表于 2023-9-5 10:28 | 显示全部楼层
在使用RTC唤醒时,需要为RTC配置一个时间戳,以便在系统被唤醒后能够恢复到正确的时间。
bartonalfred 发表于 2023-9-5 10:39 | 显示全部楼层
WKUP唤醒需要在系统进入Standby模式之前配置外部硬件和相关的唤醒处理程序。
biechedan 发表于 2023-9-5 10:50 | 显示全部楼层
Standby模式是指在设备进入待机状态后,通过Standby模式唤醒设备。在Standby模式下,设备仍然处于休眠状态,但可以接收一些唤醒信号,如WKUP信号,从而被唤醒。
wengh2016 发表于 2023-9-5 11:01 | 显示全部楼层
Standby模式下的功耗非常低, 适用于要求极低功耗的应用场景。
sdlls 发表于 2023-9-5 11:17 | 显示全部楼层
WKUP唤醒方式相对于Standby模式唤醒方式,具有更好的唤醒速度和稳定性。
belindagraham 发表于 2023-9-5 11:27 | 显示全部楼层
在Standby模式下,系统功耗被降至最低,但唤醒时间最短。
mnynt121 发表于 2023-9-5 11:46 | 显示全部楼层
RTC 是一种能够在系统不运行时仍然准确计时的时钟,通常用于实现系统的定时功能或实时任务调度。
updownq 发表于 2023-9-5 12:34 | 显示全部楼层
极低功耗模式,它将关闭大部分系统电路以节省能量
mnynt121 发表于 2023-9-5 12:58 | 显示全部楼层
在RTC中,可以设置一个唤醒时间,到达该时间时,RTC会通过某种方式将系统唤醒。
linfelix 发表于 2023-9-5 13:25 | 显示全部楼层
在进入Standby模式之前,需要配置好RTC闹钟,并在RTC中断向量中断服务程序中,通过读取RTC值判断是否唤醒。如果RTC值匹配设定的闹钟值,那么就会唤醒MCU。
pl202 发表于 2023-9-5 13:46 | 显示全部楼层

RTC 和WKUP 唤醒是两种常见的唤醒方式,用于从待机状态中唤醒设备。
louliana 发表于 2023-9-5 13:58 | 显示全部楼层
配置WKUP引脚为唤醒输入,并选择触发方式(上升沿或下降沿)。
进入低功耗模式(如Standby模式)。
当WKUP引脚检测到触发事件时,系统将自动唤醒。
wengh2016 发表于 2023-9-5 14:29 | 显示全部楼层
适合需要周期性唤醒或按时间表唤醒的应用
lihuami 发表于 2023-9-5 14:53 | 显示全部楼层
RTC唤醒是通过实时时钟中断实现的。在系统进入Standby模式之前,可以配置RTC中断,以便在预定的时间点唤醒系统。RTC唤醒需要配置RTC模块和相关的中断处理程序。
cemaj 发表于 2023-9-5 15:12 | 显示全部楼层
Standby模式下的RTC唤醒和WKUP唤醒都是用于唤醒MCU的方式,但具体使用哪一种唤醒方式,需要根据具体的应用需求和硬件配置来决定。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

115

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部