一、VDD电源:
通常VDD来自于VR的输出,为芯片内部主要逻辑电路、SRAM供电。
当MR供电时,VDD来自于MR的输出,输出1.2V。
当进入stop模式时,根据软件配置,VDD可以由MR或者LPR供电,并根据软件配置决定LPR输出是1.2v或者1.0V。
PWR_MAINREGULATOR_ON,CPU使用MR供电,电压为1.2V,MR(Main regulator)在芯片正常运行状态时保持工作。
PWR_LOWPOWERREGULATOR_ON,CPU使用LPR供电,LPR(low power regulator)在stop模式下,提供更低功耗的选择。
二、PY32F003F18的Stop模式唤醒源:
该模式下SRAM和寄存器的内容保持,HSI和HSE关闭,VDD域下大部分模块的时钟都被停掉。
GPIO,PVD,COMP output,RTC和LPTIM可以唤醒stop模式。
IWDG是stop模式的唤醒源,以复位的方式唤醒stop模式。
三、Stop模式唤醒时间
在STOP模式,只能用HSI时钟,不能使用HSE使用,参见"表 5-10 低功耗模式唤醒时间";
注意:若使用HSE外部晶振,则进入Stop模式后,就无法唤醒CPU了。
四、测试程序
#include "StopMode.h"
/*
VDD电源:
通常VDD来自于VR的输出,为芯片内部主要逻辑电路、SRAM供电。
当MR供电时,VDD来自于MR的输出,输出1.2V。
当进入stop模式时,根据软件配置,VDD可以由MR或者LPR供电,并根据软件配置决定LPR输出是1.2v或者1.0v。
PWR_MAINREGULATOR_ON,CPU使用MR供电,MR(Main regulator)在芯片正常运行状态时保持工作。
PWR_LOWPOWERREGULATOR_ON,CPU使用LPR供电,LPR(low power regulator)在stop模式下,提供更低功耗的选择。
在STOP模式,只能用HSI时钟,不能使用HSE使用,参见"表 5-10 低功耗模式唤醒时间"
若使用HSE外部晶振,则进入Stop模式后,就无法唤醒CPU了。
Stop mode:
该模式下SRAM和寄存器的内容保持,HSI和HSE关闭,VDD域下大部分模块的时钟都被停掉。
GPIO,PVD,COMP output,RTC和LPTIM可以唤醒stop模式。
IWDG是stop模式的唤醒源,以复位的方式唤醒stop模式。
*/
void EnterStopMode_With_WFE(void);
void EnterStopMode_With_WFI(void);
void EnterStopMode_With_WFE(void)
{
__HAL_RCC_PWR_CLK_ENABLE();//PWR时钟使能
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
}
void EnterStopMode_With_WFI(void)
{
__HAL_RCC_PWR_CLK_ENABLE();//PWR时钟使能,这一句很重要
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
//PWR_LOWPOWERREGULATOR_ON,CPU使用LPR供电
//LPR(low power regulator)在stop模式下,提供更低功耗的选择。
// HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
//PWR_MAINREGULATOR_ON,CPU使用MR供电
//MR(Main regulator)在芯片正常运行状态时保持工作。
}
#include "py32f0xx_hal.h"
#include "SystemClock.h"
#include "delay.h"
#include "LED.h"
#include "SystemClock.h"
#include "USART2.h"
#include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "EXTI.h"
#include "StopMode.h"
const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
const char CPU_Run_REG[]="\r\nCPU run!\r\n";
int main(void)
{
HSI_Config();
//在STOP模式,只能用HSI时钟,不能使用HSE使用,参见"表 5-10 低功耗模式唤醒时间"
//若使用HSE外部晶振,则进入Stop模式后,就无法唤醒CPU了,因此不使用HSE_Config();
// HAL_Init();//systick初始化
delay_init();
HAL_Delay(1000);
USART2_Init(115200);
//PA0是为USART2_TX,PA1是USART2_RX
//中断优先级为0x01
//波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口
printf("%s",CPU_Reset_REG);
HAL_Delay(1000);
HAL_Delay(1000);
HAL_Delay(1000);
HAL_Delay(1000);
printf("%s",CPU_Run_REG);
EXTI12_Init();//将PA12引脚配置为外部中断引脚
MCU_LED_Init();
// HAL_SuspendTick();//systick中断关闭,防止systick中断唤醒
printf("STOP MODE!\n\n");
EnterStopMode_With_WFE();
// EnterStopMode_With_WFI();
// HAL_ResumeTick();//systick中断开启
printf("WAKEUP OK!\n\n");
while (1)
{
HAL_Delay(500);
MCU_LED_Toggle();
printf("1234567890\r\n");
}
}