找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[M0] NANO功耗Application Note_V1.12

[复制链接]
跳转到指定楼层
楼主
admin 发表于 2014-4-29 17:16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
NANO功耗Application Note_V1.12.docx (200.14 KB, 下载次数: 6174)



    
Document  Information
  
    
Abstract
      
该文档介绍nano中,怎样调进入超低功耗模式时的功耗.
  
    
Apply to
      
Nano Series.
  



    
Table of  Contents
  
    
                                                
  



1      介绍

Nano系列是以Cotex-m0为内核的超低功耗MCU。进入深度睡眠模式时,所有IP都关闭的情况下的功耗为1uARTC和段式LCD屏都工作的情况下功耗10uA左右。客户的系统中往往不止MCU一颗IC,怎样让系统进入深度睡眠模式时的功耗最低?一直是客户问的最多的问题,也是问题最多的地方。本文介绍一些原则和调试的方法,希望对大家有帮助。




1.1    寄存器

涉及到的寄存器包括:


  • PWRCTL、AHBCLK和APBCLK寄存器。
    • PWRCTL查看内部10K(LIRC)和外部32K(LXT)是否关闭,如果不需要使用就关闭。这两个晶振硬件不会帮忙关闭,需要软件自行关闭。
    • AHBCLK和APBCLK中查看开启的IP,掉电模式下不需要工作的IP,把相应的时钟也关闭

  • GPIO中的PMD(模式寄存器),OFFD(关闭数字通路寄存器),PUEN(使能内部上拉)寄存器。
  • 系统中的IO功能设定寄存器MFP





1.2     原则

  • 进入power down时LDO引脚的电压会从1.8V变成1.6V。
    • 如果LDO电压变成1.6V才说明NANO进入了低功耗模式。
    • 如果量到1.8V,则表示或者是进入低功耗的函数不对,或者进入了低功耗但是系统又被唤醒了。

  • 不用的引脚统统设为GPIO,INPUT模式,并使能内部上拉(PUEN)
  • 状态需要保持的引脚(保持输出低电平/高电平,或者保持输入低电平/高电平),切成GPIO功能,模式维持不变,同时不要使能内部上拉。
    • 输入的引脚要特别小心,确认输入的电压是0或者VDD不能是中间的其它值,否则会漏电。如果切成输入的引脚输入的电压不确定,需要关闭数字通路(OFFD)

  • 晶振引脚保持配置为晶振模式,即使没有外接晶振。在powerdown的时候都要设为晶振模式,并且不能打开内部上拉。但是如果外部没有接晶振,一定不能使能晶振(PWRCON),否则会漏电。
  • ICE_DAT和ICE_CLK脚切为GPIO功能,INPUT模式,并打开内部上拉。
  • 外接的段式LCD屏,power down时需要保持显示的话,LCD引脚需要保持LCD模式,并关闭相应引脚的数字通路。但是如果powerdown时不需要屏继续显示,相应COM/SEG/DH1/DH2/LCD_V1/LCD/_V2/LCD_V3 引脚需要设为GPIO功能,INPUT模式,并关闭相应引脚的数字通路。
  • 模拟外设需要软件自行将功能关闭。例如:ADC需要将ADCR寄存器的ADEN清0。并且将模拟引脚设为输入模式(PMD),切成GPIO功能(MFP),并关闭数字通路(OFFD)。
  • 内部10K和外部32K,power down时不需要的话,软件应该自行关闭。
  • 关闭片外IC的电源或者让其进入power down。与片外IC相连的MCU引脚处理原则如下
    • 引脚是输出状态的,切成GPIO功能之后输出低电平。例如SPI_CS,SPI_CLK,SPI_MISO和SPI_MOSI  4根引脚,切成GPIO功能,输出模式,并输出低电平。
    • 需要片外IC通过GPIO唤醒NANO的,该GPIO引脚保持输入模式不要动,也不要打开内部上拉(PUEN)。
    • 如果片外IC的电源是关闭的,需要把与之相连的引脚都切成GPIO功能,并输出0

  • 检查板子上所有接地的部分,是否有可能从电源到地形成通路。如果必须形成通路,尽量把电阻调大一点,这样漏电会小一些



1.3    NANO的行为

进入powerdown的时候,MCU会帮忙关闭HIRC(内部高频晶振)和HXT(外部高频晶振)两个高频晶振,软件不要去控制这两个晶振。外部32K和内部10K需要软件自己关闭。


这就导致使用HIRCHXT为时钟源的外设在进入powerdown的时候会自动停止工作,但是使用外部32K或者内部10K作为时钟源的外设需由软件决定在系统进入powerdown的时候是否仍然工作。例如:系统进入powerdown的时候,RTCWDT仍然工作,这就需要不能关闭32K10K晶振。


但是模拟外设是个特例,因为模拟电路工作不需要时钟。所以如果模拟外设功能使能,MCU虽然将晶振关闭,但是模拟电路部分仍会耗电。例如:ADC,系统进入power down之前需要写控制寄存器ADCR->ADENADC功能关闭,否则会漏电


如果进入powerdown的时候如果引脚设定有问题,NANO中每个IO脚漏电大概20uA,这也是一个线索。


1.4    漏电电路

1.4.1    电路一

                              


该电路从VCC->R35->R11->R12->R13形成一个通路。假设VCC=3.3V,这里漏电3.3/3 = 1.1uA


这个是LCD的驱动电路,考虑到驱动能力,加1M可能已经差不多了。大家明白这里会耗电1.1uAOK了。




1.4.2   电路二



该电路从VCC->R1->R2形成通路,假设VCC=3.3V,这里漏电3.3/2 = 1.65uA


该电路是测量电源电压的电路,ADCCHECK引脚接到ADC0模拟输入引脚,power down的时候需要将ADCCHECK引脚切为输入模式(PMD)GPIO功能(MFP),并关闭数字通路(OFFD)。解决办法:


  • R1和R2尽量用大一点的电阻
  • 如果GPIO口有剩余,将VCC接GPIO,不用的时候将IO设成输入,关闭数字通路OFFD,但是不要打开内部上拉。





1.4.3   电路三





该电路从UART1_RXD->R56形成通路,假设VCC=3.3V,这里漏电3.3/1 = 3.3uA


解决办法:powerdown时,将UART1_RXD引脚设为INPUT模式,但是不要打开内部上拉。




1.5     常见问题

  • 打开GPIO的内部上拉,功耗反而变高
  • 打开内部上拉,功耗降低,但是耗电仍然偏高
  • 功耗会飘,手靠近板子,功耗会忽高忽低
  • Power down时,LCD和RTC保持显示,正常情况下功耗应该是10uA左右,但是测得功耗16uA
  • 大多情况下进入power down的功耗都是正常的6uA左右,但是某次进入power down时的功耗会高达1mA



1.6    调试方法

1.6.1   打开IO口的内部上拉,功耗反而变高

说明引脚有下拉,这个下拉可能是内部也可是外部。该引脚输出低电平时芯片内部是接地的,如果忘记将该引脚设为INPUT模式,内部就是下拉的,就会导致漏电。


外部有下拉不一定是明显的引脚加电阻接地,可能是外部芯片在输出低。


  • 如果是MCU在输出低,power down的时候不需要输出低了,就设为INPUT并打开内部上拉。
  • 如果需要保持输出低,该引脚就维持输出不要动它。
  • 如果是外部芯片拉低的,该引脚就切成GPIO功能,INPUT模式,但是不要打开内部上拉。



1.6.2   打开内部上拉,功耗降低,但是耗电仍然偏高

这就要考虑两种情况


  • 是否OFFD没有关
  • 是否ADC没有关
    OFFD没有关,如果LCD使能,就会导致漏电
    ADC没有关,也会漏电



1.6.3   功耗会飘,手靠近板子,功耗会忽高忽低

这个问题的原因比较多,列出可能的3个原因


  • 可能是晶振引脚和ICE引脚设定不正确



进入power down的时候


  • 晶振引脚要维持晶振功能,不管外部是否有接晶振。但是不要打开内部上拉
  • ICE_DAT和ICE_CLK引脚要设为GPIO功能,INPUT模式,并打开内部上拉
    晶振引脚可能会引起大家的迷惑,



  • 如果不接晶振时,需要保持晶振模式,但是不能打开内部上拉。
  • 如果晶振引脚需要作为GPIO使用,power down时,GPIO功能不再需要的,需要切成晶振功能,但是不能打开内部上拉。
  • 如果晶振引脚需要作为GPIO使用,power down时,GPIO功能需要保持的,可以保持GPIO。



  • 可能是晶振引脚没有接晶振但是使能了晶振(PWRCON)
    • 解决办法就是将晶振使能关闭

  • 可能是设为INPUT模式的引脚输入的电压是介于VSSVDD之间的某个电压,导致芯片内部的MOS漏电



  • 解决办法就是将所有IO的数字通路都关闭:OFFD =0xFFFF0000;
  • 如果电流不再飘,说明就是有引脚输入了非预想电压
  • 然后依次使能一些引脚的数字通路,最后就可以定位是哪些引脚需要关闭数字通路(OFFD)



1.6.4   Power down时,LCDRTC保持显示,正常情况下功耗应该是10uA左右,但是测得功耗16uA

如果芯片内部IO口漏电,每根IO漏电20uA左右。该板子多耗电6uA,所以一般不是芯片内部漏电,这就需要查整个板子的电路,是否有电源到地的通路。1.4节列出了几种漏电的情况,大家可以参考看看。


1.6.5   大多情况下进入power down的功耗都是正常的6uA左右,但是某次进入power down时的功耗会高达1mA

发现关闭ADC功能之后这个问题不再重现,所以锁定ADC


ADC工作频率比较低的情况下,写到ADC寄存器中的数据要等2ADC工作时钟才会起作用,所以在进入powerdown时,关闭ADC时钟之前(APBCLK),需要延迟2ADC工作时钟。不然ADC可能还没有关闭,时钟没有了,就会漏电。




1.7    真实案例分析

1.7.1    客户板子进入power down功耗5mA,到客户端分析原因

  • 发现客户进入低功耗时LDO的电压是1.77V,明显没有进入power down
  • 经检查代码发现是使能了RTC唤醒
    • RTC的寄存器要读/写的话需要使能ACCESS Enable寄存器,不然一些寄存器读都是不可以的。所以进入调试模式,通过TTR寄存器查看是否使能了唤醒模式是不可能的。只能查RTC相关代码

  • 关闭RTC唤醒之后,此时功耗300uA。
  • 处理进入power down时的IO状态
    • 因为客户的板子上所有的外设在powerdown时都是断电的,所以所有跟外设相连的IO统统设为GPIO功能(MFP),并输出0。
    • 系统通过PB.8唤醒,该IO设为INPUT模式(PMD),不要使能内部上拉。
    • 跟充电管理芯片相连的IO都设为INPUT模式,不使能内部上拉
    • 其他没有用到的IO都设为INPUT,使能内部上拉(PUEN)
    • 测量电源电压的ADC引脚切成GPIO模式,INPUT,并关闭数字通路
      处理IO之后功耗188uA

  • 客户板子上有一片LDO芯片,将3.6V转成3.0V给MCU使用,拿掉该LDO之后功耗88uA
  • 充电电路从VDD到VSS有通路,拿掉了相连的电阻,之后功耗开始飘。低的时候到5uA高的时候到20uA
    • 关闭所有GPIO的数字通路OFFD,发现功耗固定在4.2uA不再飘
    • 依次使能GPIO的数字通路,发现与充电管理芯片相连的2跟PB.9和PB.10的数字通路一定要关闭,不然功耗就会飘
    • 测量PB.8和PB.9的波形,发现这两根引脚的电压为2.4V,会导致漏电,关闭这两根引脚的数字通路




至此,客户整个板子在进入低功耗时耗电4.2uA


1.7.2   客户的板子放一个晚上功耗飘到了100uA,到客户端分析原因

客户的板子上只有我们的NANO,功耗正常时2uA


经过分析发现客户没有外接高速晶振,但是使能了晶振(PWRCON)。将晶振关闭之后电流没有再飘。




2     示例代码

该板子外接段式LCD屏,进入power down的时候LCDRTC要保持工作,另外外部还有一颗芯片需要PB.7输出低电平让其进入power down


2.1     进入低功耗函数



void Enter_PowerDown()


{


    UNLOCKREG();  


    /* Back uporiginal setting */


    SavePinSetting();


   


    /*set to INPUT mode */


    GPIOA->PMD = 0;


    GPIOB->PMD = 0x4000;/*PB.7 OUTPUT low*/


    GPIOC->PMD = 0;


    GPIOD->PMD = 0;


    GPIOE->PMD = 0;


    GPIOF->PMD = 0;


    /* Set to GPIO模式 */


    GCR->PA_L_MFP = 0x00FFFF00;


    GCR->PA_H_MFP = 0xFFFFFF00;


    GCR->PB_L_MFP = 0x0000FF00;


    GCR->PB_H_MFP = 0xFFFFFFFF;


    GCR->PC_L_MFP = 0x0000FF00;


    GCR->PC_H_MFP = 0x0F00FFFF;


    GCR->PD_L_MFP = 0x0;


    GCR->PD_H_MFP = 0x0;


    GCR->PE_L_MFP = 0x0;


    GCR->PE_H_MFP = 0x0;


    GCR->PF_L_MFP = 0x00FF00;


   


    /*Disable Digital path of LCD pin */


    GPIOA->OFFD = 0xFC3C0000;


    GPIOB->OFFD = 0xFF0C0000;


    GPIOC->OFFD = 0x4F0C0000;


      


    /* Enable GPIOpull up */


    GPIOA->PUEN = 0xFFFF;


    GPIOB->PUEN = 0xFF7F;/*PB.7 low*/


    GPIOC->PUEN = 0xFFFF;


    GPIOD->PUEN = 0xFFFF;


    GPIOE->PUEN = 0xFFFF;


    GPIOF->PUEN = 0x0033;/* exclude GPF2 and GPF3 which are HXT OUT/IN */


   


    SYS_SetChipClockSrc(CLK_PWRCTL_LXT_EN, 1);


    SYS_SetUpPowerDown(0);   /* Disable PDWUinterrupt */


    LOCKREG();


    __WFI();   /* system really enter power down here ! */


}


2.2     状态保存和恢复

函数SavePinSetting();用来保存GPIO和MFP寄存器的状态,在系统唤醒之后,这些寄存器的状态需要恢复


__IO uint32_t _Pin_Setting[11];        /* store Px_H_MFP and Px_L_MFP */


__IO uint32_t _PullUp_Setting[6];      /* storeGPIOx_PUEN */


__IO uint32_t _PMD_Setting[6];             /* store GPIOx_PMD */


__IO uint32_t _OFFD_Setting[6];            /* store GPIOx_PMD */




void SavePinSetting()


{


       /* SavePin selection setting */


       _Pin_Setting[0]= GCR->PA_L_MFP;


       _Pin_Setting[1]= GCR->PA_H_MFP;


       _Pin_Setting[2]= GCR->PB_L_MFP;


       _Pin_Setting[3]= GCR->PB_H_MFP;


       _Pin_Setting[4]= GCR->PC_L_MFP;


       _Pin_Setting[5]= GCR->PC_H_MFP;


       _Pin_Setting[6]= GCR->PD_L_MFP;


       _Pin_Setting[7]= GCR->PD_H_MFP;


       _Pin_Setting[8]= GCR->PE_L_MFP;


       _Pin_Setting[9]= GCR->PE_H_MFP;


       _Pin_Setting[10]= GCR->PF_L_MFP;


      


       /* SavePull-up setting */


       _PullUp_Setting[0]=  GPIOA->PUEN;


       _PullUp_Setting[1]=  GPIOB->PUEN;


       _PullUp_Setting[2]=  GPIOC->PUEN;


       _PullUp_Setting[3]=  GPIOD->PUEN;


       _PullUp_Setting[4]=  GPIOE->PUEN;


       _PullUp_Setting[5]=  GPIOF->PUEN;




/*Save PMD setting */


       _PMD_Setting[0]=  GPIOA->PMD;


       _PMD_Setting[1]=  GPIOB->PMD;


       _PMD_Setting[2]=  GPIOC->PMD;


       _PMD_Setting[3]=  GPIOD->PMD;


       _PMD_Setting[4]=  GPIOE->PMD;


       _PMD_Setting[5]=  GPIOF->PMD;




/*Save OFFD setting */


       _OFFD_Setting[0]=  GPIOA->OFFD;


       _OFFD_Setting[1]=  GPIOB->OFFD;


       _OFFD_Setting[2]=  GPIOC->OFFD;


       _OFFD_Setting[3]=  GPIOD->OFFD;


       _OFFD_Setting[4]=  GPIOE->OFFD;


       _OFFD_Setting[5]=  GPIOF->OFFD;


}




void RestorePinSetting()


{


       /*Restore Pin selection setting */


       GCR->PA_L_MFP= _Pin_Setting[0];


       GCR->PA_H_MFP= _Pin_Setting[1];


       GCR->PB_L_MFP= _Pin_Setting[2];


       GCR->PB_H_MFP= _Pin_Setting[3];


       GCR->PC_L_MFP= _Pin_Setting[4];


       GCR->PC_H_MFP= _Pin_Setting[5];


       GCR->PD_L_MFP= _Pin_Setting[6];


       GCR->PD_H_MFP= _Pin_Setting[7];


       GCR->PE_L_MFP= _Pin_Setting[8];


       GCR->PE_H_MFP= _Pin_Setting[9];


       GCR->PF_L_MFP= _Pin_Setting[10];


      


       /* RestorePull-up setting */


       GPIOA->PUEN= _PullUp_Setting[0];


       GPIOB->PUEN= _PullUp_Setting[1];


       GPIOC->PUEN= _PullUp_Setting[2];


       GPIOD->PUEN= _PullUp_Setting[3];


       GPIOE->PUEN= _PullUp_Setting[4];


       GPIOF->PUEN= _PullUp_Setting[5];




/* RestorePMD setting */


       GPIOA->PMD= _PMD_Setting[0];


       GPIOB->PMD= _PMD_Setting[1];


       GPIOC->PMD= _PMD_Setting[2];


       GPIOD->PMD= _PMD_Setting[3];


       GPIOE->PMD= _PMD_Setting[4];


       GPIOF->PMD= _PMD_Setting[5];




/* RestoreOFFD setting */


       GPIOA->OFFD= _OFFD_Setting[0];


       GPIOB->OFFD= _OFFD_Setting[1];


       GPIOC->OFFD= _OFFD_Setting[2];


       GPIOD->OFFD= _OFFD_Setting[3];


       GPIOE->OFFD= _OFFD_Setting[4];


       GPIOF->OFFD= _OFFD_Setting[5];


}


保存和恢复的函数将所有的寄存器都保存和恢复了,如果用户确定某个寄存器不需要保存可以将相关代码拿掉,特别在SRAM不够用的时候,buffer可以定义小一点。




    
Revision  History
      
  
    
Rev.
      
Date
      
Description
  
    
1.00
      
1-21-2014
      
Initially issued.
  
    
1.10
      
4-11-2014
      
添加AHBCLK和APBCLK处理
  
添加一些有问题原理图分析
  
    
1.12
      
4-25-2014
      
功耗飘时多添加2种肯能原因
  
如果量不到LDO为1.6v原因说明
  







Important Notice





Nuvoton productsare not designed, intended, authorized or warranted for use as components insystems or equipment intended for surgical implantation, atomic energy controlinstruments, airplane or spaceship instruments, transportation instruments,traffic signal instruments, combustion control instruments, or for otherapplications intended to support or sustain life. Furthermore, Nuvoton productsare not intended for applications wherein failure of Nuvoton products couldresult or lead to a situation wherein personal injury, death or severe propertyor environmental damage could occur.


Nuvoton customersusing or selling these products for use in such applications do so at their ownrisk and agree to fully indemnify Nuvoton for any damages resulting from suchimproper use or sales.





Pleasenote that all data and specifications are subject to change without notice. Allthe trademarks of products and companies mentioned in this datasheet belong totheir respective owners.






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
牛卧堂
回复

使用道具 举报

沙发
我爱下载 发表于 2014-5-5 09:16:24 | 只看该作者
相当不错的文档
回复 支持 反对

使用道具 举报

板凳
harvardx 发表于 2014-5-9 23:00:43 | 只看该作者
非常好 正需要这样的电路
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU