STM32/GD32——电源管理单元PWU

时间:2024-03-14 18:10:22

芯片选型

Ciga Device — GD32F470系列

PWU介绍

PMU全称Power Management Unit,电源管理单元。

电源域

总共有三大电源域,包括VDD / VDDA域,1.2V域和备份域。

VDD/VDDA 域

提供PMU 常规电源供应以下模块的供电:

  • 看门狗
  • 主频晶振
  • 内部晶振
  • ADC和DAC
  • LDO电源转换
  • 上电复位
  • 锁相环
备份域

备份域提供以下供电:

  • 外部低频时钟晶振
  • RTC
  • 上电复位
  • 电源转换
1.2V域

主要提供:

  • AHB高速总线的供电
  • APB外设总线的供电
  • 内存
  • Cortex-M4的供电
节电模式总结

 代码案例

功能需求:

  • 让LED1(引脚PE3) 每间隔一段时间闪烁(500ms)
  • 通过串口切换睡眠模式、深度睡眠模式、待机模式
  • 为KEY1(PA0)配置外部中断按键,按下时恢复
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include <string.h>
#include "main.h"
#include "USART0.h"
#include "EXTI.h"


void EXTI_on_trig(exti_line_enum linex){
	if(linex==EXTI_1){
		printf("key trig\n");
	}
}
void sleep_mode(){ // 睡眠模式
	rcu_periph_clock_enable(RCU_PMU);
	printf("sleep_mode 1 \n");
	pmu_to_sleepmode(WFI_CMD);
	printf("sleep_mode 2 \n");
}

void deep_sleep_mode(){ //深度睡眠模式
	rcu_periph_clock_enable(RCU_PMU);
	printf("deep_sleep_mode 1 \n");
	pmu_to_deepsleepmode(PMU_LDO_LOWPOWER,PMU_LOWDRIVER_ENABLE,WFI_CMD);
	//设置主频
	SystemInit();
	printf("deep_sleep_mode 2 \n");
}

void  standby_mode(){ //待机模式
	rcu_periph_clock_enable(RCU_PMU);
	// 清理待机模式标记
	pmu_flag_clear(PMU_FLAG_RESET_STANDBY);
	//启用唤醒按钮
	pmu_wakeup_pin_enable();
	printf("standby_mode 1\n");
	//待机模式
	pmu_to_standbymode();
	printf("standby_mode 2\n");
}

void USART0_on_recv(uint8_t* data, uint32_t len) {

  printf("recv: %s\n", data);
	switch(data[0]){
		case 0x00:
			sleep_mode();
			break;
		case 0x01:
			deep_sleep_mode();
			break;
		case 0x02:
			standby_mode();
			break;
		default:
			break;
	}

}
static void GPIO_config(){
	 //初始化GPIO PE3
	rcu_periph_clock_enable(RCU_GPIOE);
	gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3);
	gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_3);
}
static void delay(){
	uint32_t i = 50000000;
	while(i--){
		__NOP();
	}

}

int main(void)
{
  nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
  systick_config();
  USART0_init();
	EXTI_init();
	GPIO_config();
	printf("Main Init\n");

  while(1)
  {	
		gpio_bit_toggle(GPIOE,GPIO_PIN_3);
		delay();
  }
}