若要理解低功耗,则先要说一下STM32的事件和中断
事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断。在STM32中,中断与事件不是等价的,一个中断肯定对应一个事件,但一个事件不一定对应一个中断。
当外部有信号输入时,如果通过了事件屏蔽寄存器,那么事件信号就进入脉冲触发器,引发一个脉冲信号,直接传递给相应的外设,用于触发,这就是一个纯硬件的过程,理解DMA的应该知道,这个方式不需要CPU参与,但是这也有它的缺点,如功能比较单一,仅能提供信号,不能提供信息,也就是只能产生指定功能的事件。如果通过中断屏蔽寄存器,就被直接送到CPU中,产生中断,如进入上面的入口函数开始处理。从这就可看出,事件是单纯硬件触发执行的过程,与CPU本身设计支持有关,而中断中则可以软件实现各种功能,而低功耗模式的事件唤醒就是stm32支持的事件之一。
对于STM32来说,共有3种低功耗模式:睡眠模式,停机模式,待机模式。
睡眠模式
当Cortex-M3遇到WFE(等待中断)或者WFI(等待事件)指令时会停止内部时钟,中带程序执行。尽管Cortex-M3停止工作,但是其外设仍在继续工作,直到某个外设产生事件或者中断时,内核将会被唤醒,藉此退出睡眠模式。
停机模式
倘若用户将Cortex-M3处理器的电源控制寄存器(Cortex Power Control Register,Cor-tex_PCR)中的SLEEPDEEP位置位,然后将STM32电源控制寄存器(STM32 Power Control Register.STM32 PCR)中的PDDS(Power Down Deep Sleep)位清除,就完成了 STM32停机模式的设置。
当停机模式设置完毕后,CPU一旦遇到WFI或 WFE指令就会停止工作,HSI和HSE 也进人关闭状态。但Flash和SRAM将会继续保持电源供应,所以此时STM32的所有工作状态仍然是保留着的。和睡眠模式一样,停机模式也可以通过外设中断唤醒,然面在停机模式下,除了外部中断控制单元,所有设备的时钟都被禁止了,只能通过在GPIO引脚上产生电平边沿触发外部中断的方式来将STM32从停机状态下唤醒。而前面也曾提到过,外部中断通道除了与GPIO连接,还和RTC时钟的报警事件连接,加之RTC的计数时钟并非来源于STM32的设备总线(而是直接来自LSI或LSE),因此还可以使用RTC模块实现定时将STM32从停机状态中唤醒。
待机模式
将Cortex_PCR中的SLEEP位进行置位,再将STM32_PCR中的PDDS位进行置位,如此一来,STM32则进入待机模式。
若要唤醒待机模式,有多种方式进行唤醒,分别位:RTC的闹钟事件、NRST的外部引脚复位、独立看门狗(IWDG)所产生的复位信号,以及GPIOA.0引脚上所产生的一个上升沿,但是若要是要该引脚所产生的上升沿来唤醒STM32,则必须事先设置为唤醒引脚功能。待机模式是STM32的最低功耗模式。
当进入待机模式后,所有的SRAM数据、Cortex-M3处理器的寄存器和STM32的寄存器内容都将会被清零。效果等同于硬件复位。