|
|
本帖最后由 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模块的顺序。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|