运动控制器38:STM32的电源管理

2019-07-14 00:06发布

电源

主要有3中电源
  1. VREF+和VREF-,引脚少的芯片没有此两脚,芯片多的,VREF-接VSSA,VREF+接2.4V~VDDA,此VDDA和VSSA可以和VSS和VDD是同一引脚。
  2. VDD和VSS:范围:2.0V到3.6V
  3. VBAT,可选连接VDD,也可以用电池,此位保护32.768的晶振和备份寄存器中的值。
    4.电压调节器
    • 运转模式下,给内核提供1.8V电压
    • 停止模式下,提供1.8V用来保存寄存器和SRAM的值
    • 待机模式下,无输出,寄存器和SRAM都会丢失,只保留备份域。

电源管理器

  • 电复位和掉电复位POR和PDR,其中POR>PDR
  • PVD:设置PLS可以选择阈值,如果VDD降低到此阈值时,可设置产生中断,可以用此特征来紧急关闭某些功能。

低功耗模式

用大白话来说,低功耗有三种:
  1. 打个盹:睡眠模式,在此种模式下,只是CPU时钟关了在睡觉,任何的中断和唤醒事件都可以唤醒CPU工作。
  2. 深睡:停机模式,电灯关闭,门锁锁上,准备深睡,只有在外部敲门的时候可以叫醒,高速时钟都关闭,任意外部中断可唤醒。
  3. 死睡:只能靠WKUP引脚,RTC闹钟,复位引脚和看门狗强制复位才能唤醒。

降低系统时钟

时钟越快,功耗越大,可以根据需要适度的降低SYSCLK,HCLK,PCLK1,PCLK2的时钟

外部时钟的控制

也可以关闭一些暂时不用的外设的时钟,AHB,APB的时钟可以整体关闭。

睡眠模式

进入
可以设置为马上睡眠和等所有中断服务程序执行完成后再睡模式。给一条指令马上就可以生效了。
退出
  • 如果是WFI,则任意中断可退出
  • 如果是WFE,则需要唤醒事件,事件产生如下:
    • 从外设寄存器中使能一个中断,而不是NVIC中使能,并且使能一个SEVONPEND位,唤醒后,外设中断标志和NVIC的标志都要清除。
    • 也可以通过设置外部或者内部的EXIT线为事件模式,产生中断时唤醒。

停止模式

进入
先:系统控制寄存器设置SLEEPDEEP,电源控制清除PDDS和设置电源调节器的模式以后,
再:确保所有的中断标志都清除了
然后WFI和WFE指令,进入停止模式
退出
外部中断线,WFI则中断线设置为中断模式,WFE则设置为事件模式。

待机模式

待机模式可以足一关掉和设置看门狗,RTC,内部RC和外部32.768
进入
同停止模式,先:系统控制寄存器设置SLEEPDEEP,电源控制清除PDDS和设置电源调节器的模式以后,等待WFI和WFE指令,进入待机模式。
退出
WKUP引脚的上升沿、 RTC闹钟事件的上升沿、 NRST引脚上外部复位、 IWDG复位。

自动唤醒

  • 上面说的都是被动唤醒,也可以自动唤醒。这里用到了RTC,定时的进行唤醒,这里的唤醒主要针对停止模式和待机模式。
  • 操作流程为,先设置外部中断线,应该就是RTC为上升沿触发,然后设置RTC的闹钟事件即可。

电源相关的库函数

void PWR_BackupAccessCmd (FunctionalState NewState) //使能备份寄存器 void PWR_ClearFlag (uint32_t PWR_FLAG) //是唤醒还是待机状态 void PWR_DeInit (void) // void PWR_EnterSTANDBYMode (void) //进入待机模式 void PWR_EnterSTOPMode (uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) //进入停止模式,1.8V是ON还是低功耗模式可选,中断OR事件可选 FlagStatus PWR_GetFlagStatus (uint32_t PWR_FLAG) //唤醒,待机,还是PVD输出 void PWR_PVDCmd (FunctionalState NewState) //PVD检测 void PWR_PVDLevelConfig (uint32_t PWR_PVDLevel) //PVD设置 void PWR_WakeUpPinCmd (FunctionalState NewState) //通过WKUP引脚唤醒使能