0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GD32F303红枫派开发板使用手册】第六讲 PMU-低功耗实验讲

聚沃科技 2024-06-02 10:12 次阅读
wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

6.1实验内容

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

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

6.2实验原理

6.2.1PMU结构原理

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

wKgZomZb0-CADFQYAAGLoYlIrOs369.png
  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。
wKgaomZb0_mAA6b-AACVlZvsvCw754.png

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。

wKgaomZb1AeAKigJAACGOguqpmk529.png
  • 注意: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将会复位重启。

wKgaomZb1DCAEqCFAAGGXt9wOEA491.pngwKgZomZb1DuAaVTbAAHLfwiuMfY085.png

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

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

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

6.3硬件设计

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

wKgaomZb1GyAc3L2AABSpdE9gtc974.png

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翻转。

具体现象如下所示。

wKgZomZb0p6ADaUfAABe7izWiVg635.png

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44554

    浏览量

    634629
  • 嵌入式
    +关注

    关注

    5082

    文章

    19104

    浏览量

    304797
  • 开发板
    +关注

    关注

    25

    文章

    5032

    浏览量

    97371
  • PMU
    PMU
    +关注

    关注

    1

    文章

    108

    浏览量

    21592
  • GD32F3
    +关注

    关注

    0

    文章

    11

    浏览量

    3851
收藏 人收藏

    评论

    相关推荐

    GD32F303】星空介绍

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 09-11 17:55

    【星空GD32F303开发板试用体验】开发记录汇总

    本帖最后由 申小林一号 于 2021-10-15 14:47 编辑 开贴日期:2021年10月11日该贴主要是用于记录星空开发板使用记录以及学习GD32F303芯片的一个过程,将所有的
    发表于 10-11 16:09

    【星空GD32F303开发板试用体验】开箱+环境搭建

    本帖最后由 lustao 于 2021-10-19 09:29 编辑 感谢 发烧友学院以及广州旗点智能科技有限公司为我和孩子提供此产品星空GD32F303开发板。收到了星空
    发表于 10-18 14:15

    【星空GD32F303开发板试用体验】开箱+环境搭建

    https://bbs.elecfans.com/jishu_2179209_1_1.html感谢 发烧友学院以及广州旗点智能科技有限公司为我和孩子提供此产品星空gd32F303开发板。收到了星空
    发表于 11-02 15:36

    【星空GD32F303开发板试用体验】+板卡概览

    本帖最后由 cooldog123pp 于 2021-11-6 21:07 编辑 星空GD开发板是由旗点科技推出的一款GD32开发板
    发表于 11-06 21:05

    星空GD32F303开发板的相关资料下载

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 12-10 08:27

    STM32CUBEMX开发GD32F303(14)----IIC之配置OLED

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。
    的头像 发表于 07-26 13:52 2024次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(14)----IIC之配置OLED

    GD32F303固件库开发

    的可以加群申请:615061293 。 GD32F303固件库开发(1)----前期准备与烧录 使用GDLINK、jlink、串口下载程序到GD芯片。 [https://blog.csdn.net
    的头像 发表于 07-27 09:27 1162次阅读
    <b class='flag-5'>GD32F303</b>固件库<b class='flag-5'>开发</b>

    GD32F303 低功耗模式要点

    我们都知道,MCU有低功耗模式,比如GD32F303芯片,就有Sleep、Deepsleep和Standby三种模式。关于这三种模式的具体使用方法,小伙伴们可以参考《GD32F30x系列用户
    的头像 发表于 01-17 09:40 2498次阅读
    <b class='flag-5'>GD32F303</b> <b class='flag-5'>低功耗</b>模式要点

    GD32F470紫藤开发板使用手册】第五 PMU-低功耗实验

    通过本实验主要学习以下内容: PMU原理; 低功耗的进入以及退出操作
    的头像 发表于 05-07 09:29 675次阅读
    【<b class='flag-5'>GD32F</b>470紫藤<b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五<b class='flag-5'>讲</b>  <b class='flag-5'>PMU-</b><b class='flag-5'>低功耗</b><b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第二 GPIO-流水灯实验

    GD32F303系列MCU最多可支持 112 个通用I/O 引脚(GPIO),分别为 PA0 ~ PA15, PB0 ~ PB15, PC0 ~ PC15,PD0 ~ PD15, PE0
    的头像 发表于 05-29 10:02 1631次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二<b class='flag-5'>讲</b> GPIO-流水灯<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第三 GPIO-按键查询检测实验

    GD32F303系列MCU GPIO输入配置结构如下图所示,输入可配置上下拉电阻,通过施密特触发器后可通过备用功能输入或者通过输入状态寄存器进行读取。
    的头像 发表于 05-30 10:02 852次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第三<b class='flag-5'>讲</b> GPIO-按键查询检测<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第五 FMC-片内Flash擦写读实验

    MC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字节空间内, CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也
    的头像 发表于 06-02 10:05 765次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五<b class='flag-5'>讲</b> FMC-片内Flash擦写读<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第十六 USART-DMA串口收发实验

    在前面ADC章节中,我们介绍了DMA的工作原理,这里就不多做介绍。从GD32F303用户手册中可以查到,各串口的TX和RX分别对应DMA的不同通道,比如USART0的TX对应DMA0的通道3,而RX对应DMA0的通道4。
    的头像 发表于 06-15 09:54 1061次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第十六<b class='flag-5'>讲</b> USART-DMA串口收发<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第二十 SPI-SPI NAND FLASH读写实验

    通过本实验主要学习以下内容: •SPI通信协议,参考19.2.1东方红开发板使用手册GD32F303 SPI操作方式,参考19.2.2东方红
    的头像 发表于 06-20 09:50 883次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二十<b class='flag-5'>讲</b> SPI-SPI NAND FLASH读写<b class='flag-5'>实验</b>