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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版