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

发布者:快乐舞动最新更新时间:2015-11-10 来源: eefocus关键字:低功耗  心得 手机看文章 扫描二维码
随时随地手机看文章
      前两个月在公司做了一个低功耗项目,现在功耗最低10uA不到,平均功耗40uA左右,算是达标了。因为是公司产品,就不方便贴代码、原理图了,该产品是一个小模块,可以方便的嵌入到各种系统里面。跟原子哥他们卖的NRF2401类似,是一个读卡器。

      做这个项目中间也请了技术支持,因为外围电路芯片的功耗一直降不下来,经过与对方的反复交流,对方提供了低功耗的测试结果、硬件方案、软件方案,经过修改测试,最终成为我们的产品,功耗比较满意。
      硬件方案选择的是STM32,外加某公司的读卡芯片。前期完成了读卡等功能的开发,最后一项开发内容是最艰巨也是最困难的---低功耗。在开发过程中,从硬件设计上不断裁剪元器件,软件上不断精简代码,功耗最低都保持在3-4mA。

      电路设计上,只用到了一个LED、串口1、一个模拟SPI、一个中断线、一个读卡芯片RESET线,硬件上就只剩下这么点东西了,这个时候我采用的是待机模式,使用的是读卡芯片的中断接PA0唤醒STM32,在此之前要先使得读卡芯片进入低功耗、然后STM32进入低功耗,这一步完成了,貌似没什么问题,功耗确实从几十mA骤降到3mA左右,开始还挺满意的,但是测试厂商提供的样板,功耗却只有几十uA,有点郁闷了。为什么会这样?反复查看硬件、程序,都找不出原因,而且这个时候的工作效果很烂,根本就不能唤醒,所以我就怀疑是读卡芯片一端低功耗有问题,因为我将PA0脚直接短接VCC,这样就可以产生一个边沿触发STM32唤醒了,但是用读卡芯片无法唤醒,所以我怀疑是读卡芯片的RESET脚电平不对,经检查,确实是因为RESET脚加了上拉电阻,读卡芯片是高电平复位,在STM32进入待机后,管脚全都浮空了,导致RESET被拉高,一直在复位;我去掉上拉电阻,觉得很有希望解决问题了,但是测试结果是:有时候能唤醒,有时候不能,我仔细一想难道是因为STM32待机后管脚电平不确定,导致读卡芯片RESET脚电平不定,而工作不正常,看样子只有换用其他方案了。后面确实验证了我的想法,使用STOP模式后,唤醒问题引刃而解。
     就在关键时刻,芯片原厂火种送炭,送来急需的技术支持资料,一个包含低功耗源代码,赶紧拿过来测试,先研读下代码,使用的是STOP模式,而不是待机模式,使用的是任意外部中断唤醒,功耗低制40uA,这个时候就相当激动啊,赶快下载测试啊,结果功耗确实降了,但还是有1mA,更人家一比多了几十倍啊。。。
    我第一反应是硬件不对,经过测试修改,首先找到第一个原因,读卡芯片RESET管脚上拉电阻又给焊上去了...,拆掉后功耗骤降到几百uA,还是不行。。 测试过程中,为了去掉LDO的干扰,整板采用3.3V供电,但是后面经过测试,LDO的功耗其实也只有5uA不到,这LDO功耗值得赞一个;虽然结果还是没达到预期,但是看到了希望,胜利就在眼前啊。
    为此我反复看了技术支持提供的程序,发现他们的STM32的所有管脚都的设置都有所考究:(因为公司保密原则,代码中删除掉了关于该读卡芯片的前缀信息等)

GPIO_InitTypeDef GPIO_InitStructure; 
  
  /* GPIOA Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  /* GPIOB Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  /* GPIOC Periph clock enable */
  //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 
  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  //####################################################
  //USART1 Port Set
  //TXD 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  //RXD
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  //RST output pushpull mode
  GPIO_InitStructure.GPIO_Pin = TRST;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(PORT1, &GPIO_InitStructure);
  //IRQ input pull-up mode
  GPIO_InitStructure.GPIO_Pin = TIRQ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(PORT1, &GPIO_InitStructure);
  //MISO input pull-up mode
  GPIO_InitStructure.GPIO_Pin = MISO;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(PORT2, &GPIO_InitStructure);  
  //NSS,SCK,MOSI output pushpull mode
  GPIO_InitStructure.GPIO_Pin = (NSS|SCK|MOSI);
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(PORT2, &GPIO_InitStructure);
  //############################################################################
  //TEST Port set
  //TESTO input pushpull mode
  GPIO_InitStructure.GPIO_Pin = TESTO;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(TEST_PORT, &GPIO_InitStructure);
  //############################################################################
  //TEST Port set
  //TESTI output pushpull mode
  GPIO_InitStructure.GPIO_Pin = TESTI;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(TEST_PORT, &GPIO_InitStructure);
  //############################################################################
  //LED Port Set
  //LED output pushpull mode
  GPIO_InitStructure.GPIO_Pin = LED;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(LED_PORT, &GPIO_InitStructure);
  
  //############################################################
  GPIO_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);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

 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);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
首先,想MOSI、SCK、CS、LED、RST这些管脚应该设置为推挽输出,TXD设置为复用输出,而IRQ、RXD、MISO设置浮空输入,什么都没接的管脚全都设置为下拉输入,而TESTI、TESO我一直不解是什么东东,开始就没管,而开始的时候MISO我也没怎么注意,设置成上拉输入(而不是浮空输入),反正大部分按照厂家提供的参考,我并没有照搬,测试效果一样,但功耗确是还有80-90uA,期间我找了好久没找到原因,给技术支持一看,原来是因为MISO没有设置成浮空输入,我是设置成了上拉输入,上拉电阻一直在消耗大约40uA的电流。。。 好吧,这是自己不够细心导致的,以后做低功耗的项目管脚配置是个大问题,不能再这么马虎了!!! 我将MISO设置成浮空输入之后,最低功耗还是有40+,离10uA的最低功耗还有段距离,到底是为什么呢?最后我发现

,该读卡芯片有个TESTIN/TESTOUT管脚,是用来测试用的,出厂后也就用不上了,我也一直以为这两个脚确实没什么用,就没接;可是我发现厂家提供的样板居然接了这两个脚,但是厂商也没说这两个脚接或不接会影响功耗啊,抱着试一试的心态,我我把TESTIN/TESTOUT两个管脚接到单片机上进行相应的配置,接下来是见证奇迹的时刻了,功耗居然真的、真的降到10uA了。。。。。。。。。。。 此处省略n个字
     这时候真的很激动,真的很想骂人啊,坑爹的厂家,为什么不给提示说这两个脚不接单片机会消耗电流呢?(也许是文档里面提到了,但是几百页的文档,还是全英文的,一堆堆的文字,我再看一遍,确实没有提到这两个管脚会有漏电流。)
    项目就这样完工了,中间最重要的是技术支持的强力支持,不然项目不能完工了,这个项目低功耗STM32方面难度不高,主要是读卡芯片上面的低功耗调试起来问题很多,还是人家原厂的出马才解决了问题,因为众多原因,不能公布该芯片的资料,包括该芯片怎么进入低功耗也无法公开,所以抱歉~~。
    关于STM32进入低功耗,我简单的总结了一下:
1.管脚设置,这个很关键,还是跟你电路有关系,外加上拉、下拉电阻切记不能随便加
2.STM32的systick clock、DMA、TIM什么的,能关就全都关掉,STM32低功耗很简单,关键是外围电路功耗是关键
3.选择一个低功耗的LDO,这个项目用到的LDO功耗就很不错,静态功耗10uA都不到。
4.确定STM32设置没问题,进入低功耗有好几种情况可以选择(睡眠、停机、待机),我还是推荐选择STOP模式,这个我觉的比较好是因为可以任意外部中断都可以唤醒,而且管脚可以保留之前的设置,进入停机模式的代码使用库函数自带的,就一句:

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
意思是,在进入停机模式之前,也关掉电压调节器,进一步降低功耗,使用WFI指令(任意中断唤醒),但是经过测试,使用WFE(任事件唤醒)指令效果、功耗一模一样。
最后一步是从STOP模式怎么恢复了,恢复其实也很简单,外部中断来了会进入中断函数,然后STM32就被唤醒,唤醒还要做一些工作,需要开启外部晶振(当然你也可以选择使用内部自带振荡器)、开启你需要的外设等等。

    总之,低功耗关键我觉得还是在于管脚配置,以及你对于外围电路的掌握。

关键字:低功耗  心得 引用地址:分享一个低功耗项目小小心得

上一篇:STM32的低功耗设计
下一篇:完成stm32 上HID的应用

推荐阅读最新更新时间:2024-03-16 14:38

stm8L051低功耗采集电池电量ADC例程
自己记录一下,以防以后用 uint ADC_ReadValue(uchar channel) { uchar i; static uint ADC_Buf ; uint vrefint; ulong adcValue; CLK_PCKENR2 = CLK_PCKENR2 | 0X01; //使能外设ADC的时钟,之后对ADC的寄存器操作有效 ADC1_CR1 = 0x01; //开启AD模块电源,使用Sing mode; ADC1_CR2 = 0X02; //使用MCU系统时钟频率作ADC的时钟; ADC1_TRIGR1 |= 0x10; //使能内部参考电压 ADC1_SQR
[单片机]
USART从低功耗模式唤醒STM32F0
STM32F0的低功耗模式 详细内容见参考手册—Power control (PWR) 在STM32应用中,为了降低功耗共有以下三种工作模式: Sleep mode CPU clock off, all peripherals including ARM® Cortex®-M0 core peripherals like NVIC, SysTick, etc. are kept running.. In Sleep mode, only the CPU is stopped. All peripherals continue to operate and can wake up the CPU when an inte
[单片机]
USART从<font color='red'>低功耗</font>模式唤醒STM32F0
帮企业进行EMI、低功耗、射频性能等测试 世强实验室
很多公司发现他们的电子产品在批量生产前常常栽倒在最后一关,即符合EMC要求。符合EMC标准的结果在设计上是可控的,能够做出规划。只要解决EMI就能完美化解这一难题。但对于很多的中小微创企业而言,在产品没有量产前就靠自己去购买示波器等仪器来进行检测,性价比是极低的,而且没有专业资深的技术专家提供技术支持,靠自己的去摸索检测往往也要浪费掉大量的时间。 所以,大量的中小企业选择专业的测试测量实验室,或者是靠工程师的经验去推测哪里有问题。前者常常面临着费用高昂、排队时间长的问题,而后者则更像一场豪赌,靠经验去猜测哪里有问题,从而进行整改。 面对这样的困境,中国电子行业最优秀的半导体&元器件技术供应商世强联合示波器产品创新的领导品牌
[嵌入式]
电子方式盗车将不再可能 IMEC推新型低功耗蓝牙测距技术
据外媒报道,欧洲微电子研究中心(IMEC)为安全、被动非接触式车钥匙推出的新型低功耗蓝牙(BEL)技术,可让以电子方式盗车的行为变得“不可能”。 据外媒报道,欧洲微电子研究中心(IMEC)为安全、被动非接触式车钥匙推出的新型低功耗蓝牙(BEL)技术,可让以电子方式盗车的行为变得“不可能”。据该研究中心所说,IMEC的解决方案准确度高,而且满足最高的安全要求,阻止人们以电子方式盗车。该解决方案使用标准芯片技术,可大规模应用于汽车、智能手机或是智能建筑的传感器中。欧洲微电子研究中心是全球纳米电子和数字技术领域内最重要的研究和创新中心,总部设在比利时鲁汶(Leuven)和荷兰埃因霍芬(Eindhoven)。 IMEC物联网主管K
[汽车电子]
电子方式盗车将不再可能 IMEC推新型<font color='red'>低功耗</font>蓝牙测距技术
能量收集、超低功耗、无线充电,可穿戴设备离不开我们仨
2014年,可穿戴设备成为消费者的新宠,预示着另一种先进的电子消费品正在普及中,或许从苹果发布的吸引眼球的Apple Watch可以说明一二。但是,我们明显看到,可穿戴设备的电池续航依旧显得差强人意,解决掉电池续航问题,或许才能够真正促进可穿戴设备大热。 我们知道,可穿戴设备的上下游产业技术涉及传感器、存储器、电池、触控模组、语音交互技术、体感相关产品等诸多环节,而其中,最影响使用体验的莫过于功耗问题,我想,谁也不愿意自己的智能手表要每天充电吧?故此,我们认为,超低功耗技术、能量采集技术、无线充电技术将是三大要素。 德州仪器高性能模拟半导体产品部电池管理产品市场及应用经理文司华博士亦认为:功耗、电池寿命都是阻碍可穿戴设备市
[嵌入式]
低功耗无线收发集成芯片CC1000
摘要:介绍一种无线收发集成芯片CC1000的电路结构及典型的应用设计;着重说明CC1000与微控制器通信所要求的时序。 关键词:无线收发 可编程 跳频 CC1000 引 言   CC1000是根据Chipcon公司的SmartRF技术,在0.35μm CMOS 工艺下制造的一种理想的超高频单片收发通信芯片。它的工作频带在315、868及915MHz,但CC1000很容易通过编程使其工作在300~1000MHz范围内。它具有低电压(2.3~3.6V),极低的功耗,可编程输出功率(-20~10dBm),高灵敏度(一般-109dBm),小尺寸(TSSOP-28封装),集成了位同步器等特点。其FSK数传可达72.8Kbps,具有25
[应用]
Qualcomm推出面向下一代家庭娱乐体验连接与参考平台解决方案
2016年9月1日,德国柏林 Qualcomm Incorporated(NASDAQ: QCOM)今日在2016年柏林国际电子消费品及家电展览会(IFA 2016)上宣布,其子公司Qualcomm Technologies, Inc.推出两款面向家庭娱乐的解决方案,分别是支持双流Wi-Fi 802.11ac和Bluetooth 4.2的QCA9379整合芯片,以及采用旗舰级Qualcomm 骁龙 820处理器的4K超高清媒体盒(Media Box)参考设计。以上两款解决方案旨在于即将推出的媒体流终端、机顶盒和智能电视产品中支持交互式、参与式的媒体体验,并拓展公司在家庭娱乐领域的产品组合。该产品组合还包括无线遥控器和配件中使用的C
[物联网]
TI推出业界最低功耗 SATA 3 Gbps 再驱动器
德州仪器 (TI) 宣布推出一款可提升 SATA 主机与 eSATA 连接器之间互连距离的超低功耗、双通道 SATA 3 Gbps 再驱动器与信号调节器。该 SN75LVCP412A 可提供业界最具竞争力的低功耗特性,能够在链接超过 10 微秒闲置时自动使器件进入低功耗模式(小于 20 mW)。该功能有助于延长移动应用中的电池使用寿命,满足其对电池使用寿命的高优先级需求。SN75LVCP412A 支持笔记本、台式电脑、扩展与工作站、机顶盒以及服务器等不同应用。 SN75LVCP412A 的主要特性与优势: • 自动低功耗模式可在移动平台未连接至外部硬盘驱动时节省宝贵的电量,延长电池使用寿命; • 高速引脚通过 IEC61
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved