本帖最后由 cruelfox 于 2017-3-31 23:00 编辑
Nucleo-144上面给MCU供电的3.3V那里有一个跳线 JP5,可以拔下短路帽,串入电流表来测量工作电流。
就用前面 Coremark 的程序来测试下运行时候的功耗吧,改一下 portable_fini() 函数,弄一个死循环,不要让程序跑飞了。在死循环里检测按键,如果按下键,就进入休眠模式——普通SLEEP。观察电流表的读数。
void portable_fini(core_portable *p)
{
for(;;)
{
if(GPIOC->IDR & 1<<13)
__WFI();
}
}
先测试了一下在最高频率 216MHz 下,Coremark 运行时和运行结束进入我写的死循环里,分别电流有多少。
执行程序位置 | Coremark run | loop | FLASH AXI, I-Cache关闭 | 71.4mA | 57.6mA | FLASH AXI, I-Cache打开 | 101.2mA | 58.8mA | FLASH TCM, ART打开 | 105.3mA | 59.2mA | ITCM RAM | 104.7mA | 70.8mA | 从AXI接口访问Flash执行时,功耗要小一点。如果不开 I-Cache, 功耗会变低,但是这是以牺牲性能为代价的,可能得不偿失。有意思的是,尽管CPU还是在运行,在死循环中的功耗要比执行Coremark时低不少,所以耗电和跑什么样的程序有关系。另外,从ITCM RAM运行时,死循环时的耗电比在Flash中运行要高。此外,在上面四种执行模式下,CPU进入SLEEP模式后电流都变为 28.2mA .
下面以 AXI访问Flash, I-Cache 打开的条件为前提,测试下不同频率下电流变化情况。
频率 | Coremark run | loop | SLEEP | 216MHz | 101.2 | 58.8 | 28.2 | 180MHz | 84.4 | 53.5 | 23.7 | 150MHz | 70.6 | 44.8 | 19.9 | 120MHz | 56.7 | 36.1 | 16.2 | 100MHz | 47.6 | 30.3 | 13.7 | 80MHz | 38.2 | 24.4 | 11.2 | 60MHz | 29.0 | 18.6 | 8.66 | 40MHz | 20.0 | 13.1 | 6.41 | 25MHz | 12.9 | 8.59 | 4.44 | 16MHz HSI | 6.68 | 4.30 | 2.40 | 8MHz HSE | 3.94 | 2.60 | 1.65 | 用 Matlab 画个图出来看
基本上,功耗和频率是线性关系。16MHz 和 8MHz 因为没使用PLL, 比按照25MHz~216MHz的图线推算出来的电流要小。死循环状态下为何 216MHz 时的电流偏小我不知道了,测了几次确认这个现象。
和数据表中的表格对照,在运行状态的电流大致符合。(还开启了Timer, USART设备)
SLEEP时的电流,比数据表中的高了点,可能是片上设备开启带来的影响。
更低的休眠模式有 STOP 模式和 Stand-by 模式,彻底将内部总线时钟停掉,唤醒也需要时间更长。测试一下 STOP 模式,需要预先配置 PWR->CR1 寄存器,SCB->SCR 中 DEEPSLEEP 位。我使用这段代码:
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
__DSB();
PWR->CR1 |= PWR_CR1_LPDS|PWR_CR1_FPDS;
SCB->SCR|=1<<SCB_SCR_SLEEPDEEP_Pos;
之后再用 WFI 指令即可休眠到 STOP 模式,实测电流 235uA 左右。和手册上的 0.27mA典型值差不多。若要进入 Stand-by 模式,对 PWR->CR1 的配置改为:
PWR->CR1 |= PWR_CR1_PDDS;
这样 WFI 指令后就是电流最低的 Stand-by 模式了,我测得电流 2.3uA.
经过对 STM32F722ZE 的功耗测试,我感觉和**中F4系列的功耗对比,F7在同样的频率下功耗是更大的,包括SLEEP模式也是。也许这是为了高性能,系统更复杂了付出的代价吧。STOP模式也比F4高了很多,Stand-by模式还基本相当。
|