phelan
1
求助,使用的52系列芯片,在板级文件中初始化了I2C,即
HAL_PIN_Set(PAD_PA29, I2C2_SCL, PIN_PULLUP, 1);
HAL_PIN_Set(PAD_PA30, I2C2_SDA, PIN_PULLUP, 1);
进入deepsleep睡眠后测得功耗为 1.45mA ,注释掉这段初始化的代码,再测量是 0.97mA,这个请问还如何解决,是否要BSP_IO_Power_Down()函数中添加失能的函数呢?另外这个进入deepsleep睡眠后的0.97mA似乎还有点偏高,跟文档中的LPSYS: 93uA HPSYS: 316uA还有点差别,还会是哪里的问题呢,求助谢谢
pengwei
2
52x芯片的deepsleep睡眠功耗应该是20uA量级。你看的文档可能是55x或者其它芯片的。
如果功耗偏高,首先应进行板级分解,将外围器件引入的功耗排除。然后就是排除IO配置的问题。
具体到I2C,进入deepsleep睡眠并不会改变IO状态,I2C上拉仍然会保持,如果外部I2C器件电源关闭了就可能产生IO的漏电。
phelan
3
好的,感谢回复,我看的是 低功耗开发指南 - SiFli-Wiki v1.0 文档 表 3-1: 低功耗模式->芯片电流,并没有提到什么芯片,这个表格是描述什么芯片的呢?
原来52芯片可以降到20uA,我是直接挂起main线程,使用按键PA34唤醒的,这种方式应该进入了deepsleep模式了吧,下面是打印。 
msh />[pm]S:3,2230
[pm]W:154301
[pm]WSR:0x2
gpio_wakeup_handler!
[pm]S:3,154325
[pm]W:247899
[pm]WSR:0x2
gpio_wakeup_handler!
[pm]S:3,247921
phelan
6
哈喽,我是基于hello_world下rtt工程修改的,应该是没有用到小核的吧。我参考的就是pm例程
(SiFli-SDK/example/rt_device/pm at main · OpenSiFli/SiFli-SDK · GitHub),就添加了PA34唤醒,下面是主程序
static void gpio_wakeup_handler(void *args)
{
// rt_pm_request(PM_SLEEP_MODE_IDLE);
rt_kprintf("gpio_wakeup_handler!\r\n");
}
void gpio_wakeup_config(void)
{
int8_t wakeup_pin;
HAL_PIN_Set(PAD_PA34, GPIO_A34, PIN_PULLDOWN, 1); //set PA34 to GPIO funtion
HAL_HPAON_EnableWakeupSrc(HPAON_WAKEUP_SRC_PIN10, AON_PIN_MODE_POS_EDGE); //Enable #WKUP_PIN10 (PA34)
rt_pin_mode(BSP_KEY1_PIN, PIN_MODE_INPUT);
rt_pin_attach_irq(BSP_KEY1_PIN, PIN_IRQ_MODE_RISING, (void *) gpio_wakeup_handler, (void *)(rt_uint32_t) BSP_KEY1_PIN); //PA34 GPIO interrupt
rt_pin_irq_enable(BSP_KEY1_PIN, 1);
}
int main(void)
{
rt_kprintf("Power Comsumption Test!\n");
gpio_wakeup_config();
// while (1)
// {
// rt_kprintf("__main loop__\n");
// rt_thread_mdelay(5000);
// }
return 0;
}
这样上电就进入了睡眠,并且有打印。我猜测可能还是我IO配置的问题
如果需要在lvgl里面进入睡眠可以参考小智代码来,使用gui状态机来进行挂起线程,进入睡眠
如果小核没有跑起来,小核就没睡眠了,会有额外的电流消耗,两个核是独立睡眠的,大核这边做的事情只是让大核睡眠了。如果不需要使用蓝牙功能也不需要启动小核,可以参考 pm_gpio里 的这行代码,调用 HAL_LPAON_Sleep ,在小核没有启动的情况下,让小核直接睡眠。
phelan
10
原来如此,非常感谢,确实是小核没有睡眠。把所有外围器件拆掉之后Deepsleep就只有50μA了
还有其他的芯片引入的几个μA,理论上还可以更低一点。
那么如果在实际应用中使用到了蓝牙功能,进入睡眠的话还可以调用HAL_LPAON_Sleep()睡眠小核吗?另外还有个问题请问一下,我现在的I2C引脚配置是浮空的,功耗是50μA,如果我内部上拉SCL SDA,HAL_PIN_Set(PAD_PA00, I2C1_SCL, PIN_PULLUP, 1);按照上面的pengwei大佬说的可能的IO漏电,直接把芯片拿掉,功耗还是会有个0.77mA,就很奇怪这个。所以想着使用芯片的ldo3输出的3.3V来外部上拉这个I2C,仍然有个0.44mA。一个棘手的问题,请教一下 
pengwei
11
没看懂你的描述。首先I2C引脚上拉并不会引入芯片自身的漏电。如果出现漏电,一般是上拉的IO外部连接的电路引起。比如外部连接的其它器件断电了,得根据硬件原理图分析,排查相关IO的所有连接。
phelan
14
确实是外部电路的原因,因为没有拆掉上拉电阻,出现了漏电,谢谢 
如果使用了蓝牙,也就是是像rt_device/pm例程那样加入了小核工程并且大核使能了蓝牙,就不需要调用HAL_LPAON_Sleep让小核睡眠了,小核启动后会根据蓝牙的行为自动睡眠和唤醒
I2C有稳定的外部上下拉应配置为NOPULL。如果在休眠时外部上电电源断开应配置为PULLDOWN