你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L051单片机ADC如何彻底关闭?

[复制链接]
zxk126 提问时间:2019-12-24 10:42 /
最近项目中用到STM32L051,低功耗设计。程序中试验,在ADC不初始化的时候,STOP模式下一秒唤醒一次,系统功耗为5uA,当采用Cube生成的初始化代码MX_ADC_Init(),并不启动转换,初始化后系统功耗为19uA。当采用函数HAL_ADC_DeInit(),关闭ADC后,系统功耗为17uA,为什么不能降为5uA呢?
收藏 评论16 发布时间:2019-12-24 10:42

举报

16个回答
zxk126 回答时间:2020-8-14 15:59:16
问题终于解决,在此说明原因,以感谢给予帮助的同学们!



之前软件在开启ADC初始化后,电流由5.5uA上升至20uA,经查看手册发现reference开启后电流大约为13.525uA,怀疑是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,此时如果ULP0,则进入低功耗时VREFINT就会打开,不知是何原因?









mylovemcu 回答时间:2019-12-24 15:04:21
zhengxk-344971 发表于 2019-12-24 14:33
CLEAR_BIT(RCC->APB2ENR,  (RCC_APB2ENR_ADC1EN))
在HAL里面应该就是这句吧,这个在程序中已经有了,执行 ...

那就是已经关闭了  那就在看看口线配置吧  不用的口线都配置成输出低电平
zxk126 回答时间:2019-12-24 14:33:50
mylovemcu 发表于 2019-12-24 14:29
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 ,DISABLE);

CLEAR_BIT(RCC->APB2ENR,  (RCC_APB2ENR_ADC1EN))
在HAL里面应该就是这句吧,这个在程序中已经有了,执行过了,还是之前的效果。
mylovemcu 回答时间:2019-12-24 11:16:31
要关闭ADC的时钟  时钟才是增加功耗的罪魁祸首
zxk126 回答时间:2019-12-24 11:51:18
mylovemcu 发表于 2019-12-24 11:16
要关闭ADC的时钟  时钟才是增加功耗的罪魁祸首

HAL_ADC_DeInit调用的HAL_ADC_MspDeInit中的 __HAL_RCC_ADC1_CLK_DISABLE()应该已经关了时钟了吧
T涛哥T 回答时间:2019-12-24 12:55:30
HAL_ADC_Stop(&hadc);加上这句话试一试
HAL_ADC_DeInit()这句话可以不用加
zxk126 回答时间:2019-12-24 14:04:00
ljtzsd 发表于 2019-12-24 12:55
HAL_ADC_Stop(&hadc);加上这句话试一试
HAL_ADC_DeInit()这句话可以不用加

一样效果,没有用。
zxk126 回答时间:2019-12-24 14:05:23
mylovemcu 发表于 2019-12-24 11:16
要关闭ADC的时钟  时钟才是增加功耗的罪魁祸首

要如何才能真正关闭ADC时钟呢?
mylovemcu 回答时间:2019-12-24 14:29:23
zhengxk-344971 发表于 2019-12-24 14:05
要如何才能真正关闭ADC时钟呢?

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 ,DISABLE);
zxk126 回答时间:2019-12-24 16:52:59
mylovemcu 发表于 2019-12-24 15:04
那就是已经关闭了  那就在看看口线配置吧  不用的口线都配置成输出低电平 ...

各种口都配置好了,现在的问题就是开启AD后关闭AD功耗下不来,其他的部分配置完全一样。
zxk126 回答时间:2019-12-25 10:50:27
有没有ST技术支持人员的联系方式呢?
T涛哥T 回答时间:2019-12-25 14:12:58
zhengxk-344971 发表于 2019-12-24 14:04
一样效果,没有用。

行吧,你在看看吧,我就是这样用的,功耗在5uA左右
zxk126 回答时间:2019-12-30 09:03:19
ljtzsd 发表于 2019-12-25 14:12
行吧,你在看看吧,我就是这样用的,功耗在5uA左右

谢谢支持!请问你用的是哪款CPU呢?我又用L431试了一下,初始化ADC和不初始化ADC几乎没什么差别。
T涛哥T 回答时间:2019-12-31 12:53:33
zhengxk-344971 发表于 2019-12-30 09:03
谢谢支持!请问你用的是哪款CPU呢?我又用L431试了一下,初始化ADC和不初始化ADC几乎没什么差别。 ...

STM32L051C8T6
butterflyspring 回答时间:2020-1-3 11:21:02
可以参考例程,不用的IO口配置成模拟输入,并且关闭相应IO口的总时钟
(__HAL_RCC_GPIOA_CLK_DISABLE();)。
当然有需要设置的除外,没有关闭会带来一定耗电的上升。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版