在如今能源紧张的时代,如果才能够更加“省电”一直是各大MCU制造公司关注的重点。在不断提高性能的同时,系统功耗也在不断的降低。STM32F4作为一款工控领域的M4内核的信号处理MCU,其功耗也一定有过人之处。 首先让我们请出今天测试的主角:STM32F4 DISCOVERY 评估板,关于这款评估板的详细介绍可以参考前面的帖子。除了主角外,一场戏要完美谢幕,配角当然也必不可少。
最先登场的是优利德37014稳压电源,其包含2路可调0~32V电压输出以及一路5v固定输出的电压输出,其波纹可低至1mv。
第二件是胜利VC9808,虽然这块表比不上FLUKE等神器,但经过校验其精度和量程还是能够保证的。特别是它的电流量程可低至2mA,电压量程可低至200mV。
第三件是一个组合。它包含有三个高精度的表头,从左到右的量程依次是10uA,50uA,100uA。如今的MCU在某些特殊的低功耗模式下消耗的电流一般都是uA级别的,所以用这些刚好合适。虽然这些设备与专业的实验室里那些动辄几十万甚至上百万的仪器还有不小的差距,但这也恰好符合日常的工作环境。在大部分情况下,用这些“小米+步枪“完成的测试结果还是比较准确和可靠的。:) 一般来说,降低系统的功耗的方式主要有降低核心工作电压,关闭各种无关外设和部分核心等等方法。通过查阅STM32F4系列MCU的手册,我们可以看到STM32 MCU包含了四种低功耗模式,其中就有5µA STOP停止模式以及0.2µA待机模式(RTC运行),并且其工作的电压范围可宽至2.0v~3.6v。下图来自STM32F4系列用户手册,它告诉我们如何进入各种模式,以及在各个模式下如何唤醒。
俗话说耳听为虚眼见为实,下面就让我们来实际测试一下STM32F4系列的功耗。
1. 首先让我们来看看STM32F4的最低工作电压。根据手册其可最低到1.8V,在某些特殊的封装还可以低至1.7V。测试电路很简单,首先用稳压电源输出电压,我们可以看到在3.3V输出的情况下,开发板工作一切正常,4个彩色LED灯也依次闪烁。
下面我们慢慢降低工作电压,随着电压的降低,4LED灯的亮度也逐渐降低,但依然有次序的闪烁,表示目前工作依然正常。当电压降低至2.1V时,板子上的指示灯完全熄灭。
缓慢升高电压,当到达2.1V时,系统重新开始工作,由于稳压电压只能精确到0.1V,所以此时查看电压表,表头显示为2.09V.这也就是STM32F4 DISCOVERY 评估板的最低工作电压了。虽然2.09V比手册上描写的1.7V还有不小的差距,但考虑到整块DISCOVERY 评估板上除了MCU以及其它器件,2.09V的工作电压已经很不错了。况且,在平时设计的产品中,也不太可能只有一个MCU吧。 2. 全速工作模式下的电流。
按照STM32F4系列手册中所述,在上电启动或者复位后,默认情况下系统工作在运行模式(RUN MODE),此时系统将使用HCLK作为其主要的时钟全速工作。但是,并不是说在运行模式下各种情况的消耗电流都是一样的。如果我们能够降低系统的时钟频率或在不使用外设时关闭相应的时钟,那么系统的消耗电流还是会降低不少的。由于我们测试采用的是STM32F4 Discovery板子,所以测试的是整个开发板的功耗,并且我们假定输入电压为3.3V。
测试的程序来自于STM32F4-Discovery_FW_V1.1.0,即STM32F4-Discovery自带的示例程序中的PWR_CurrentConsumption工程。大家可以在STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\PWR_CurrentConsumption中打开工程。其中的MAIN函数非常简单,通过一条语句来控制所有GPIO的开启与关闭。(注意:在本示例中,对时钟的设置在SystemInit中已经完成,所以无需在MAIN函数中更改)
int main(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC |RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, DISABLE); //关闭所有GPIO的时钟
while (1);
}
可以看到此时系统的消耗电流为66.7mA。修改上面的 RCC_AHB1PeriphClockCmd函数,打开所有GPIO的时钟。此时系统的消耗电流为76.1mA。
虽然两处代码的区别仅是打开或是关闭GPIO,但其消耗电流的差别还是不小的,接近10mA. 3. Sleep Mode (睡眠模式)
当系统执行WFI指令或WFE指令时,STM32F4 MCU将进入睡眠模式。在这种模式下,CORTEX-M4核心将停止工作,但外围设备将继续执行。也正是由于外围设备并没有停止工作,所以任何一个外设的中断发生将会把设备从睡眠模式中唤醒。下面的函数首先禁止GPIO接口,然后直接调用__WFI()指令进入SLEEP MODE。
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure all GPIO as analog to reduce current consumption on non used IOs */
/* Enable GPIOs clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC |
RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE , ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Disable GPIOs clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC |
RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, DISABLE);
/* Request to enter SLEEP mode */
__WFI();
/* Infinite loop */
while (1)
{
}
}
从上图可以看出在睡眠的工作电流58.5mA,相对于全速工作模式66.7mA 降低了近12.3%,电量的节约还是非常可观的。 4.STOP mode(停止模式)
在实际的使用过程中,我们可以把停止模式看做是深度的睡眠模式。在该模式中,在1.2v域内的所有时钟都会停止工作,PLL,HSI,HSE等都被禁止。可以看出,相对于上面所说的睡眠模式,停止模式将会更进一步的降低系统的功耗。进入STOP mode的方法也很简单,我们只需要设置PWR_CR寄存器中的FPDS位即可。如果想在停止模式下更加省电,那么我们还可以设置该寄存器中的LPDS位。 /* FLASH Deep Power Down Mode enabled */
PWR_FlashPowerDownCmd(ENABLE);
/* Enter Stop Mode */
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); 上面两段代码用来使FLASH进入深度掉电模式以及使处理器进入停止模式。
在代码执行后,STM32F4开发板的消耗电流达到了46.4mA,相比于Sleep Mode的58.5mA又再一次的降低了20.6%。 5.Standby mode(待机模式)
Standby mode从字面上来看其意思为备用模式,但总感觉有些奇怪,还是按照大家的说法称其为待机模式。待机模式可谓是STM32的终极低功耗模式了,该模式在深度睡眠的基础上关闭芯片内部的电压调节器,并且整个1.8v电压区域,PLL,HSI,HSE也断电。那么如何才能进入和推出待机模式呢?下表给出了具体的方法。
让我们来看看待机模式下STM32F4的表现吧。
可以看到,此时的消耗电流为35.9mA,再一次刷新了功耗记录,在深度睡眠的模式的基础上,系统的功耗再次降低了22.6%
|