24 LPM 低功耗贪睡模式

开发板官网(https://www.edevkit.com/)
本系列教程目录:
- 瑞萨单片机开发教程[一] e2-studio + DAP LINK开发环境搭建
- 瑞萨单片机开发教程[二] Keil/RASC开发环境搭建
- 瑞萨单片机开发教程[三] 新建RASC工程
- 瑞萨单片机开发教程[四] GPIO输出——led实验
- 瑞萨单片机开发教程[五] GPIO输入——按键key实验
- 瑞萨单片机开发教程[六] ICU外部中断实验
- 瑞萨单片机开发教程[七] SCI UART串口通信实验
- 瑞萨单片机开发教程[八] DMAC 串口数据传输实验
- 瑞萨单片机开发教程[九] ADC 电压采集实验
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 模块。

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

- 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 不再运行,观察现象。
- 打开低功耗模块
R_LPM_Open(sleep.p_ctrl, sleep.p_cfg);
- 进入低功耗模式
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 运行有波形:

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