[STM32L1]

慎用STM32L

[复制链接]
4831|40
手机看帖
扫描二维码
随时随地手机跟帖
shizaigaole|  楼主 | 2019-7-22 10:55 | 显示全部楼层 |阅读模式
最近,在做一个低功耗项目,要求休眠唤醒后,最快速度采集3个ADC通道数据,
先前看技术手册,发现STM32L的UA/MHZ运行电流参数非常棒,
结果采用STM32L151,最后功耗很不理想!!!

通过调试发现,主要原因出在STM32L的指令上,例如你只要对一个外设寄存器操作,就要10US以上时间!!!

STM32的低功耗参数确实好看,可是实际他的取外部RAM数据指令太垃圾了。

我用PIC18试验了一下,每ms唤醒一次采样3个通道,然后睡眠,随便写写代码,平均功耗76UA。
用STM32L151实验了一下,同样条件,平均功耗240UA,对库函数代码优化采用寄存器操作,仍然需要142UA。

使用特权

评论回复
评论
xch 2019-7-23 21:10 回复TA
多长时间采集一轮?空闲时进入什么低功耗模式? 
songchenping 2019-7-22 21:37 回复TA
ST不会犯这种低级错误的。看看自己的软件。 
lvyunzeng| | 2019-7-22 11:02 | 显示全部楼层
说道低功耗,还点是TI的MSP430系列的,做了好多量产的表。压力表、水表、燃气表等等。

使用特权

评论回复
gx_huang| | 2019-7-22 13:07 | 显示全部楼层
STM8L的,试过,功耗还行。关键是要自己分析原因,对外设寄存器操作需要10us,肯定是自己的问题。

使用特权

评论回复
shizaigaole|  楼主 | 2019-7-22 14:47 | 显示全部楼层
gx_huang 发表于 2019-7-22 13:07
STM8L的,试过,功耗还行。关键是要自己分析原因,对外设寄存器操作需要10us,肯定是自己的问题。 ...

STM32L151唤醒以后,自动导到4MHZ的MSI时钟,对外设寄存器操作,实际上是个读修改写的过程。发言之前最好自己调查研究一下,否则光凭印象回答问题,既不能解决问题,又不提示作用,不多少是在显摆自己吗??

使用特权

评论回复
shizaigaole|  楼主 | 2019-7-22 14:56 | 显示全部楼层
gx_huang 发表于 2019-7-22 13:07
STM8L的,试过,功耗还行。关键是要自己分析原因,对外设寄存器操作需要10us,肯定是自己的问题。 ...

确实MSP430做的早,专注于低功耗,一般比较靠谱。现在一般片子的静态低功耗都做得不错,往往和MSP430不相上下。
但是实际的低功耗应用,往往ADC外设很重要,牵涉到运行时的功耗,往往指令集也很重要,MSP430都有通盘考虑。

举个例子,msp430de ADC可以在休眠下工作,stmL151就不可以,而且由于其唤醒以后总是接入MSI,而ADC时钟取自HSI,还要在唤醒以后,重新使能HSI时钟,这都无形中增加了额外的运行时间。

stm32L低功耗账面数据真的不错,可实际大打折扣。

使用特权

评论回复
gx_huang| | 2019-7-22 15:08 | 显示全部楼层
shizaigaole 发表于 2019-7-22 14:47
STM32L151唤醒以后,自动导到4MHZ的MSI时钟,对外设寄存器操作,实际上是个读修改写的过程。发言之前最好 ...

应该是你在显摆呀。
你说操作外设寄存器需要10us以上,这说法肯定有问题了,原来是切换时钟的时间。
没研究过32L,我只对你上面的描述有疑问而已。

使用特权

评论回复
gx_huang| | 2019-7-22 15:17 | 显示全部楼层
shizaigaole 发表于 2019-7-22 14:56
确实MSP430做的早,专注于低功耗,一般比较靠谱。现在一般片子的静态低功耗都做得不错,往往和MSP430不相 ...

以下是特意看了一下资料:
The ADC frequency is independent from the CPU frequency, allowing maximum sampling
rate of 1.14 MSPS even with a low CPU speed. The ADC consumption is low at all
frequencies (~25 μA at 10 kSPS, ~200 μA at 1MSPS). An auto-shutdown function
guarantees that the ADC is powered off except during the active conversion phase.
似乎和你说的不一样。

使用特权

评论回复
shizaigaole|  楼主 | 2019-7-22 15:38 | 显示全部楼层
gx_huang 发表于 2019-7-22 15:08
应该是你在显摆呀。
你说操作外设寄存器需要10us以上,这说法肯定有问题了,原来是切换时钟的时间。
没研 ...

不是切换时钟的问题,即使是4MHZ时钟,10US以上也不应该。本质上是其对外设寄存器修改比较耗时。

使用特权

评论回复
shizaigaole|  楼主 | 2019-7-22 15:45 | 显示全部楼层
gx_huang 发表于 2019-7-22 15:17
以下是特意看了一下资料:
The ADC frequency is independent from the CPU frequency, allowing maximum ...

stm32的ADC所谓的自动断电功能,并非休眠时候转换功能。
而且stm32L的ADC启用自动断电功能,在使用16MHZ HSI时钟的情况下,ADC耗电达到630UA,仍然算是非常大的耗电!

使用特权

评论回复
ayl439| | 2019-7-22 16:12 | 显示全部楼层
多年前就发现类似问题了,因为低功耗不仅仅是要求待机功耗低,还要求唤醒工作的时间尽可能短,这点430有明确的描述,其它低功耗类单片机大多语焉不详

使用特权

评论回复
shizaigaole|  楼主 | 2019-7-22 16:22 | 显示全部楼层
ayl439 发表于 2019-7-22 16:12
多年前就发现类似问题了,因为低功耗不仅仅是要求待机功耗低,还要求唤醒工作的时间尽可能短,这点430有明 ...

stm32L的唤醒时间也还行,stop模式下8US,不如430,还过得去。

就是没想到其外设寄存操作那么耗时,比如说启动ADC命令,你要修改ADC外设寄存器的ADON位,

SET_BIT(hadc.Instance->CR2, ADC_CR2_SWSTART);       
这条预计实际上是  hadc.Instance->CR2 |= ADC_CR2_SWSTART;

实际执行包括,读CR2,修改,写回CR2,这个过程4MHZ下,10US以上时间!!!

别的单片机再慢也比这快,没想到其外设寄存器操作那么慢。

使用特权

评论回复
ayb_ice| | 2019-7-22 17:01 | 显示全部楼层
本帖最后由 ayb_ice 于 2019-7-22 17:02 编辑
shizaigaole 发表于 2019-7-22 16:22
stm32L的唤醒时间也还行,stop模式下8US,不如430,还过得去。

就是没想到其外设寄存操作那么耗时,比如 ...

不可能10us的时间,哪怕是4MHZ的频率,这就几条指令而已,

可以看反汇编,可以设断点验证,
极有可能是唤醒后先进入了中断

使用特权

评论回复
e21| | 2019-7-22 17:40 | 显示全部楼层
shizaigaole 发表于 2019-7-22 16:22
stm32L的唤醒时间也还行,stop模式下8US,不如430,还过得去。

就是没想到其外设寄存操作那么耗时,比如 ...

stm32有专门的置位和复位,不用回读的。

使用特权

评论回复
songchenping| | 2019-7-22 21:38 | 显示全部楼层
lvyunzeng 发表于 2019-7-22 11:02
说道低功耗,还点是TI的MSP430系列的,做了好多量产的表。压力表、水表、燃气表等等。 ...

那是在很久以前,其他品牌还没推出低功耗产品的时候。

使用特权

评论回复
icecut| | 2019-7-22 22:21 | 显示全部楼层
mcu的功耗在你整版功耗的占比是多少?

使用特权

评论回复
jcdzxh| | 2019-7-22 22:44 | 显示全部楼层
我比厂家聪明系列

使用特权

评论回复
coody| | 2019-7-22 23:06 | 显示全部楼层
说到低功耗,以前用了多年的凌阳8位MCU,做电子表或计算器,推几十段LCD,电流才3~5uA。

使用特权

评论回复
dog_xin| | 2019-7-23 07:15 | 显示全部楼层
看看SILAB的吧,做手表的蛮多的。

使用特权

评论回复
ayb_ice| | 2019-7-23 08:27 | 显示全部楼层
ayb_ice 发表于 2019-7-22 17:01
不可能10us的时间,哪怕是4MHZ的频率,这就几条指令而已,

可以看反汇编,可以设断点验证,

这种东西还用试吗,反汇编我经常看,最多就是读改写而已,如果用位带技术,还要快些

使用特权

评论回复
wei816| | 2019-7-23 09:05 | 显示全部楼层
可能是库函数降低了执行效率吧,直接用寄存器可能会快一点。
我最近一直在用L031的,stop模式下电流400nA,实测数据和资料一致。
对于工作速度,我只测过浮点运算,都用2M的主频,12ms的运算量用PIC16L1825算,需要60ms。
其他没比较过,就不太清楚了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:衰兰送客咸阳道,天若有情天亦老

146

主题

3727

帖子

11

粉丝