大家都说EFM32是针对低功耗的应用而开发的。不光光体现在宣传手册上的指标,那里有几种低功耗,每种低功耗的功耗等等的数据这些大体上的数据。在一些细小的方面,EFM32确实也为了节省功耗,做了一些特殊的处理。
今天和大家说的就是,EFM32甚至可以将部分的RAM关闭,而省出那么一点维持RAM数据的电流。虽然维持RAM的电流在datasheet上没有具体的说明,也没有数据,但是可想而知,关闭总归还是会省出一点的。^_^.
根据Reference manual的描述,EFM32内部的RAM是被分块的。除第一块不能关闭之外,其他的块是可以单独关闭的。分块的大小和EFM32的型号有关。由于Tiny gecko的内部RAM最大只有4KB,因此tiny gecko没有这部分的功能。而Geck的RAM,每块大小为4K,而Leopard gecko和Giant gecko的RAM,每块为32kB。下面就来看下具体如何操作,以及测试的结果。
注意点:
1.RAM电源关闭之后,只有Reset才能重新上电。
2.栈。小心你的栈如果是用到了后面的那几个block,然后你有关闭了他们的电源的话,嘻嘻。。会有HardFault哦。。
硬件准备:G STK
软件准备:由于关闭1个block,效果会不太明显,因此关闭了3个block的RAM。
例程:
#include <stdint.h>
#include <stdbool.h>
#include "efm32.h"
#include "efm32_chip.h"
#include "efm32_emu.h"
/* LED driver */
#include "leds.h"
volatile uint32_t msTicks; /* counts 1ms timeTicks */
/**************************************************************************//**
* @brief SysTick_Handler
* Interrupt Service Routine for system tick counter
*****************************************************************************/
void SysTick_Handler(void)
{
msTicks++; /* increment counter necessary in Delay()*/
}
/**************************************************************************//**
* @brief Delays number of msTick Systicks (typically 1 ms)
* @param dlyTicks Number of ticks to delay
*****************************************************************************/
void Delay(uint32_t dlyTicks)
{
uint32_t curTicks;
curTicks = msTicks;
while ((msTicks - curTicks) < dlyTicks) ;
}
/**************************************************************************//**
* @brief Main function
*****************************************************************************/
int main(void)
{
int count = 0;
/* Chip errata */
CHIP_Init();
/* Ensure core frequency has been updated */
SystemCoreClockUpdate();
/* Setup SysTick Timer for 1 msec interrupts */
if (SysTick_Config(SystemCoreClock / 100)) while (1) ;
EMU->MEMCTRL = 0x07;
while (1)
{
EMU_EnterEM2(false);
}
}
结果:正常情况下,耗电量为567nA,关闭之后,454nA。这个结果仅供参考。