跳到主要内容

25 LPM 低功耗深度软件待机模式

在这里插入图片描述

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

本系列教程目录:


LPM 低功耗深度软件待机模式实验

本章目标:

  • 了解 RA6M5 处理器的低功耗及其工作原理;
  • 学会使用 RASC 配置低功耗深度软件待机模式、使用 API 函数;

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

软件设计

新建工程

复制一份"24 LPM_Snooze_Mode"并修改文件夹名为"25 LPM_Deep_Standby_Mode",双击打开"EBF_RA6M5.uvprojx"工程,通过 Keil 的新建文件新建"lpm_deep.c"和"lpm_deep.h",保存到工程目录下的 \\src 文件夹下。

FSP 配置

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

添加 LPM Stack 模块。

插图01

设置 IWDT 属性

设置名称和深度待机模式。

插图02

下一步在“Deep Standby Options”设置“Cancel Source”和“Cancel Edges”。

选择配置的按键中断 irq9 和 irq10,edges 选择 irq9 的下降沿。

插图03

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

程序设计

设计程序,配置 irq9 和 irq10 两个中断,在程序初始化后检测深度唤醒的中断源,打印到串口,LED 亮 3s 后进入循环,执行测试函数,LED 闪烁两次后进入深度待机模式,等待中断唤醒,按下按键中断唤醒程序,观察现象。

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

程序编写

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

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

//检测唤醒中断源
void lpm_deep_standby_restart_detection(void);

//深度待机模式测试
void lpm_deep_standby_led_test(void);

#endif

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

#include "lpm_deep.h"
#include "led.h"
#include "stdio.h"

//唤醒重启检测中断源
void lpm_deep_standby_restart_detection(void)
{
R_BSP_PinAccessEnable();

if (1U == R_SYSTEM->RSTSR0_b.DPSRSTF)
{
//从深度软件待机模式唤醒后清除IOkeep位
R_LPM_IoKeepClear (NULL);

//清除唤醒标志位
R_SYSTEM->RSTSR0_b.DPSRSTF = 0;

//判断唤醒源是IRQ-9还是IRQ-10
if (R_SYSTEM->DPSIFR1 >> 1 & 0x01U)
{
printf("mcu waken from IRQ-9\r\n");
}
else if (R_SYSTEM->DPSIFR1 >> 2 & 0x01U)
{
printf("mcu waken from IRQ-10\r\n");
}
}
}

//深度软件待机模式测试
void lpm_deep_standby_led_test(void)
{
//闪烁两次
LED1_ON();
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED1_OFF();
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED1_ON();
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED1_OFF();

printf("mcu enter deep standby mode\r\n");

R_LPM_Open(g_deep.p_ctrl, g_deep.p_cfg);

//这一句开始进入深度待机模式,后面的代码将不会执行,中断唤醒也会重启运行
R_LPM_LowPowerModeEnter(g_deep.p_ctrl);

//这一句将不会运行到,
printf("mcu exit deep standby mode\r\n");
}

hal_entry.c 文件中添加头文件 lpm_deep.h

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

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

//检测唤醒重启的中断源
lpm_deep_standby_restart_detection();

LED1_ON();
R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_SECONDS);

while(1)
{

//进入深度软件待机
lpm_deep_standby_led_test();

}


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

下载验证

连接下载器,将程序编译并下载到开发板之后,重新上电复位开发板,程序启动初始化完。

初始化后执行中断源检测函数,LED 灯亮 3s 后,进入循环,LED 闪烁两次后串口打印“mcu enter deep standby mode”,进入深度待机模式,等待中断唤醒,后面的代码将不会执行。按下按键,中断唤醒后程序重启重头开始运行,打印检测到的中断源。

插图04