OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2971|回复: 14

大神之路艰辛且漫长,整了一个星期的问题

[复制链接]

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-9-28
在线时间
19 小时
发表于 2017-10-13 17:55:33 | 显示全部楼层 |阅读模式
5金钱
背景:最近项目在测试MCU在Run mode,8Mhz的电流消耗。规格书为:,即开启所有外设功耗:5.9mA,关闭所有外设时钟为:3.7mA.

硬件连接:MCU为STM32F105VCT6,单片机最小系统模块,万用表连接电源。
问题描述:
主函数什么都没有,也没有其他的工程,如下:

int main(void)
{
        while(1)
        {                       
        }
}

这种情况下,使用官方3.5的库,系统时钟已经设置好。测得电流为3.72mA.
那么问题是,如果我在main中随便增加一个函数,如下:
int yyynit(void)
{
     return 0;
}

int main(void)
{
    yyynit();
    while(1)
    {}
}

电流飙升到10.1mA。这是为什么呢?而且如果再加多一个函数。如下:
int main(void)
{
    yyynit();
    yyynit();
    while(1)
    {}
}

又变成3.72mA。不知道有没有大神碰到过这种情况,求解答。




最佳答案

查看完整内容[请看2#楼]

使用ST-LINK或者J-LINK在线调试一下看看,在yyynit()和while处打下断点,然后查看一下反汇编窗口,看一下具体的反汇编代码到底是怎么实现的(这里如要怀疑是编译器优化造成的不同影响,这也是还有一部分人倾向于汇编编程的原因,更底层的还有按照时钟节拍调试的,不多见了,只是听别人说过,现在猜想,估计就是航空航天级别也不会按时钟节拍调试了吧)。 两种程序在断点处记录一下各个寄存器的值和各个外设的地址内容(我估计耗 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2017-10-13 17:55:34 | 显示全部楼层
本帖最后由 mack13013 于 2017-10-15 15:31 编辑
lin993586486 发表于 2017-10-15 11:02
你说的初始化函数是Sysinit()?除了这个没有贴出来,其他都贴出来了,就相当于一个空的工程。除了8M, ...

使用ST-LINK或者J-LINK在线调试一下看看,在yyynit()和while处打下断点,然后查看一下反汇编窗口,看一下具体的反汇编代码到底是怎么实现的(这里如要怀疑是编译器优化造成的不同影响,这也是还有一部分人倾向于汇编编程的原因,更底层的还有按照时钟节拍调试的,不多见了,只是听别人说过,现在猜想,估计就是航空航天级别也不会按时钟节拍调试了吧)。
两种程序在断点处记录一下各个寄存器的值和各个外设的地址内容(我估计耗电主要是这里有差别,比如TIM8的寄存器的各个寄存器,例如TIM8->CR2的实际地址是0x40000000+0x10000+0x3400+0x004,每个具体外设的具体设定都了解一下),具体比较一下。
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2017-10-13 18:27:05 | 显示全部楼层
具体问题具体分析。
你的那几个初始化函数都有什么内容都没贴出来,没办法判断的。

不过这个有位大神在论坛里分享了他的低功耗项目心得,自己去看吧。

分享一个低功耗项目小小心得
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-9-28
在线时间
19 小时
 楼主| 发表于 2017-10-15 11:02:47 | 显示全部楼层
mack13013 发表于 2017-10-13 18:27
具体问题具体分析。
你的那几个初始化函数都有什么内容都没贴出来,没办法判断的。

你说的初始化函数是Sysinit()?除了这个没有贴出来,其他都贴出来了,就相当于一个空的工程。除了8M,设置成其他主频还是会出现这种无端端多出来4-6mA的功耗。还有你分享的连接我看过了,我低功耗情况是使用standby mode,该模式下单纯MCU2.2uA,符合规格书。就是run mode的这莫名其妙多出来的4-6mA,一直查不出问题所在
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2017-10-15 17:15:45 | 显示全部楼层
lin993586486 发表于 2017-10-15 11:02
你说的初始化函数是Sysinit()?除了这个没有贴出来,其他都贴出来了,就相当于一个空的工程。除了8M, ...

还有另外一个方面,对方使用STOP mode实现了低功耗,那可以研究一下stop mode时,具体的操作是怎样的,怎样对寄存器或者内存地址进行了设置,这些设置怎样影响外设的,可以仿做一下。

我没做过这方面的开发,能帮到的就到这里了
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-9-28
在线时间
19 小时
 楼主| 发表于 2017-10-16 09:47:40 | 显示全部楼层
mack13013 发表于 2017-10-15 15:06
使用ST-LINK或者J-LINK在线调试一下看看,在yyynit()和while处打下断点,然后查看一下反汇编窗口,看一下 ...

感谢您的解答,我继续研究一下。
回复

使用道具 举报

头像被屏蔽

12

主题

167

帖子

0

精华

禁止访问

积分
517
金钱
517
注册时间
2017-5-30
在线时间
110 小时
发表于 2017-10-16 10:28:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

头像被屏蔽

12

主题

167

帖子

0

精华

禁止访问

积分
517
金钱
517
注册时间
2017-5-30
在线时间
110 小时
发表于 2017-10-16 10:34:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-9-28
在线时间
19 小时
 楼主| 发表于 2017-10-16 11:01:43 | 显示全部楼层
NULLFF 发表于 2017-10-16 10:28
while空死循环一般执行的是跳转指令比如:B    .
但是,你写了其他函数,这些函数可能会有其它的逻辑算术 ...

谢谢您的回答,也就是说CUP在执行函数调度和执行相关的指令时候,进行的逻辑判断,这涉及到寻址与跳转,期间就会消耗一定的功耗?那么说Datasheet的功耗参数,比如run mode 开启全部外设5.9mA,不就没有实际的价值了?因为在实际使用中一旦有函数跳转,就会增大功耗。
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-9-28
在线时间
19 小时
 楼主| 发表于 2017-10-16 11:07:28 | 显示全部楼层
NULLFF 发表于 2017-10-16 10:34
这么说吧,比如下面的程序:
LocalLoop: NOP
                     NOP

这个我能理解,问题是运算量导致的功耗增加,不应该是以mA级别为单位的。
回复

使用道具 举报

头像被屏蔽

12

主题

167

帖子

0

精华

禁止访问

积分
517
金钱
517
注册时间
2017-5-30
在线时间
110 小时
发表于 2017-10-16 18:24:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

头像被屏蔽

12

主题

167

帖子

0

精华

禁止访问

积分
517
金钱
517
注册时间
2017-5-30
在线时间
110 小时
发表于 2017-10-16 18:28:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

11

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2017-10-16
在线时间
18 小时
发表于 2017-10-16 22:50:49 | 显示全部楼层
楼主好
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-9-28
在线时间
19 小时
 楼主| 发表于 2017-10-17 16:24:07 | 显示全部楼层
NULLFF 发表于 2017-10-16 18:28
所以追究这个也没有太大必要,你只要想办法优化你的代码,把任务快速处理,空闲时间立即进入合适的低功耗模 ...

谢谢您的解答,您的建议我会仔细考虑。
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-9-28
在线时间
19 小时
 楼主| 发表于 2017-10-17 16:30:19 | 显示全部楼层
目前正在考虑使用STM32L系类低功耗单片机。推断多了4-6mA,可能是CM3内核启动了某个单元导致功耗增大,而datasheet的参数,只能说明该芯片在一定条件下能够测到的最低功耗电流。具体原因还未得到证明,待日后找到原因再分享出来。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 05:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表