停止模式基于Cortex®-M3 deepsleep mode 结合外设时钟选通
停止模式:
- 内核停止, VCORE范围内的时钟都停止, PLL,MSI, HSI和HSE都被禁止, SRAM和寄存器的内容保留
进入停止模式必须:
- 选择进入低功耗睡眠模式的机制 (SLEEPONEXIT位),设置SLEEPDEEP位,清除PDDS位,清除WUF位, 设置LPSDSR(电压稳压器) ,执行WFI或WFE指令
- 清除所有的EXTI,RTC警报,RTC唤醒,RTC侵入检测,RTC时间戳的未处理标志位。 从停止模式唤醒时, MSI将自动作为系统时钟,唤醒所需时间的典型值为7.9us
进入停止模式可选:
- 内部电源变换器可以工作在正常模式或者低功耗模式,为了降低功耗,推荐设置电源变换器工作在低功耗模式(LPSDSR位)
- 禁止Flash的供电
- 关闭VREFINT,BOR,PVD和侵入检测功能 ,They can be switched on again by software after exiting the Stop mode using the ULP bit in the PWR_CR register.
- 可以单独使能IWDG,RTC,LSI和LSE功能
- 可以使用ADC,DAC和LCD的功能
- 配置LPSDSR 位可以使内部稳压器进入低功耗模式,进一步省电。
从STOP唤醒后:
- 1.从stop和standby模式唤醒或复位后,会启用MSI作为系统时钟。
- 2.stop唤醒后是STOP模式前的MSI频率(频率在RCC_ICSCR设定) PS.standy唤醒后是MSI的默认值;
stop总结:
- MSI RC 提供了低功耗的时钟源,用于在低耗模式下降低唤醒时间和能耗。
- 唤醒重启后通过RCC_CR寄存器的MSIRDY标志位可以监测MSI RC震荡器是否企稳。
- MSI RC振荡器可以通过RCC_CR寄存器的MSION位开关。
- 在RUN模式可以在外设空闲等待时关闭时钟降低功耗,比如HCLK,PCLK1,PCLK2;
- 进入SLEEP模式前可以预先降低系统时钟,比如SYSCLK,HCLK,PCLK1,PCLK2;
- 如果要进一步降低SLEEP功耗,可以在执行WFI或WFE前关闭所有外设时钟。
- 关于时钟可以参考HAL库的 SystemClock_Config 函数
- 复位RCC_AHBLPENR 和 RCC_APBxLPENR 相应位可自动关闭外设时钟。Disabling the peripherals clocks in Sleep mode can be performed automatically by resettingthe corresponding bit in RCC_AHBLPENR and RCC_APBxLPENR registers (x can 1 or 2)
- 进入STOP模式,IO状态维持RUN的模式
- 如果在进入STOP前想要禁止外部时钟,HSEON位必须首先关闭,系统时钟切换到HSI。否则clock security system (CSS)必须使能检测外部晶振失效以避免进入stop模式时发生的故障.
- 如果内存编程或者APB域正在运行,STOP模式会延迟到他们结束动作才进入状态。
- 独立开门狗IWDG一旦开启是不能停止的,除非复位。
- RTCEN 配置RTC,LSION配置LSI; LSEON配置LSE;the ADON bit in the ADC_CR2 register and the ENx bit in the DAC_CR register must both be written to 0
- When the voltage regulator operates in low-power mode, an additional startup delay is incurred when waking up from Stop mode
HAL_RTC_SetAlarm应该可以设置RTC ALARM 定时唤醒,使用方法不清楚,需要实验论证一下。
format: RTC_FORMAT_BIN
sAlarm->Alarm : RTC_ALARM_A 或 RTC_ALARM_B
sAlarm->AlarmTime:应该是设置时分秒,其他参数不清楚。
可以配置运行:IWDG,RTC,LSI,LSE进入stop mode前需要停止ADC:位于ADC_CR2的ADON和DAC_CR的ENX写0
补充
运行时低功耗(LP RUN):
- 1.稳压器(regulator)设置成低功耗模式(low-power mode),与此同时运行频率不能超过f_MSI range1 。注意低功耗下读取RTC要读两次,两次一样才表示准确,如果不一样还要继续读直到两次一样。
- 2.仅当VCORE是rang 2时,才能进入LP RUN.
低功耗睡眠(LP SLEEP):
- 1.SLEEPONEXIT 为 0 立刻睡眠;为1执行完中断处理程序(ISR)后睡眠.
- 2.SLEEP_PD 可以关闭flash内存降低功耗,但是会增加唤醒时间
- 3.digital IP clock 必须在RCC_APBxLPENR and RCC_AHBLPENR 中使能。注意,此时RCC_APBxENR 和 RCC_AHBENR 是可以关闭的
- 4.system clock 必须降低
- 5.LPSDSR 必须置1,也就是稳压器(regulator)必须是low-power mode。
- 6.最后执行WFI/WFE
- 7.注意,LP SLEEP下,所有IO状态不改变和 RUN mode 一致
- 8.在WFI下,NVIC 接收到中断就会唤醒;在WFE下,非NVIC的外设中断可唤醒,或者M3 System Control register 的 SEVONPEND 被使能,当从WFE唤醒后,所有的外设中断悬置(pending bit)和NVIC悬置位统统要清零。
- 9.配置external or internal EXTI line (in event mode),当从WFE唤醒后没有设置event line的悬置位(pending bit)不要清空