PY32F003F18之Stop模式

一、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模式唤醒时间

PY32F003F18之Stop模式_第1张图片

 在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");
  }
}

你可能感兴趣的:(产品研发,PY32F003F18P,嵌入式硬件,HAL库,单片机,低功耗,经验分享)