本帖最后由 RISCVLAR 于 2020-12-1 13:42 编辑
CH32V103应用教程——PWR-睡眠模式
本章教程主要讲述如何控制CH32V103进入睡眠模式以及对其进行中断唤醒操作。
1、PWR-睡眠模式简介及相关函数介绍
在系统复位后,微控制器处于正常工作状态(运行模式),此时可以通过降低系统主频或者关闭不用外设时钟或者降低工作外设时钟来节省系统功耗。如果系统不需要工作,可设置系统进入低功耗模式,并通过特定事件让系统跳出此状态。
微控制器目前提供了 3 种低功耗模式,从处理器、外设、电压调节器等的工作差异上分为:
- 睡眠模式:内核停止运行,所有外设(包含内核私有外设)仍在运行。
- 停止模式:停止所有时钟,唤醒后系统继续运行。
- 待机模式:停止所有时钟,唤醒后微控制器复位(电源复位)。
在睡眠模式下,所有的IO引脚都保持他们运行模式下的状态,所有的外设时钟都正常,所以进入睡眠模式前,尽量关闭无用的外设时钟,以减低功耗。该模式唤醒所需时间最短。
进入睡眠模式:配置内核寄存器控制位 SLEEPDEEP=0(PFIC系统控制寄存器(PFIC_SCTLR)位2,SLEEPDEEP,控制系统的低功耗模式:1为deepsleep,0为sleep),电源控制寄存器 PDDS=0,LPDS 决定内部调压器状态,执行WFI或WFE,可选SEVONPEND 和SLEEPONEXIT(可配合CH32V103应用手册第二章PWR章节寄存器描述和第九章中断和事件进行阅读理解)。
退出睡眠模式:任意中断或者唤醒事件。
关于WFI和WFE方式:
WFI:微控制器被具有中断控制器响应的中断源唤醒,系统唤醒后,将最先执行中断服务函数(微控制器复位除外)。
WFE:唤醒事件触发微控制器将退出低功耗模式。唤醒事件包括:
(1)配置一个外部或内部的 EXTI 线为时间模式,此时无需配置中断控制器;
(2)或者配置某个中断源,等效为 WFI 唤醒,系统优先执行中断服务函数;
(3)或者配置 SLEEPONPEN 位,开启外设中断使能,但不开启中断控制器中的中断使能,系统唤醒后需要清除中断挂起位。
关于SLEEPONEXIT(PFIC系统控制寄存器PFIC_SCTLR位1,控制离开中断服务程序后,系统状态。1:系统进入低功耗模式;0:系统进入主程序)和SEVONPEND(PFIC系统控制寄存器PFIC_SCTLR位4),可配合CH32V103应用手册第九章中断和事件寄存器描述进行阅读理解:
SLEEPONEXIT:启用:执行 WFI 或 WFE 指令后,微控制器确保所有待处理的中断服务退出后进入低功耗模式。
不启用:执行 WFI 或 WFE 指令后,微控制器立即进入低功耗模式 。
SEVONPEND:启用:所有中断或者唤醒事件都可以唤醒通过执行WFE进入的低功耗。
不启用:只有在中断控制器中使能的中断或者唤醒事件可以唤醒通过执行 WFE 进入的低功耗。
关于CH32V103 PWR睡眠模式具体信息,可参考CH32V103应用手册。CH32V103 PWR标准库函数具体内容如下:
void PWR_DeInit(void);
void PWR_BackupAccessCmd(FunctionalState NewState);
void PWR_PVDCmd(FunctionalState NewState);
void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel);
void PWR_WakeUpPinCmd(FunctionalState NewState);
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);
void PWR_EnterSTANDBYMode(void);
FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);
void PWR_ClearFlag(uint32_t PWR_FLAG);
1.1、void PWR_DeInit(void)
功 能:将PWR外围寄存器初始化为其默认重置值。
输 入:无
1.2、void PWR_BackupAccessCmd(FunctionalState NewState)
功 能:启用或禁用对RTC和备份寄存器的访问。
输 入:NewState:访问RTC和备份寄存器的新状态,此参数可以是:ENABLE或DISABLE。
1.3、void PWR_PVDCmd(FunctionalState NewState)
功 能:启用或禁用电源电压检测器(PVD)。
输 入:新状态:PVD的新状态(启用或禁用)。
1.4、void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel)
功 能:配置电源电压检测器(PVD)检测到的电压阈值。
输 入:PWR_PVDLevel:指定PVD检测级别
1.5、void PWR_WakeUpPinCmd(FunctionalState NewState)
功 能:启用或禁用唤醒引脚功能。
输 入:NewState:唤醒引脚功能的新状态(启用或禁用)。
1.6、void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
功 能:进入停止模式。
输 入:PWR_Regulator:指定在停止模式下的调节器状态。PWR_STOPEntry:指定停止模式是否与WFI或WFE指令一起进入。
1.7、void PWR_EnterSTANDBYMode(void)
功 能:进入待机模式。
输 入:无
1.8、FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG)
功 能:检查是否设置了指定的PWR标志。
输 入:PWR_FLAG:指定要检查的标志。
1.9、void PWR_ClearFlag(uint32_t PWR_FLAG)
功 能:清除PWR的挂起标志。
输 入:PWR_FLAG:指定要清除的标志。
使用以上函数时,在程序中直接进行调用即可。
2、硬件设计
单片机进入睡眠模式之后,需要对其进行中断唤醒,此时将开发板PA0引脚与3.3V引脚连接即可进行中断唤醒。
3、软件设计
本章教程在第四章EXTI基础上进行单片机睡眠模式唤醒,通过PA0接GND进入中断对睡眠模式进行唤醒,关于EXTI部分程序在此不再介绍,主要介绍如何进入睡眠模式并对其进行中断唤醒,其具体程序如下:
main.c文件
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
USART_Printf_Init(115200);
EXTI0_INT_INIT();
printf("SystemClk:%d\r\n",SystemCoreClock);
printf("Sleep Mode Test\r\n");
printf("\r\n ********** \r\n");
__WFI(); //进入睡眠模式同时等待中断唤醒
printf("\r\n ########## \r\n");
while(1)
{
Delay_Ms(1000);
printf("Run in main\r\n");
}
}
main.c文件主要包含相关知识信息打印以及进入睡眠模式和唤醒指令。
4、下载验证
将编译好的程序下载到开发板并复位,串口打印情况具体如下:
由上图可知,单片机进入睡眠模式,将PA0引脚与3.3V引脚连接,串口打印如下:
由上图可知,睡眠模式被中断唤醒,程序运行。
|