外部中断 ICU
ICU是中断控制单元Interrupt Controller Unit。
中断控制器单元(ICU)控制着一些事件发出的信号,从而链接到嵌套矢量中断控制器(NVIC)、DMA控制器(DMAC)和数据传输控制器(DTC)模块。ICU还控制着不可屏蔽的中断。 所以可以说围绕着 ICU 的有四个部分:NVIC、DMAC、DTC和NMI。
当中断来临的时候会最先经过IRQ寄存器,IRQ寄存器检测到中断的时候,会向中央处理嵌套向量中断控制器NVIC发送中断信号, 当NVIC检测到中断请求的时候,会将相应的中断服务函数进行挂起。之后将运行的八个寄存器进行压栈,压栈完成之后将中断服务程序进行激活。 之后将原先压栈的寄存器取出,继续运行之前的程序。
电源管理——低功耗模式
在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久, 且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手, 提高设备的续行时间。 因此,RA芯片有专门管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。
RA4M2 支持3种低功耗模式:睡眠模式(Sleep Mode)、软件待机模式(Software Standby Mode)、贪睡模式(Snooze Mode)
配置外部中断
开发板上有三个按键,这次用到P111

打开引脚配置(Pin Configuration)界面。
在左侧 “Pin Selection” 区域,展开 “Input:ICU”,勾选 “ICU0”。

进入外部中断(External IRQ)配置界面。
在 “Module g_external_irq4 External IRQ (r_icu)” 部分,设置 “Name” 为 “g_external_irq4”,“Channel” 为 “4”。
设置 “Callback” 为 “key_external_irq_callback”。

配置低功耗模式
进入堆栈配置界面,点击 “New Stack” 按钮。
在弹出菜单中选择 “Power” -> “Low Power Modes (r_lpm)”,添加低功耗模式堆栈。

选中添加的 “Low Power Modes (r_lpm)” 堆栈,进入其设置界面。
在 “Module g_lpm0 Low Power Modes (r_lpm)” -> “General” 部分,设置 “Low Power Mode” 为 “Deep Software Standby mode”。
在 “Deep Sleep and Standby Options” -> “Wake Sources” 部分,勾选 “IRQ4” 对应的复选框。

软件部分
ICU外部中断
新建文件夹名为irq,在里面新建irq.c和irq.h
irq.c文件内容如下:
#include "irq.h"
#include "hal_data.h"
volatile bool key_pressed = false;
void key_external_irq_callback(external_irq_callback_args_t *p_args)
{
key_pressed = true;
}
void IRQ_Init()
{
R_ICU_ExternalIrqOpen (&g_external_irq4_ctrl, &g_external_irq4_cfg);
R_ICU_ExternalIrqEnable (&g_external_irq4_ctrl);
}
irq.h文件内容如下:
#ifndef IRQ_H_
#define IRQ_H_
#include "hal_data.h"
void IRQ_Init();
extern volatile bool key_pressed;
#endif
低功耗模式
新建文件夹名为lpm,在里面新建lpm.c和lpm.h
lpm.c文件内容如下:
#include <lpm/lpm.h>
#include "hal_data.h"
volatile bool in_LPM = false;
void LPM_Init()
{
R_LPM_Open (&g_lpm0_ctrl, &g_lpm0_cfg);
}
void EnterLowPowerMode()
{
if (!in_LPM)
{
printf ("进入低功耗模式\n");
in_LPM = true;
R_LPM_LowPowerModeEnter (&g_lpm0_ctrl);
}
}
lpm.h文件内容如下:
#ifndef LPM_H_
#define LMP_H_
#include "hal_data.h"
extern volatile bool in_LPM;
void LPM_Init();
void EnterLowPowerMode();
#endif
hal_entry文件
新增两个头文件
#include <irq/irq.h>
#include <lpm/lpm.h>
hal_entry函数如下
void hal_entry(void)
{
UART_Init ();
LPM_Init ();
IRQ_Init ();
printf ("实验04 低功耗待机实验\r\n");
while (1)
{
if (key_pressed == true)
{
key_pressed = false;
if (!in_LPM)
{
EnterLowPowerMode ();
printf ("退出待机模式\n");
}
else
{
in_LPM = false;
}
}
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
实验结果
下载程序,点亮开发板,在供电端接入自制的INA226模块,该模块可读取电压电流和功率数据,并显示在电脑上位机。
从下图记录的数据可以看出,进入低功耗模式后,整板功耗107.5mW,唤醒后113.3mW,也就是说进入低功耗模式后降低了约6mW。

具体的过程请查看顶部演示视频。