跳到主要内容

24 LPM 低功耗贪睡模式

在这里插入图片描述

开发板官网https://www.edevkit.com/)

本系列教程目录:


LPM 低功耗贪睡模式实验

本章目标:

  • 了解 RA6M5 处理器的低功耗及其工作原理;
  • 学会使用 RASC 配置低功耗贪睡模式、使用 API 函数;

硬件设计

(略,参见配套硬件原理图)

软件设计

新建工程

复制一份“21 LPM_SoftwareStandby_Mode”并修改文件夹名为“21 LPM_Snooze_Mode”,双击打开“EBF_RA6M5.uvprojx”工程,通过 Keil 的新建文件新建“lpm_snooze.c”和“lpm_snooze.h”,保存到工程目录下的 \src 文件夹下,另外需要 GPT 输出 PWM 验证实验现象,参考 GPT 实验例程。

FSP 配置

Keil 界面选择“Tools”→“RA Smart Configurator”打开 RASC 界面。

添加 LPM Stack 模块。

插图01

设置 LPM 属性

设置名称和贪睡模式,在“wake sources”选择唤醒中断。

插图02

  • Standby Limit:待机限制,如果配置为 Enabled,只能使用 R_LPM_LowPowerModeEnter 进入待机模式。
  • Low Power Mode:低功耗模式选择,可选:
    • 睡眠模式(Sleep mode)
    • 软件待机模式(Software standby mode)
    • 贪睡模式(Snooze mode)
    • 深度软件待机模式(Software standby mode)
  • Output port state in standby and deep standby:选择待机期间输出引脚的状态,适用于地址输出、数据输出等总线控制输出引脚。
    • 选择 No change 则不改变输出引脚状态
    • 选择 High impedance state 则输出引脚为高阻态

配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击“Generate Project Content”按钮,让软件自动生成配置代码即可。

程序设计

设计程序,配置 irq9 和 irq10 两个中断,一个 GPT PWM 输出,irq9 用于从贪睡模式唤醒,irq10 用于进入贪睡模式,初始化贪睡模式后默认是进入软件待机模式,需要通过 irq10 中断触发进入贪睡模式,GPT PWM 能在贪睡模式下运行,唤醒退出后,GPT PWM 不再运行,观察现象。

  1. 打开低功耗模块
R_LPM_Open(sleep.p_ctrl, sleep.p_cfg);
  1. 进入低功耗模式
R_LPM_LowPowerModeEnter(sleep.p_ctrl);

程序编写

lpm_snooze.h 头文件里定义初始化函数、测试函数。

#ifndef __BSP_LPM_SNOOZE_H
#define __BSP_LPM_SNOOZE_H
#include "hal_data.h"

void lpm_snooze_Init(void);

void lpm_snooze_led_test(void);

#endif

lpm_snooze.c 里实现初始化函数、测试函数。

#include "lpm_snooze.h"
#include "led.h"
#include "stdio.h"

//初始化
void lpm_snooze_Init(void)
{
R_BSP_PinAccessEnable();
R_LPM_Open(g_snooze.p_ctrl, g_snooze.p_cfg);
}

//贪睡模式测试
void lpm_snooze_led_test(void)
{
LED1_TOGGLE();

printf(" mcu enter Snooze mode\r\n");

R_LPM_LowPowerModeEnter(g_snooze.p_ctrl);

printf(" mcu exit Snooze mode\r\n");
}

hal_entry.c 文件中添加头文件 lpm_snooze.h,在 hal_entry 入口函数中初始化。

void hal_entry(void)
{
/* TODO: add your own code here */

led_Init();
uart0_Init();
key_IRQ_Init();
gpt_PWM_Init();

lpm_snooze_Init();

LED1_ON();
R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_SECONDS);

while(1)
{

lpm_snooze_led_test();

}


#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

下载验证

连接下载器,将程序编译并下载到开发板之后,重新上电复位开发板,程序启动初始化完成后,观察实验结果。示波器接入 PWM 引脚查看波形。

LED 灯亮 3s 后,串口打印“mcu enter Snooze mode”,进入软件待机模式,待机模式下 GPT 不运行,看不到波形,按下 irq10 按键,进入贪睡模式,GPT 开始运行可以看到波形,按下 irq9 按键,唤醒程序进入软件待机模式,GPT 不再运行;

进入贪睡模式,GPT 运行有波形:

插图03

退出贪睡模式,GPT 不运行没有波形:

插图04