NANO功耗Application Note_V1.12.docx
(200.14 KB, 下载次数: 6672)
Document Information
Abstract 该文档介绍nano中,怎样调进入超低功耗模式时的功耗.
Apply to Nano Series.
Table of Contents
1 介绍
Nano系列是以Cotex-m0为内核的超低功耗MCU。进入深度睡眠模式时,所有IP都关闭的情况下的功耗为1uA;RTC和段式LCD屏都工作的情况下功耗10uA左右。客户的系统中往往不止MCU一颗IC,怎样让系统进入深度睡眠模式时的功耗最低?一直是客户问的最多的问题,也是问题最多的地方。本文介绍一些原则和调试的方法,希望对大家有帮助。
1.1 寄存器
涉及到的寄存器包括:
1.2 原则
进入power down时LDO引脚的电压会从1.8V变成1.6V。 不用的引脚统统设为GPIO,INPUT模式,并使能内部上拉(PUEN) 状态需要保持的引脚(保持输出低电平/高电平,或者保持输入低电平/高电平),切成GPIO功能,模式维持不变,同时不要使能内部上拉。 晶振引脚保持配置为晶振模式,即使没有外接晶振。在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需要软件自己关闭。
这就导致使用HIRC和HXT为时钟源的外设在进入powerdown的时候会自动停止工作,但是使用外部32K或者内部10K作为时钟源的外设需由软件决定在系统进入powerdown的时候是否仍然工作。例如:系统进入powerdown的时候,RTC和WDT仍然工作,这就需要不能关闭32K和10K晶振。
但是模拟外设是个特例,因为模拟电路工作不需要时钟。所以如果模拟外设功能使能,MCU虽然将晶振关闭,但是模拟电路部分仍会耗电。例如:ADC,系统进入power down之前需要写控制寄存器ADCR->ADEN将ADC功能关闭,否则会漏电
如果进入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.1uA就OK了。
1.4.2 电路二
该电路从VCC->R1->R2形成通路,假设VCC=3.3V,这里漏电3.3/2 = 1.65uA。
该电路是测量电源电压的电路,ADCCHECK引脚接到ADC0模拟输入引脚,power down的时候需要将ADCCHECK引脚切为输入模式(PMD),GPIO功能(MFP),并关闭数字通路(OFFD)。解决办法:
1.4.3 电路三
该电路从UART1_RXD->R56形成通路,假设VCC=3.3V,这里漏电3.3/1 = 3.3uA。
解决办法:powerdown时,将UART1_RXD引脚设为INPUT模式,但是不要打开内部上拉。
1.5 常见问题
1.6 调试方法
1.6.1 打开IO口的内部上拉,功耗反而变高
说明引脚有下拉,这个下拉可能是内部也可能是外部。该引脚输出低电平时芯片内部是接地的,如果忘记将该引脚设为INPUT模式,内部就是下拉的,就会导致漏电。
外部有下拉不一定是明显的引脚加电阻接地,可能是外部芯片在输出低。
1.6.2 打开内部上拉,功耗降低,但是耗电仍然偏高
这就要考虑两种情况
是否OFFD没有关 是否ADC没有关 OFFD没有关,如果LCD使能,就会导致漏电 ADC没有关,也会漏电
1.6.3 功耗会飘,手靠近板子,功耗会忽高忽低
这个问题的原因比较多,列出可能的3个原因
进入power down的时候
如果不接晶振时,需要保持晶振模式,但是不能打开内部上拉。 如果晶振引脚需要作为GPIO使用,power down时,GPIO功能不再需要的,需要切成晶振功能,但是不能打开内部上拉。 如果晶振引脚需要作为GPIO使用,power down时,GPIO功能需要保持的,可以保持GPIO。
1.6.4 Power down时,LCD和RTC保持显示,正常情况下功耗应该是10uA左右,但是测得功耗16uA
如果芯片内部IO口漏电,每根IO漏电20uA左右。该板子多耗电6uA,所以一般不是芯片内部漏电,这就需要查整个板子的电路,是否有电源到地的通路。1.4节列出了几种漏电的情况,大家可以参考看看。
1.6.5 大多情况下进入power down的功耗都是正常的6uA左右,但是某次进入power down时的功耗会高达1mA
发现关闭ADC功能之后这个问题不再重现,所以锁定ADC
ADC工作频率比较低的情况下,写到ADC寄存器中的数据要等2个ADC工作时钟才会起作用,所以在进入powerdown时,关闭ADC时钟之前(APBCLK),需要延迟2个ADC工作时钟。不然ADC可能还没有关闭,时钟没有了,就会漏电。
1.7 真实案例分析
1.7.1 客户板子进入power down功耗5mA,到客户端分析原因
发现客户进入低功耗时LDO的电压是1.77V,明显没有进入power down 经检查代码发现是使能了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的时候LCD和RTC要保持工作,另外外部还有一颗芯片需要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.
|