1、首先回答一个问题,STM32能不能做低功耗?
回答是肯定的,这个是有数据支持的,我测试的STM32101CB,FLASH:128K,RAM:16K并且RTC工作的情况下,测试到的功耗为16uA应该说还是相当不错的。
2、STM32低功耗有哪些需要注意的地方?
一开始我测试到STM32为16uA的时候,还是非常高兴的,以为真的可以做为我的应用,我的应用是让MCU定时醒来干活,干一会就睡觉,可能干活的时间就几十个毫秒。可是后来发现有些问题(工作在STOP模式):
1) 时钟问题:STM32被唤醒以后的时钟自动切换到内部HIS RC振荡器,大家都是知道的,RC振荡器的精度是不高的。而且,睡觉前对于时钟的设置都是恢复到复位状态,只是时钟这个地方复位,其他的没有。这也会带来一个问题,可能你睡觉前使用的是内部时钟,可是睡觉后,时钟却变了,带来的问题就是UART和定时器。或许你想不使用PLL,就是8M,这样醒来后的时钟HIS也是8M,这样虽然在时钟上没有差别了,但是时钟却不稳定了。UART波特率肯定不能太高,否则通信会有问题。
2) 醒来时间:这个问题也是个非常大的问题,datasheet上给出的醒来时间是7us,这个可能真的不假,但是醒来,不能马上干_你的活,为什么。初始化IO,你可能问,我不初始化不行吗,回答应该是否定的。因为,如果你想使用低功耗的话,睡觉前IO口都应该设置为模拟输入,这样才能达到datasheet上的14uA,但是这样也带来一个问题,那就是初始化IO,醒来必须要初始化IO。如果你还想把时钟切换到外部时钟,耗时会更加长,接近200ms,因为STM32会等待外部时钟稳定后才能工作,然后还要在重新初始化所有IO,这个非常的耗时。可能我只需要醒来10ms,但是这些活干完就需要100ms。
3) RTC唤醒:RTC这个也是个问题,为什么?大家需要注意的是RTC只能使用报警才能唤醒MCU,秒中断是不可以唤醒的。并且报警中断必须不停的设置,设置一次只生效一次,中断完了,还需要设置下次中断的时间。并且还有个问题,报警中断必须等待到秒中断到了之后才能设置,也就是正好秒寄存器更新了一次的时候设置,这就带来一个问题,等待秒中断。如果睡前还想再能被报警唤醒的话必须重新设置报警中断,而且设置报警中断的时候需要等到秒中断才能设置新的值。这个等待的时间是不定的。可能会几百个毫秒。说以要空空的耗费几百个毫秒等到秒中断标志来设置报警中断。可能我的MCU只需要执行10ms就需要睡觉了。还是要空空的耗费掉几百个毫秒
总结:在使用的过程中发现的问题,我都在上面说明了,我觉得STM32的低功耗太假,虽然在睡眠的时候性能不错,但是醒来,和进入睡眠的设置太麻烦,耗时太多,这是个弊端,我觉得MSP430估计是做的最好的了,即使是AVR也比他好点,没有那么麻烦。
拿到STM32L的样片后,一直纠结于低功耗的测试,因为和STM32F系列的配置不同,所以导致了杯具,通过和ST公司不停的咨询,终于得到了最终的结果,
经过测试,功耗在STOP模式下为 500nA ,性能还是不错的,代码如下:
/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32l1xx_md.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32l1xx.c file
*/
/* Configure all unused GPIO port pins in Analog Input mode (floating input
trigger OFF), this will reduce the power consumption and increase the device
immunity against EMI/EMC *************************************************/
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC
| RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH, ENABLE);
/* config all IO to Analog Input to reduce parasite power consumption */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_Init(GPIOH, &GPIO_InitStructure);
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Enable PB7 as external PVD input so as to set it as AIN_IN */
Set_PVD_To_Config_PB7();
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA
| RCC_AHBPeriph_GPIOB
| RCC_AHBPeriph_GPIOC
| RCC_AHBPeriph_GPIOD
| RCC_AHBPeriph_GPIOE
| RCC_AHBPeriph_GPIOH, DISABLE);
PWR_UltraLowPowerCmd(ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
while(1);
}
/**
* @brief Enable PB7 as external PVD input so as to set it as AIN_IN
* @param None
* @retval None
*/
void Set_PVD_To_Config_PB7(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/* Configure the PVD Level to 3 (2.5V) */
PWR_PVDLevelConfig(PWR_PVDLevel_7);
/* Enable the PVD Output */
PWR_PVDCmd(ENABLE);
}
上一篇:STM32L151C8周期性从待机模式唤醒(RTC Wakeup Timer)
下一篇:stm8L15x EEPORM学习笔记
推荐阅读最新更新时间:2024-11-07 16:04
设计资源 培训 开发板 精华推荐
- 具有关断功能的 LT1086IM 5V 稳压器的典型应用
- 1.24 至 15V DC 至 DC 单输出便携式电源
- LT3684 的典型应用 - 36V、2A、2.8MHz 降压型开关稳压器
- DC2425A-C,使用 LTC2311IMSE-14 14 位、5Msps 真差分输入串行 SAR ADC 的演示板
- LT8390IFE 125W (25V/5A) 太阳能电池板至 12V 电池充电器的典型应用电路
- LT4276AHUFD 90W LTPoE++ 电源在正向模式下的典型应用电路,具有 12V、7A 输出
- FTS_SPD_1.9.2
- UM10484,基于 TFF1003 和缓冲放大器的集成 Clean-Up-PLL 演示板
- SiP7805BA 三端固定正电压稳压器的典型应用
- 基于BlueNRG的STM32 Nucleo蓝牙低功耗扩展板