33.4
实验1:睡眠模式实验
在本次实验中,开发板将会执行一个流水灯任务,执行完毕后控制RA6M5进入睡眠状态,随后用任意的中断将其唤醒,再执行一次流水灯任务,再次控制其进入睡眠状态,如此往复。
33.4.1
硬件设计
将按键Key1以及串口配置为中断源。
33.4.2
软件设计
33.4.2.1
正常模式与睡眠模式的切换框图

在SBYCR(Standby Control Register)寄存器的SSBY(Software Standby Mode Select)位等于0的时候,只需要一个WFI指令就可以进入睡眠模式,任何中断都能将MCU从睡眠模式切换到正常模式。
33.4.2.2
新建工程
对于e2 studio开发环境:拷贝一份我们之前的e2s工程“05_Template”,然后将工程文件夹重命名为“38_LPM_Sleep_Mode”,最后再将它导入到我们的e2 studio工作空间中。
对于Keil开发环境:拷贝一份我们之前的Keil工程“06_Template”,然后将工程文件夹重命名为“38_LPM_Sleep_Mode”,并进入该文件夹里面双击Keil工程文件,打开该工程。
工程新建好之后,我们需要添加LED、按键与串口这三个模块就可以进行我们的实验。添加好的工程文件结构如下。
列表2:文件结构
左右滑动查看完整内容
38_LPM_Sleep_Mode ├─ ...... └─ src ├─ led │ ├─ bsp_led.c │ └─ bsp_led.h ├─ debug_uart │ ├─ bsp_debug_uart.c │ └─ bsp_debug_uart.h ├─ key │ ├─ key.c │ └─ key.h └─ hal_entry.c
33.4.2.3
FSP配置
在Stack中如下图加入LPM模块。

点击可查看大图
在刚刚加入的LPM模块中如下图进行配置,配置极其简单,需要修改的只有Name和Low Power Mode。

点击可查看大图
表3:表38-1:LPM属性描述

点击可查看大图
33.4.2.4
LED流水灯任务
列表3:代码清单38-1:LED流水灯任务
左右滑动查看完整内容
voidLED_Task(void)
{
/* 流水灯任务*/
LED1_ON;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
LED2_ON;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
LED3_ON;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
LED1_OFF;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
LED2_OFF;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
LED3_OFF;
/* 睡眠前打印*/
printf("MCU 进入睡眠模式
");
/* 执行完流水灯任务,进入睡眠模式*/
R_LPM_LowPowerModeEnter(sleep.p_ctrl);
/* 被唤醒后打印*/
printf("MCU 已被唤醒
");
}
这里LED灯依次亮起,随后依次熄灭,全部熄灭后进入睡眠模式,进入睡眠模式前用串口打印信息。
33.4.2.5
按键中断服务函数
列表4:代码清单38-2:按键中断服务函数
左右滑动查看完整内容
/* 按键1 中断回调函数,用于唤醒待机模式*/
voidkey1_irq_callback(external_irq_callback_args_t *p_args)
{
/* 防止编译器产生没有使用形参的警告*/
FSP_PARAMETER_NOT_USED(p_args);
}
在本实验中,按键仅仅用于唤醒MCU,因此不需要在回调函数中放任何代码,只需添加一行“(void)p_args”使用一次回调函数的参数,避免编译器警告即可。
33.4.2.6
hal_entry函数
hal_entry函数非常简单,先初始化外设并打开LPM,随后在while(1)中执行LED_Task函数。
列表5:代码清单38-3:hal_entry函数
左右滑动查看完整内容
voidhal_entry(void)
{
/* TODO: add your own code here */
Debug_UART4_Init(); //初始化debug 串口
IRQ_Init(); //按键中断初始化
R_BSP_PinAccessEnable(); //启用对PFS 寄存器的访问, 因为后面写IO 口都用BSP 内
联函数
R_LPM_Open(sleep.p_ctrl, sleep.p_cfg); //打开LPM
while(1)
{
LED_Task(); //流水灯任务
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
33.4.3
下载验证
下载程序后,用Type-C线连接开发板“USB TO UART”接口跟电脑。本次实验配置了开发板Key1按键的外部中断和串口UART中断,流水灯熄灭即表示MCU已进入睡眠模式。在睡眠模式下,MCU可以被任何中断唤醒,此时按下按键1或者向串口发送任何信息,即可产生中断并唤醒MCU。

点击可查看大图
33.5
实验2:软件待机模式
软件待机模式与睡眠模式相似,但是此时大部分外设是停止工作的,需要指定用于唤醒MCU的中断源,而且只有少量中断源可以用于唤醒。本次实验与实验1基本相同,开发板将会执行一个流水灯任务,执行完毕后进入软件待机模式,随后用我们指定的中断将其唤醒,再执行一次流水灯任务,进入软件待机模式,如此往复。
33.5.1
硬件设计
33.5.1.1
正常模式与软件待机模式的切换框图

点击可查看大图
SBYCR寄存器的SSBY位为1的时候,使用WFI指令即可进入软件待机模式,并通过指定的中断源进行唤醒。
33.5.2
软件设计
33.5.2.1
新建工程
由于我们实验2与实验1基本一致,所以我们可以直接利用刚刚写好的工程进行修改。
对于e2 studio开发环境:拷贝一份我们之前的e2s工程“38_LPM_Sleep_Mode”,然后将工程文件夹重命名为“38_LPM_Software_Standby_Mode”,最后再将它导入到我们的e2 studio工作空间中。
对于Keil开发环境:拷贝一份我们之前的Keil工程“38_LPM_Sleep_Mode”,然后将工程文件夹重命名为“38_LPM_Software_Standby_Mode”,并进入该文件夹里面双击Keil工程文件,打开该工程。
33.5.2.2
FSP配置
如下图所示。主要差别在LPM的属性窗口的配置,只需要配置低功耗的模式为“Software Standby mode”,为了体现软件待机模式与睡眠模式的区别,这里唤醒源只选择使用IRQ9,即Key1的外部中断,与上一节实验所使用中断相同即可。

点击可查看大图
下面是对于Standby Options的属性的具体讲解。
表4:Standby Options属性描述

点击可查看大图
33.5.3
代码
本实验代码与实验1不同的地方只有“printf”打印信息与模块的名称需要修改,其他部分完全相同即可。
33.5.4
下载验证
下载程序后,用Type-C线连接开发板“USB TO UART”接口跟电脑。流水灯熄灭即表示MCU已进入软件待机模式。MCU进入软件待机模式前和唤醒后都会通过串口向调试助手发送对应信息,在本次实验中,我们配置的唤醒源为IRQ9,因此只有按下Key1可以唤醒MCU,我们可以尝试在待机模式下使用其它非指定中断,可以看到MCU是没有任何反应的。

点击可查看大图
注解
在待机模式下,我们是无法向开发板烧写程序的,需要按RES复位或者通过设定的唤醒源将MCU唤醒才能继续烧写程序。注意不要上电复位或者唤醒后瞬间进入软件待机模式,因为这时候只能使用串口烧录了。
全部0条评论
快来发表一下你的评论吧 !