首页 > 其他分享 >【GD32F303红枫派使用手册】第六节 PMU-低功耗实验

【GD32F303红枫派使用手册】第六节 PMU-低功耗实验

时间:2024-06-02 13:28:21浏览次数:17  
标签:RCU 低功耗 电源 模式 红枫 使用手册 VDD rcu 唤醒

6.1 实验内容

通过本实验主要学习以下内容:

  • PMU原理;
  • 低功耗的进入以及退出操作;

6.2 实验原理

6.2.1 PMU结构原理

PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32F303系列MCU具有三个电源域,包括VDD/VDDA电源域、1.2V电源域以及电池备份域,其中,VDD /VDDA域由电源直接供电。在VDD/VDDA域中嵌入了一个LDO,用来为1.2V域供电。在备份域中有一个电源切换器,当VDD/VDDA电源关闭时,电源切换器可以将备份域的电源切换到VBAT引脚,此时备份域由VBAT引脚(电池)供电。

  1. VDD/VDDA电源域

VDD 域为数字电源域包括 HXTAL(高速外部晶体振荡器)、 LDO(电压调节器)、 POR / PDR(上电/掉电复位)、 FWDGT(独立看门狗定时器)和除 PC13、PC14 和 PC15 之外的所有 PAD 等等。另外,上图中与PMU控制器连接的PA0、NRST、FWDGT以及RTC表示待机模式下的唤醒源。VDDA域为模拟电源域包括 ADC / DAC(AD / DA 转换器)、 IRC8M(内部 8M RC 振荡器)、 IRC48M(内部 48M RC 振荡器)、 IRC40K(内部 40KHz RC振荡器) PLLs(锁相环)和 LVD(低电压检测器)等等。

POR / PDR(上电/掉电复位) 电路检测VDD / VDDA并在电压低于特定阈值时产生电源复位信号复位除备份域之外的整个芯片。 下图显示了供电电压和电源复位信号之间的关系。 VPOR 表示上电复位的阈值电压,典型值约为 2.40V, VPDR 表示掉电复位的阈值电压,典型值约为1.8V。迟滞电压Vhyst值约为600mV。

  • 注意:当电源电压高于VPOR后,MCU内部会延迟2ms后再拉高NRST,MCU才会正式启动,此时可确保MCU启动时刻VDD电压已高于VPOR。

GD32F303系列MCU具有LVD低电压检测功能,如下图所示,LVD 的功能是检测 VDD / VDDA 供电电压是否低于低电压检测阈值,该阈值由电源控制寄存器(PMU_CTL) 中的 LVDT[2:0]位进行配置。 LVD 通过 LVDEN 置位使能,位于电源状态寄存器(PMU_CS) 中的 LVDF 位表示低电压事件是否出现,该事件连接至 EXTI 的第 16 线,用户可以通过配置 EXTI 的第16 线产生相应的中断。 LVD 中断信号依赖于 EXTI 第 16 线的上升或下降沿配置。迟滞电压 Vhyst值为 100mV。 

  • 注意:LVD一般可用于欠压异常处理或者用于掉电检测。
  1. 1.2V电源域

1.2V 电源域为 Cortex®-M4 内核逻辑、 AHB / APB 外设、备份域和 VDD / VDDA域的 APB 接口等供电。若系统系统工作在高频状态建议使能高驱模式。

  1. 电池备份域

电池备份域由内部电源切换器来选择VDD供电或VBAT(电池)供电,然后由VBAK为备份域供电,该备份域包含RTC(实时时钟)、 LXTAL(低速外部晶体振荡器)、 BPOR(备份域上电复位)、BREG(备份寄存器),以及PC13至PC15共3个BKPPAD。为了确保备份域中寄存器的内容及RTC正常工作,当VDD关闭时, VBAT引脚可以连接至电池或其他等备份源供电。电源切换器是由VDD / VDDA域掉电复位电路控制的。对于没有外部电池的应用,建议将VBAT引脚通过100nF的外部陶瓷去耦电容连接到VDD引脚上。

  • 注意: 由于PC13至PC15引脚是通过电源切换器供电的,电源切换器仅可通过小电流,因此当PC13至PC15的GPIO口在输出模式时,其工作的速度不能超过2MHz(最大负载为30Pf)。

电池备份域中具有84字节备份数据寄存器,该备份数据寄存器可用于存储用户数据,且在掉电复位以及系统复位情况下数据不丢失,仅在发生侵入事件时数据会被擦除。

若读者有在VDD掉电情况下RTC继续工作的应用需求,需要VBAT引脚外接电池并使用LXTAL外部低频晶振,这样在VDD掉电的情况下,VBAT供电将会由VDD切换到VBAT,LXTAL和RTC均可正常工作,后续VDD上电后同步RTC寄存器即可获取正确的RTC时间。

6.2.2 低功耗模式

GD32F303系列MCU具有三种低功耗模式,分别为睡眠模式、深度睡眠模式和待机模式。

睡眠模式与 Cortex®-M4 的 SLEEPING 模式相对应。在睡眠模式下,仅关闭 Cortex®-M4的时钟,如需进入睡眠模式,只要清除 Cortex®-M4 系统控制寄存器中的 SLEEPDEEP 位,并执行一条 WFI 或 WFE 指令即可。

深度睡眠模式与 Cortex®-M4 的 SLEEPDEEP 模式相对应,在深度睡眠模式下, 1.2V 域中的所有时钟全部关闭, IRC8M、 HXTAL 及 PLLs 也全部被禁用,SRAM 和寄存器中的内容被保留,根据 PMU_CTL 寄存器的 LDOLP 位的配置,可控制 LDO 工作在正常模式或低功耗模式。进入深度睡眠模式之前,先将 Cortex®-M4 系统控制寄存器的 SLEEPDEEP 位置 1,再清除PMU_CTL 寄存器的 STBMOD 位,然后执行WFI 或 WFE 指令即可进入深度睡眠模式。

待机模式是基于 Cortex®-M4 的 SLEEPDEEP 模式实现的。在待机模式下,整个 1.2V 域全部停止供电,同时 LDO 和包括 IRC8M、 HXTAL 和 PLL 也会被关闭。进入待机模式前,先将Cortex®-M4 系统控制寄存器的 SLEEPDEEP 位置 1,再将 PMU_CTL 寄存器的 STBMOD位置 1,再清除 PMU_CS 寄存器的 WUF位,然后执行WFI 或 WFE 指令,系统进入待机模式。

低功耗模式相关数据可参考下表,不同的低功耗模式是通过关闭不同时钟以及电源来实现的,关闭的时钟和电源越多,MCU所进入的睡眠模式将会越深,功耗也会越低,带来的唤醒时间也会越长,其唤醒源也会越少。睡眠模式是最浅的低功耗模式,仅关闭了CPU,代码不再运行,所有的中断或事件均可唤醒,唤醒时间也最快;深度睡眠模式时中间的低功耗模式,关闭了1.2V电源域时钟以及IRC8M/HXTAL/PLL,仅可通过EXTI中断或事件唤醒,唤醒后需要重新配置系统时钟;待机模式是功耗最低的低功耗模式,关闭了1.2V电源域电源以及IRC8M/HXTAL/PLL,仅可通过NRST/看门狗/RTC闹钟/WKUP引脚唤醒,唤醒后MCU将会复位重启。

 各种睡眠模式下的功耗可以参考数据手册描述,睡眠模式下相较于同主频模式下的运行模式功耗减少约50%,深度睡眠和待机模式功耗更低,如下表所示,深度睡眠模式下功耗常温典型值为133ua-189ua,待机模式下功耗常温典型值为5uA。

  • 注意:由于深度睡眠模式具有较低的功耗,唤醒后继续从断点处执行,因而具有更广泛的应用场景,但需注意若需达到较一致的MCU深度睡眠功耗,需要将系统中未使用的MCU引脚均配置为模拟输入状态,包括芯片内部未引出的pad。

 

 Note:左侧是常温下的典型数值,中间为85度下的典型数值,右侧为常温下的最大数值。

6.3 硬件设计

本例程stanby的唤醒使用到了PA0唤醒引脚,其电路如下所示。

6.4 代码解析

本例程实现deepsleep以及standby的进入以及唤醒测试,首先我们来看下主函数,如下所示。该主函数首先配置了系统主时钟、延迟、打印和LED函数,并打印Example of Low Power Test Demo。之后查询是否进入过Standby模式,如果进入过Standby模式,表示当前状态为standby唤醒后的复位,则打印A reset event from Standby mode has occurred,并翻转LED0,因而验证standby唤醒的时候,其现象可观察到LED0的翻转。之后使能wakeup引脚的唤醒以及按键的初始化,此时将KEY0配置为中断模式。在while(1)中,查询KEY1是否按下,如果按下则打印Entering Standby Mode.并进入standby模式,如果key2按下,则打印Enter Deepsleep mode.并进入Deepsleep模式,从deepsleep模式唤醒后需要重新配置时钟,打印Exit Deepsleep mode.并翻转LED1。Standby的唤醒使用PA0 wakeup引脚,deepsleep的唤醒可使用任何EXTI中断,本实例中使用PE2的KEY0按键中断唤醒。

C
int main(void)
{
        rcu_periph_clock_enable(RCU_PMU);
        rcu_system_clk_config_120M();
  driver_init();
        bsp_uart_init(&BOARD_UART);                                                                                                                                   /* 板载UART初始化 */
  printf("Example of Low Power Test Demo.\r\n");

        delay_ms(2000);
        bsp_led_group_init();  
        
        if(pmu_flag_get(PMU_FLAG_RESET_STANDBY)==SET)
        {
                  printf("A reset event from Standby mode has occurred.\r\n");
                  bsp_led_toggle(&LED0);
                  pmu_flag_clear(PMU_FLAG_RESET_STANDBY);
        }
  rcu_all_reset_flag_clear();

        pmu_wakeup_pin_enable();
        KEY0.key_gpio->gpio_mode = INT_HIGH;
        KEY0.key_gpio->int_callback = key0_IRQ_callback;
  bsp_key_group_init();
        nvic_irq_enable(EXTI2_IRQn,0,0);
        
        while (1)
        {
                if(bsp_key_state_get(&KEY1)!=RESET)
                {
                         printf("Entering Standby Mode.\r\n");
                         bsp_led_toggle(&LED0);
                         pmu_to_standbymode(WFI_CMD);
                }
          if(bsp_key_state_get(&KEY2)!=RESET)
                {
                         printf("Enter Deepsleep mode.\r\n");
                         bsp_led_toggle(&LED1);
                         config_allgpio_into_analog();
                         bsp_key_group_init();
       pmu_to_deepsleepmode(PMU_LDO_NORMAL, PMU_LOWDRIVER_DISABLE, WFI_CMD);
                   bsp_led_group_init();  
                         bsp_uart_init(&BOARD_UART);                                                                                                                                   /* 板载UART初始化 */
                         printf("Exit Deepsleep mode.\r\n");
                         bsp_led_toggle(&LED1);
                }
        }
}

 需要注意,进入deepsleep之前需要将不用的GPIO全部配置为模拟输入的模式,为了得到更为一致且较低的功耗,其配置函数如下。

在配置所有IO为模拟输入之后,如果有需要保持GPIO状态的引脚,需要配置后再进入deepsleep,如例程中的按键引脚,因为需要按键唤醒deep sleep。

C
void config_allgpio_into_analog(void)
{
        
        rcu_periph_clock_enable( RCU_GPIOA );
  rcu_periph_clock_enable( RCU_GPIOB );
  rcu_periph_clock_enable( RCU_GPIOC );
  rcu_periph_clock_enable( RCU_GPIOD );
  rcu_periph_clock_enable( RCU_GPIOE ); 
        rcu_periph_clock_enable( RCU_GPIOF ); 
        rcu_periph_clock_enable( RCU_GPIOG ); 
        rcu_periph_clock_enable( RCU_AF ); 

                GPIO_CTL0( GPIOA ) = 0x0 ;
                GPIO_CTL1( GPIOA ) &= 0xFFF00000 ;


                GPIO_CTL0( GPIOB ) &= 0x000FF000 ;
                GPIO_CTL1( GPIOB ) = 0x0 ;

                GPIO_CTL0( GPIOC ) = 0x0 ;
                GPIO_CTL1( GPIOC ) = 0x0 ;

                GPIO_CTL0( GPIOD ) = 0x0 ;
                GPIO_CTL1( GPIOD ) = 0x0 ;

                GPIO_CTL0( GPIOE ) = 0x0 ;
                GPIO_CTL1( GPIOE ) = 0x0;
        
                GPIO_CTL0( GPIOF ) = 0x0 ;
                GPIO_CTL1( GPIOF ) = 0x0;
        
                GPIO_CTL0( GPIOG ) = 0x0 ;
                GPIO_CTL1( GPIOG ) = 0x0 ;
        
    RCU_AHBEN = 0;
    RCU_APB2EN = 0;
    RCU_APB1EN = 0;
                        
        rcu_periph_clock_disable( RCU_GPIOA );
  rcu_periph_clock_disable( RCU_GPIOB );
  rcu_periph_clock_disable( RCU_GPIOC );
  rcu_periph_clock_disable( RCU_GPIOD );
  rcu_periph_clock_disable( RCU_GPIOE ); 
        rcu_periph_clock_disable( RCU_GPIOF ); 
        rcu_periph_clock_disable( RCU_GPIOG ); 
        rcu_periph_clock_disable( RCU_AF ); 
}

6.5 实验结果

将本实验历程烧录到红枫派实验板中,按下KEY1按键将进入standby模式,并打印Entering Standby Mode.,然后按下wakeup按键,将从stanby模式唤醒,打印A reset event from Standby mode has occurred.并翻转LED0,之后按下KEY2按键将打印Enter Deepsleep mode.进入deepsleep模式,然后按下KEY0按键将从deepsleep模式下唤醒,唤醒后重新配置时钟,打印Exit Deepsleep mode.并将LED1翻转。

具体现象如下所示。

由聚沃科技原创,来源于【红枫派开发板】第六讲 PMU-低功耗实验 - 苏州聚沃电子科技有限公司 (gd32bbs.com)

GD32MCU技术交流群:859440462  

标签:RCU,低功耗,电源,模式,红枫,使用手册,VDD,rcu,唤醒
From: https://blog.csdn.net/weixin_45254847/article/details/139388221

相关文章

  • Linux低功耗Suspend/Resume梳理(基于STM32MP1)
    基于STM32MP1简单梳理Linuxsuspend/resume涉及到的内容:触发Suspend流程,以及唤醒手段和后续resume流程。Linuxkernel中Suspend/Resume流程。TFA中冷启动、热启动、SMC处理、PSCI实现等等。其他低功耗相关:poweroff、reboot、fiq处理。PowerDomainTree介绍;PSCI移植指导等。......
  • AP8105 低功耗 PFM DC-DC 升压芯片
    概述AP8105系列产品是一种高效率、低纹波、工作频率高的PFM升压DC-DC变换器。AP8105系列产品仅需要四个外围元器件,就可完成将低输入的电池电压变换升压到所需的工作电压,非常适合于便携式1~4节普通电池应用的场合。电路采用了高性能、低功耗的参考电压电路结构,同时在......
  • AP8215 低功耗 PFM DC-DC 升压芯片
    描述: AP8215系列DC/DC芯片是采用CMOS工艺制造的低静态电流的PFM开关型DC/DC升压转换器。该系列芯片采用先进的电路设计和制造工艺,极大地改善了开关电路固有的噪声问题,减小对周围电路的干扰。输出电压为2.0V~7.0V(按0.1V的级差),振荡频率为180KHz(典型值)。对内......
  • 【GD32F303红枫派使用手册】第二节 GPIO-流水灯实验
    2.1实验内容通过本实验主要学习以下内容:GPIO结构及原理;GPIO输出功能实现;LED驱动原理。2.2实验原理2.2.1GPIO外设原理GD32F303系列MCU最多可支持112个通用I/O引脚(GPIO),分别为PA0~PA15,PB0~PB15,PC0~PC15,PD0~PD15,PE0~PE15,PF0~PF15和PG0~PG15,各......
  • LoRa无线通信低功耗原理
    LoRa无线通信模块的工作原理主要基于扩频调制技术,特别是采用了ChirpSpreadSpectrum(CSS)调制方式。这种技术通过线性频率调制(LFM)产生“啁啾”信号,每个数据包的载波频率随着时间线性变化,从而实现远距离、低功耗和高抗干扰性的通信特性。在发送过程中,LoRa模块首先将要......
  • redis 安装、使用手册
    Linux系统Redis使用手册一、引言Redis是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。由于其出色的性能和灵活性,Redis在开发社区中广受欢迎。本手册将详细介绍Redis在Linux系统中的安装、每种数据结构的命令使用以及每种数据类型的应用场景。二......
  • LLCC68低功耗Sub-GHz LoRa射频收发器LLCC68IMLTRT
    目录·LLCC68简介·主要特性·射频开关参考原理图·应用领域LLCC68简介LLCC68是一款Sub-GHzLoRa射频收发器,适用于中距离室内以及室内到室外的无线应用。支持SPI接口。与SX1262的引脚兼容,专为延长电池寿命而设计,有效接收电流消耗低至4.2mA。SX1261、SX1262、SX1268和LLCC68是专......
  • STM32 F1系列 全中文HAL&LL库使用手册 中英双语对照 GPT机翻 共1208页、约40万字
    STM32F1系列全中文HAL_LL库使用手册,中英文双语对照阅读。内容、格式对照官方原文,含标签导航及目录跳转。全文GPT机翻,除人工翻译外,相对更加贴合原文原意,双语版防止翻译错误方便对照。全文:1208页,约40万字。*******下有更多展示图片********由于本汉化不改变官方文档的内容......
  • SciTech-EECS-Sensor:TI的 4-20mA 环路供电系统实现高达 100m 的液位测量,具有高测距精
    https://www.ti.com.cn/zh-cn/featured-applications-content/sensors/mmwave-radar/industrial-mmwave-level-transmitter.html可针对4-20mA环路供电系统实现高达100m的液位测量,具有高测距精度和低功耗。我们的毫米波雷达传感器可对各种行业(包括食品和饮料、废水管理和加工......
  • NRF52833是一款通用多协议SoC蓝牙芯片内置M4内核超低功耗
    NRF52833是一款通用多协议SoC,具有蓝牙测向无线电,可在-40°C至105°C的扩展温度范围内工作。它是业界领先的nRF52系列的第5款产品,围绕带FPU的64MHzArmCortex-M4构建,具有512KB闪存和128KBRAM内存,可用于高价值应用。nRF52833可在105°C运行,加上大量内存和动态多......