问题终于解决,在此说明原因,以感谢给予帮助的同学们!
之前软件在开启ADC初始化后,电流由5.5uA上升至20uA,经查看手册发现reference开启后电流大约为13.5到25uA,怀疑是reference没关导致。
将初始化代码中关于开启reference部分代码注释掉,
/** Configure for the selected ADC regular channel to be converted.
*/
// sConfig.Channel = ADC_CHANNEL_VREFINT;
// if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
// {
// Error_Handler();
// }
此时,系统电流变为6uA左右,因此确定是由于开启了VREFINT导致。因此需要在关闭ADC的同时也要关闭reference。
经过检查代码以及调试发现,执行函数
HAL_ADC_DeInit(&hadc);时会将ADC和VREFINT全部关闭,但是程序功耗并不降低。
又经过一段时间的调试和仔细阅读说明书,发现,PWR 电源控制寄存器(PWR_CR)中的ULP位会控制VREFINT在低功耗模式下的打开状态,
在进入低功耗模式前,必须将ULP置位,HAL_PWREx_EnableUltraLowPower();此时功耗下降至正常水平。至此折磨我很长一段时间的问题终于解决。
虽然问题解决,但仍然有一个疑问:
如果ADC不初始化,或者ADC初始化中不将VREFINT通道纳入转换通道,功耗不会增加,此时ULP位状态不影响。也就是说只要没有初始化设置采集内部参考通道,设置为低功耗模式下打开VREFINT也是无效的。但是只要初始化设置一次后,不管后面将ADC所有寄存器清零(HAL_ADC_DeInit),设置为不采集VREFINT,此时如果ULP为0,则进入低功耗时VREFINT就会打开,不知是何原因?
|