刚接触PWR的内容,使用手册说的不太能让我好理解。其实当你弄懂了以后再回去看使用手册还是能找到的,只是写的过于简略,对于初学者很多地方理解不到位。
这个小总结完全从初学者角度,目的只有一个:进入/唤醒 PWR的standby模式。其实更多的是如何配置进入,唤醒基本上是配置好了后自动完成或硬件出发的,我们需要做的退出后的设计。这块内容暂不作为本次讨论内容。
一 低功耗模式简介
低功耗模式一览表
PS: STM32F的NRST是异步复位脚。
当NRST输入低电平的时候,MCU处于复位状态,重设所有的内部寄存器,及片内几十KB的SRAM。
当NRST从低电平变高时,PC指针从0地址开始。
但是复位的时候不会将STM32F片内RTC的寄存器以及后备存储器重置,因为它们是用电池通过专门的VBAT脚供电。
STM32中的NRST有施密特功能。大概在输入电压低于1.9V的时候将芯片复位。
这里重点说standby模式
二 设置stm32 进入standby模式需要
1 PWR配置
a-- RCC配置时候开启 PWR、BKP时钟
/* Enable PWR and BKP clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
b-- 允许 PWR唤醒
/* Enable WKUP pin */
PWR_WakeUpPinCmd(ENABLE);
c-- 允许 进入备份域 (为什么需要这样,下文详解)
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);
2 进入中断
PWR_EnterSTANDBYMode();
这一句话完成了表7里 standby MODE "操作" 的内容
void PWR_EnterSTANDBYMode(void)
{
/* Clear Wake-up flag */
PWR->CR |= CR_CWUF_Set;
/* Select STANDBY mode */ ----PDDS位
PWR->CR |= CR_PDDS_Set;
/* Set SLEEPDEEP bit of Cortex System Control Register */ ----sleepdeep位
*(vu32 *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set;
/* Request Wait For Interrupt */
__WFI(); ----wfi
}
三 从standby 模式唤醒
表7、表11中都可知从standby 模式中唤醒的方式有四种
RTC闹钟
WKUP引脚上升沿
NRST上引脚外部复位
IWDG 复位
下图解释了我最初的不明白---RTC 和standby什么联系