STM32调用第二版固件库函数无法进入待机模式

发布: 2009-10-15 15:41 | 作者: proco | 来源: StmFans思蜕盟 OPELC 自由电子联盟

请教各位前辈:我调用STM32固件库第二版中的进入待机函数:PWR_EnterSTANDBYMode();结果耗电和停机模式一样,用外部中断竟然还能唤醒,说明并没有进入真正的待机模式,这是为什么呢?
binglin (2009-10-15 20:37:24)
个人感觉ST将待机模式与停止模式搞反了

参考手册。。。

待机模式:
待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。

从上面文字来看,我觉得不象待机模式,它更似是停止模式。

停止模式:
停止模式是在Cortex™-M3的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在1.8V供电区域的的所有时钟都被停止,PLL、HSI和HSE RC振荡器的功能被禁止,SRAM和寄存器内容被保留下来

从上面的文字来看,似乎更像待机模式多些。

STM32还有一个睡眠模式呢。

进入停止模式是有很严格的要求:

在以下条件下执行WFI或WFE指令:
– 设置Cortex-M3系统控制寄存器中的SLEEPDEEP位
– 清除电源控制寄存器(PWR_CR)中的PDDS位
– 通过设置PWR_CR中LPDS位选择电压调节器的模式
注:为了进入停止模式,所有的外部中断的请求位(挂起寄存器(EXTI_PR))和RTC的闹钟标志都必须被清除,否则停止模式的进入流程将会被跳过,程序继续运行。
binglin (2009-10-15 20:42:55)
从楼主的描述看来确实没有将STM32进入待机模式。
binglin (2009-10-15 20:48:35)
建议楼主参考固件库中的STANDBY例子。
binglin (2009-10-15 20:57:02)
进入待机模式,要执行下面两句:

PWR_WakeUpPinCmd(ENABLE);//使能WAKEUP的引脚功能,待机模式前必须使能WAKEUP引脚功能,要不关机后只能复位才能启动
PWR_EnterSTANDBYMode();       //进入待机模式


顺便提一下,松鼠3的PCB板就快回来了,等组装好松鼠3,就开始写它的例程,停止模式与待机模式的例程也在是计划编写的例程之中。
proco (2009-10-15 21:26:28)
进入待机模式,要执行下面两句:

PWR_WakeUpPinCmd(ENABLE);//使能WAKEUP的引脚功能,待机模式前必须使能WAKEUP引脚功能,要不关机后只能复位才能启动
PWR_EnterSTANDBYMode();       //进入待机模式

我现在确实只要在按复位的时候再启动就行了,这样的话我只要使用:PWR_EnterSTANDBYMode();  这个函数就行了吧?但是为什么还是没有进入待机模式呢?
binglin (2009-10-15 22:33:01)
PWREN:电源接口时钟使能了没有?

请检查RCC的初始化代码有没有对PWR进行时钟使能。

CODE:

/* 使能PWR电源接口时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR |, ENABLE);
注:如果没有PWR电源接口时钟,当然就不能进入待机模式了(只要需要对PWR相关寄存器进行操作,就应使能该外设的时钟)。
proco (2009-10-15 22:57:54)
PWR电源接口时钟 这个还真没有注意,我明天试一下,太感谢你了,呵呵
binglin (2009-10-15 23:55:59)
呵呵,明天等你的好消息。
proco (2009-10-16 08:59:55)
谢谢 binglin前辈,问题解决了,现在可以待机了,加一个5V转3.3V的LDO,总功耗在4.2uA
binglin (2009-10-16 14:12:56)
呵呵,看到你能解决问题,为你高兴呢。