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

【原创】【MCU实战经验】分享一个低功耗项目小小心得

[复制链接]
xiao zhang-2012 发布时间:2014-4-30 14:54
只看帖不发帖是不好的,我也来发发帖子吧,写的不好谅解啊。
$ N+ s7 I# H7 t! v0 i" t前两个月在公司做了一个低功耗项目,现在功耗最低10uA不到,平均功耗40uA左右,算是达标了。因为是公司产品,就不方便贴代码、原理图了,该产品是一个小模块,可以方便的嵌入到各种系统里面。跟原子哥他们卖的NRF2401类似,是一个读卡器。
0 L' g2 V9 n4 C2 R7 N做这个项目中间也请了技术支持,因为外围电路芯片的功耗一直降不下来,经过与对方的反复交流,对方提供了低功耗的测试结果、硬件方案、软件方案,经过修改测试,最终成为我们的产品,功耗比较满意。# D2 t7 E' j7 @
硬件方案选择的是STM32,外加某公司的读卡芯片。前期完成了读卡等功能的开发,最后一项开发内容是最艰巨也是最困难的---低功耗。在开发过程中,从硬件设计上不断裁剪元器件,软件上不断精简代码,功耗最低都保持在3-4mA。
9 I$ a& }' P" \  C4 W9 U6 \ 
  S7 @" G! |* ~) M' A& w电路设计上,只用到了一个LED、串口1、一个模拟SPI、一个中断线、一个读卡芯片RESET线,硬件上就只剩下这么点东西了,这个时候我采用的是待机模式,使用的是读卡芯片的中断接PA0唤醒STM32,在此之前要先使得读卡芯片进入低功耗、然后STM32进入低功耗,这一步完成了,貌似没什么问题,功耗确实从几十mA骤降到3mA左右,开始还挺满意的,但是测试厂商提供的样板,功耗却只有几十uA,有点郁闷了。为什么会这样?反复查看硬件、程序,都找不出原因,而且这个时候的工作效果很烂,根本就不能唤醒,所以我就怀疑是读卡芯片一端低功耗有问题,因为我将PA0脚直接短接VCC,这样就可以产生一个边沿触发STM32唤醒了,但是用读卡芯片无法唤醒,所以我怀疑是读卡芯片的RESET脚电平不对,经检查,确实是因为RESET脚加了上拉电阻,读卡芯片是高电平复位,在STM32进入待机后,管脚全都浮空了,导致RESET被拉高,一直在复位;我去掉上拉电阻,觉得很有希望解决问题了,但是测试结果是:有时候能唤醒,有时候不能,我仔细一想难道是因为STM32待机后管脚电平不确定,导致读卡芯片RESET脚电平不定,而工作不正常,看样子只有换用其他方案了。后面确实验证了我的想法,使用STOP模式后,唤醒问题引刃而解。) D9 V8 ?0 e+ h# y( {$ E# K
就在关键时刻,芯片原厂火种送炭,送来急需的技术支持资料,一个包含低功耗源代码,赶紧拿过来测试,先研读下代码,使用的是STOP模式,而不是待机模式,使用的是任意外部中断唤醒,功耗低制40uA,这个时候就相当激动啊,赶快下载测试啊,结果功耗确实降了,但还是有1mA,更人家一比多了几十倍啊。。。
+ D) ?/ z+ `& [" L4 q我第一反应是硬件不对,经过测试修改,首先找到第一个原因,读卡芯片RESET管脚上拉电阻又给焊上去了...,拆掉后功耗骤降到几百uA,还是不行。。 测试过程中,为了去掉LDO的干扰,整板采用3.3V供电,但是后面经过测试,LDO的功耗其实也只有5uA不到,这LDO功耗值得赞一个;虽然结果还是没达到预期,但是看到了希望,胜利就在眼前啊。
2 W3 G6 e8 a# g! G为此我反复看了技术支持提供的程序,发现他们的STM32的所有管脚都的设置都有所考究:(因为公司保密原则,代码中删除掉了关于该读卡芯片的前缀信息等)
& P. E. I4 P/ u% T; n. G# x0 kGPIO_InitTypeDef GPIO_InitStructure;
- E7 @( C: f1 n( b* @$ p
, m/ i( b+ K$ L8 D# a' ]7 {/* GPIOA Periph clock enable */  u* j  ^5 g0 w5 `8 x* c
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
5 v5 I/ z: ?- O! N( e/* GPIOB Periph clock enable */0 |- c: L# V7 h2 v. U( k  I: ?' V
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/ B  T, M8 a) k6 G2 S+ {; J/* GPIOC Periph clock enable */' b, O* `" p2 H
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
5 `1 E% W2 H: L* B0 C" R* w) X  B4 i* {" _$ u6 G! N7 `
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); ; E! f  r0 u/ H: b9 ?
% U6 r& A4 r% K% b, U& F
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);2 c5 C1 C% x. X3 o$ Z8 \; V4 T
//####################################################
# r' T, r  F+ z! X# M: @4 f4 Z//USART1 Port Set
! H" Z2 k. i8 ~//TXD 0 k; c, Y1 Z; d6 S$ j
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;$ ^" J. R5 F) @7 `7 X- N$ B1 P
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
" v& ?" p2 S" ]. YGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;, z/ W* P! [) |
GPIO_Init(GPIOA, &GPIO_InitStructure);/ ~4 W: l3 z9 Y9 ^
//RXD/ K% z, d; ]1 {( j
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;5 b! C2 K- i4 r
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
4 L) e% v( F3 A! w* BGPIO_Init(GPIOA, &GPIO_InitStructure);$ n9 Y. u# D. {" }) h1 N6 C3 z
* b! V/ w- z9 y; j, c
//RST output pushpull mode8 O% _! k& y( S& {) t
GPIO_InitStructure.GPIO_Pin = TRST;
) o; x: n/ P  \( Q: FGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;$ ~' Y; K; p! X/ N$ Q( j) `, C
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
! p  y9 p6 [( q" {- L4 bGPIO_Init(PORT1, &GPIO_InitStructure);
) e( h7 @0 s; {( W//IRQ input pull-up mode& X! x! g' ]9 W/ c' e; s# f
GPIO_InitStructure.GPIO_Pin = TIRQ;
/ g4 u" m. |7 }; oGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;: `) }( l2 d3 \2 S7 Y  f
GPIO_Init(PORT1, &GPIO_InitStructure);
1 g) e3 C% M# E# A//MISO input pull-up mode, u4 ?6 f+ f! a' q
GPIO_InitStructure.GPIO_Pin = MISO;
, Z& }1 `$ ?0 N! MGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;* A6 [; }3 Q9 c1 f
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
5 s8 s# ^4 K: u6 s+ z, C0 \7 kGPIO_Init(PORT2, &GPIO_InitStructure); : n. q9 H/ T4 t2 B5 S/ h% T
//NSS,SCK,MOSI output pushpull mode' A5 U, o; M) v
GPIO_InitStructure.GPIO_Pin = (NSS|SCK|MOSI);6 p2 I) X, H  @2 F! N7 X, I  l
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
, M2 W! K$ [8 ^GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
4 P& q# B1 [, w: r& `2 fGPIO_Init(PORT2, &GPIO_InitStructure);
( Y) z4 ?: @( u4 x) R3 s7 U& _" F//############################################################################9 F4 q/ w% A2 M1 q3 F- l- H  p, ?
//TEST Port set" H/ y( k: a1 O3 d* q: T$ ]$ P
//TESTO input pushpull mode
3 |6 R  _7 Q' q$ r1 A9 H% G: r/ _GPIO_InitStructure.GPIO_Pin = TESTO;# n7 e: @' [" ~0 ~2 z- ~
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;9 Z5 r' k- _9 u4 Z6 b4 A0 d) [8 `
GPIO_Init(TEST_PORT, &GPIO_InitStructure);9 X; ~9 ~8 R5 q' D8 Z$ j
//############################################################################) ^, A6 z5 u% V5 r+ X5 W
//TEST Port set; w/ R9 l( F( D3 N3 u& g
//TESTI output pushpull mode
7 ?9 M+ }4 i8 x1 H3 yGPIO_InitStructure.GPIO_Pin = TESTI;
/ S8 l7 y4 H$ k  o5 p: i: F5 [GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;3 z" Q2 k" ^( g; O: k  ]
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
3 V7 X1 f! l4 X' W% K8 m, bGPIO_Init(TEST_PORT, &GPIO_InitStructure);2 H3 y5 h& d3 m7 z( r" ]( h# k& i
//############################################################################
2 J7 Z3 N) @9 V/ d//LED Port Set8 D  E' S5 }  g0 ]  Q% G) O! q
//LED output pushpull mode5 _7 ]  C5 [% `; ~
GPIO_InitStructure.GPIO_Pin = LED;8 A2 H1 [( T) i
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;4 t( N' S& h; R) d9 L2 V
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;4 ]4 B' d: Y$ Z- _
GPIO_Init(LED_PORT, &GPIO_InitStructure);
) i$ s( j' N" Q; |* ]2 A) V& L' e7 a3 H1 O
//############################################################
8 z/ f+ e- K% L7 BGPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);
; V* U! J* L7 CGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
& q2 u6 |. x) MGPIO_Init(GPIOA, &GPIO_InitStructure);
9 K2 n% K& J; L  N$ l, l; n7 C3 G) K7 n& J" }2 h$ a7 y
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);
4 m, A7 c/ w6 i8 b) V' V8 [GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
6 t1 }$ f2 w! k. qGPIO_Init(GPIOB, &GPIO_InitStructure);8 |  U$ p( y9 Y) y9 W( I# M

; c' V/ N8 Z3 i7 l6 }7 s: Y% F8 UGPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
% w; o. F; m' tGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
% \8 k1 b7 q& N$ u; K7 ^, ~0 V* @GPIO_Init(GPIOC, &GPIO_InitStructure);& ?% z1 _! I0 T, f" }2 W5 l8 [
首先,想MOSI、SCK、CS、LED、RST这些管脚应该设置为推挽输出,TXD设置为复用输出,而IRQ、RXD、MISO设置浮空输入,什么都没接的管脚全都设置为下拉输入,而TESTI、TESO我一直不解是什么东东,开始就没管,而开始的时候MISO我也没怎么注意,设置成上拉输入(而不是浮空输入),反正大部分按照厂家提供的参考,我并没有照搬,测试效果一样,但功耗确是还有80-90uA,期间我找了好久没找到原因,给技术支持一看,原来是因为MISO没有设置成浮空输入,我是设置成了上拉输入,上拉电阻一直在消耗大约40uA的电流。。。 好吧,这是自己不够细心导致的,以后做低功耗的项目管脚配置是个大问题,不能再这么马虎了!!! 我将MISO设置成浮空输入之后,最低功耗还是有40+,离10uA的最低功耗还有段距离,到底是为什么呢?最后我发现5 P: F& g6 a" E% E7 u4 i) f
,该读卡芯片有个TESTIN/TESTOUT管脚,是用来测试用的,出厂后也就用不上了,我也一直以为这两个脚确实没什么用,就没接;可是我发现厂家提供的样板居然接了这两个脚,但是厂商也没说这两个脚接或不接会影响功耗啊,抱着试一试的心态,我我把TESTIN/TESTOUT两个管脚接到单片机上进行相应的配置,接下来是见证奇迹的时刻了,功耗居然真的、真的降到10uA了。。。。。。。。。。。 此处省略n个字
2 `  I- F5 E& k- f6 I这时候真的很激动,真的很想骂人啊,坑爹的厂家,为什么不给提示说这两个脚不接单片机会消耗电流呢?(也许是文档里面提到了,但是几百页的文档,还是全英文的,一堆堆的文字,我再看一遍,确实没有提到这两个管脚会有漏电流。)
! E/ M2 S3 \9 t+ g6 v项目就这样完工了,中间最重要的是技术支持的强力支持,不然项目不能完工了,这个项目低功耗STM32方面难度不高,主要是读卡芯片上面的低功耗调试起来问题很多,还是人家原厂的出马才解决了问题,因为众多原因,不能公布该芯片的资料,包括该芯片怎么进入低功耗也无法公开,所以抱歉~~。6 v2 A6 i# V7 j8 ?1 w
关于STM32进入低功耗,我简单的总结了一下:- Q1 ^- o/ n; L  z; B
1.管脚设置,这个很关键,还是跟你电路有关系,外加上拉、下拉电阻切记不能随便加4 H+ j; t* U7 f5 J4 k1 K" U" D
2.STM32的systick clock、DMA、TIM什么的,能关就全都关掉,STM32低功耗很简单,关键是外围电路功耗是关键: `+ Y/ E( L0 B7 X8 i0 e& l
3.选择一个低功耗的LDO,这个项目用到的LDO功耗就很不错,静态功耗10uA都不到。
1 I, l9 V" ?7 Z& u4.确定STM32设置没问题,进入低功耗有好几种情况可以选择(睡眠、停机、待机),我还是推荐选择STOP模式,这个我觉的比较好是因为可以任意外部中断都可以唤醒,而且管脚可以保留之前的设置,进入停机模式的代码使用库函数自带的,就一句:5 ]1 x# `( {  Q* }& K' b
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
9 [0 g* A% S" P; x, u2 [$ S意思是,在进入停机模式之前,也关掉电压调节器,进一步降低功耗,使用WFI指令(任意中断唤醒),但是经过测试,使用WFE(任事件唤醒)指令效果、功耗一模一样。
! a0 D7 x9 L4 h& {% Z最后一步是从STOP模式怎么恢复了,恢复其实也很简单,外部中断来了会进入中断函数,然后STM32就被唤醒,唤醒还要做一些工作,需要开启外部晶振(当然你也可以选择使用内部自带振荡器)、开启你需要的外设等等。/ T6 C5 w8 Z9 ^. j. R7 D- Q
 
, u" g7 M8 J  C3 L* ~; A0 O总之,低功耗关键我觉得还是在于管脚配置,以及你对于外围电路的掌握。
收藏 2 评论1 发布时间:2014-4-30 14:54

举报

1个回答
xiao zhang-2012 回答时间:2014-4-30 14:53:42

RE:分享一个低功耗项目小小心得

原帖是发在Openedv上面的,现在我自己转到与非网上面来。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版