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

STM32L0系列有关从STOP模式唤醒后,立即进行ADC采样的问题?

[复制链接]
iPeanut 提问时间:2022-4-20 12:48 / 未解决

我有个项目的应用场景是,主程序轮询进入到低功耗STOP停止模式,然后用LPTIM定时每4ms从STOP中唤醒,在唤醒的LPTIM中断回调函数中,对某个管脚进行AD采样。我为了在STOP中尽量低功耗,在进入STOP前,将PWR_CR寄存器中的ULP位置1了,同时使能了快速唤醒,即PWR_CR中的FWU位置1了。但是看手册介绍说ULP置1,进入STOP后,内部参考电压Vrefint被禁止,而ADC的使用又与Vrefint相关。我在用LPTIM中断唤醒后,开始使用ADC前又没有进行重新开启Vrefint的操作,而且我的ADC是用的AUTOFF和WAIT使能,也就是每次中断进入时,不执行ADEN=1,直接让ADSTART=1,等待ADC获得正确的采样值。目前这样的操作流程到都可以获得希望的采样值,但不知道是否有什么隐患和问题。请问按照我这样的采样流程,每次中断中的ADSTART=1后,是否硬件会自己等待Vrefint稳定后才会执行转换,可以获得可靠的采样值吗?那么这样操作获得稳定可靠的转换值需要多久,会是要等Vrefint稳定后才能获得吗?会真如手册所说要等到内部参考电压启动时间最长3ms稳定后,才能获得ADC采样值吗?谢谢

收藏 评论6 发布时间:2022-4-20 12:48

举报

6个回答
butterflyspring 回答时间:2022-4-20 16:34:15

通过手册分析,关于低功耗方面给出了两种条件:

1、如附图所示,MCU进入低功耗模式,主电压调节器进入低功耗模式,参考电压关闭,ADC不能再使用。 在这种条件下,应用软件需按照手册强调的方式顺序进入和退出低功耗模式才能正确的应用ADC.

2、WAIT 和 AUTOFF是在ADC工作时的一种省电模式,与第1点条件不同。

所以楼主的工作场景属于第一种条件,应该按照手册强调的方式才有保障。目前用ADSTART启动的方式超出了手册描述范围,很可能有风险。 建议楼主还是按照手册描述添加几行代码更可靠些。stm32l0adcstopmodeprocedure.png

iPeanut 回答时间:2022-4-21 11:33:52

butterflyspring 发表于 2022-4-20 16:34
通过手册分析,关于低功耗方面给出了两种条件:</p>
<p>1、如附图所示,MCU进入低功耗模式,主电压调节器进入 ...

[md]非常感谢您的回复。 1.我现在使用中在进入STOP模式前,并没有软件将ADVREFEN=0,也就是进入STOP前,ADC的调压器并没有手动关闭。那么在中断唤醒后,没有进行使能ADVREGEN=1,立即执行ADC采样,是不是也是可以的? 2.如果进入STOP模式前,不对PWR_CR寄存器中的ULP位置1,那么在STOP状态下,是不是Vrefint就不会关闭,同时向上面所说ADVREGEN也没有手动置1。那么LPTIM中断唤醒后立即进行进行ADC是不是就是可靠的呢?

butterflyspring 回答时间:2022-4-21 16:46:51

看手册描写的前提条件,上次截图高亮部分“主电压调节器进入低功耗模式(还没关闭呢),参考电压也就关闭了,ADC是不能再用的” 保险的方法就是按照手册的方式处理,要不然厂家也不会强调这个了。 你这样用的话没有保障的。也许参考电压掉得快些,ADC值就会不准了。量产时出现小比例不准都是有代价的哦~~~

iPeanut 回答时间:2022-4-21 19:55:23

butterflyspring 发表于 2022-4-21 16:46
看手册描写的前提条件,上次截图高亮部分“主电压调节器进入低功耗模式(还没关闭呢),参考电压也就关 ...

[md]感谢您的回复。1.我这个是低功耗设备,希望尽量多时间停留在STOP中,要每4ms用LPTIMER唤醒一次,唤醒后中断中尽快完成ADC转换采样,然后重新回到STOP中。如果每次进入STOP前将ADC的ADVREFEN=0,关闭ADC的调压器,那么在在中断唤醒后再开启ADC的调压器会等待时间过长。2.我在测试中发现,如果在进入STOP前ULP=1,同时采用快速唤醒即FWU=1,那么在唤醒后要等待很久才能在PWR_CSR寄存器中的VREFINTRDYF标志位稳定置1,增大的等待的功耗。如果进入STOP前ULP=0,即不关闭Vrefint,仍采用快速唤醒FWU=1,在唤醒后,不会出现等待VREFINTRDYF的现象,很快就可以通过。这样是不是可以推论出ULP=0的情况下,进入STOP后Vrefint并不会被关闭呢?手册中关于PWR_CR寄存器中ULP的描述是:0:Vrefint在低功耗模式下打开,1:Vrefint在低功耗模式下关闭。3.针对我这样的应用,您有什么好的低功耗建议吗?比如进入STOP前应该如果配置关闭什么开启什么,唤醒后开始ADC前如何配置?谢谢

butterflyspring 回答时间:2022-4-22 16:22:25

iPeanut 发表于 2022-4-21 19:55
感谢您的回复。1.我这个是低功耗设备,希望尽量多时间停留在STOP中,要每4ms用LPTIMER唤醒一次,唤醒 ...

[md]在低功耗模式设计中,运行和休眠对功耗控制来说天生就是一对矛盾。所谓鱼和熊掌不能兼得。

楼主尽量降低功耗,使MCU多休眠,但即使使能快速唤醒,模拟电压建立还是要花费一定时间,这是模拟电路本质使然。 既然楼主用到了内部参考电压,而手册也说了一定有这个启动时间,那么从可靠性上讲,就绕不开这个时间。 所以只能尊重手册上的规范。楼主需要在功耗和功能上取舍了。 我这边也没有什么绕过产品规范的方式了,否则一定不可靠。 况且厂家的手册上已经着重做了说明,意味着MCU验证时已经发现到这个时间特征了。

23D6C778.png
iPeanut 回答时间:2022-4-24 10:59:55

butterflyspring 发表于 2022-4-22 16:22
在低功耗模式设计中,运行和休眠对功耗控制来说天生就是一对矛盾。所谓鱼和熊掌不能兼得。</p>
<p>楼主尽量 ...

[md]感谢您的回复。您说的很对。我也想尽量按照手册规范来,以保证可靠性。所以我现在改为如下的方式:ADC初始化还是配置为AUTOFF和WAIT使能,每次ADC采样转换完,关闭ADC,循环判别等待ADEN=0后,将ADC的调压器关闭即将ADVREGEN=0。然后在主循环进入STOP前,将ULP=0不关闭Vrefint,(即不再用ULP=1的方式,因为发现更改这个对我功耗影响不大),同时仍配置为快速唤醒即FWU=1。当用LPTIMER中断唤醒STOP后,在LPTIMER的中断回调函数中,准备开始ADC前,先循环判别等待REGLPF=0,保证主调压器稳定,然后手动置ADC的调压器ADVREGEN=1。然后开启要采样的通道,然后循环判别等待VREFINTRDYF标志=1,保证Vrefint已经正常(测试发现因为ULP=0,所以此时等待判别一次就可以通过,不会等待过长时间)。然后执行开始ADC转换操作(因为我用的AUTOFF和WAIT使能,所以没有执行ADC使能也没有等待ADRDY标志)。等待所需通道转换结束后,执行停止转换,再用ADDIS=1来失能ADC。然后关闭通道。然后循环判别等待ADEN=0后,将ADC调压器手动关闭ADVREGEN=0。然后等待下次的中断进行采样。您看这样的逻辑控制是否有问题吗。谢谢

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