芯片选型
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();
}
}