找回密码
 立即注册
搜索
热搜: 星闪 最新 活动
查看: 329|回复: 0

客户GD32E235板子深度休眠功耗高,排查到是ADC模块在耗电了,关了但是为啥关不掉?!

[复制链接]

7

主题

0

回帖

79

积分

注册会员

积分
79
发表于 2025-9-12 15:21:30 | 显示全部楼层 |阅读模式
本帖最后由 qn_zd 于 2025-9-12 15:55 编辑

某客户反馈GD32E235的整板的deepsleep深度休眠功耗高,客户测得整板功耗为1.2mA,远远高于理论估算的200uA(GD32E235的深度休眠功耗为20~30uA左右,如下图,加上板上其他芯片和外围电路的耗电,估算整个板子的功耗应为200uA左右)。


1.过去客户现场,先把E235的所有GPIO都配成模拟模式后,功耗降到400uA,还有200uA的芯片内部模块耗电。
然后又把所有模块的初始化函数先屏蔽,进入深度休眠后,功耗降到了200uA左右,符合预期客户要求。

2.接着又放开对所有模块的初始化函数的屏蔽,然后逐个关闭各个模块。
但是在最后关闭ADC模块到时候,却发现怎么也关不掉,因为关和不关ADC,功耗没有一点变化,即ADC的功耗没有给关掉!


3.做了各种尝试,最后终于发现,关ADC模块的时候,不能先关ADC时钟,再关ADC模块,这样关不掉;必须先关ADC模块,再关ADC时钟,这样才能有效关掉ADC模块。
以下是基于GD32L235的演示代码(GD32E235的与此类似):

       //这样关不掉:先关时钟,再关模块,就关不掉,因为关模块要在模块时钟开启的时候才能关掉
//        rcu_periph_clock_disable(RCU_ADC);
//        rcu_periph_clock_disable(RCU_DMA);

//        rcu_periph_clock_enable(RCU_GPIOA);
//        gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_ALL);

//        dma_channel_disable(DMA_CH0);

//        adc_disable();
//        adc_dma_mode_disable();


        //这样呢?----可以关掉ADC,先关模块,再关模块时钟,就可以顺利的关掉模块了
        adc_disable();
        adc_dma_mode_disable();

        dma_channel_disable(DMA_CH0);

        rcu_periph_clock_enable(RCU_GPIOA);
        gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_ALL);

        rcu_periph_clock_disable(RCU_ADC);
        rcu_periph_clock_disable(RCU_DMA);


4.最后,举一反三,下次大家在调试GD32 MCU低功耗的时候,在进入休眠前,想要关MCU内部的其他模块(比如DAC,串口,I2C,SPI等等)的时候,也可以参考上述关ADC模块的顺序。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|【淇诺科技】技术论坛 ( 粤ICP备14010465号-1|粤ICP备14010465号-1 )

GMT+8, 2026-4-2 17:32 , Processed in 0.126426 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表