此文档作为对洋桃电子STM32F407单片机视频的整理,B站链接:
第28集)低功耗模式_哔哩哔哩_bilibili
在之前的程序里应用程序在while(1)主循环中反复执行,ARM内核以100%的功率工作。这样的设计简单稳定,内核全速运行的功耗也只有几十毫安,对于外接电源的设备来讲这点功率可以忽略不计,但开发电池提供的设备时则对功耗特别敏感。
低功耗模式就是为功耗有严格要求的设备而准备的。低功耗模式的本质是关闭用不到的内部功能以节省电量,根据内部功能的等级可分成睡眠模式、停止模式(又称停机模式)、待机模式。三种模式对应三种不同的低功耗运行方案,适用于不同的应用场合。
1. 三种低功耗模式的对比
不同的低功耗模式关闭单片机内部功能的数量不同,关闭功能越多越省电,但关闭的越多唤醒方法越少,有利有弊,需要视情况综合考虑。
睡眠模式适用于ARM内核不需要连续工作的场合,不需要ARM内核工作时就进入睡眠模式可节省几毫安的功耗,由于只有ARM内核停止工作其他功能照常运行所以任意中断或事件都能唤醒ARM内核退出睡眠模式。从此可以看出睡眠模式并不会停止单片机运行,只是让ARM内核无工作时小睡一会。
停止模式将关闭ARM内核内部所有功能,PLL时钟电路、HSE外部高速时钟相关电路,停止模式将所有工作停止ARM内核彻底停止,GPIO、ADC、DMA、USART、SPI等内部功能都停止工作,只有独立的内部功能可唤醒单片机退出停止模式。独立功能包括外部中断、电源PVD、RTC闹钟、USB唤醒,停止模式适用于偶尔工作一会的场合。
待机模式不仅关闭单片机所有内部功能,SRAM内存都将关闭,所有寄存器数据丢失,只能通过复位单片机唤醒,复位后无法接着之前的程序继续运行,只能从头开始,待机模式适用于不需要连续运行的场合。
2. 睡眠模式
睡眠模式的开启不需要在CubeMX中设置,只要在程序中需要进入睡眠的地方调用HAL库函数,例如在这个示例程序的第103行调用开启睡眠模式的函数HAL_PWR_EnterSLEEPMode(),此函数有两个参数:第一个参数是电源模式设置,可设置为主电源开启或低功耗电源开启,设置为主电源开启时除了ARM内核关闭之外其它不变,设置为低功耗电源开启时ARM内核关闭的同时系统时钟频率会下降,PLL电路关闭、还有一系列性能的下降以尽量降低运行功耗。一般设置为主电源开启。第二个参数是睡眠模式的唤醒方式,可以选择中断唤醒或事件唤醒,这里选择了中断唤醒。
当程序运行到第103行,ARM内核停止工作程序不再继续执行,等待着中断唤醒,当出现任何一个中断ARM内核将被唤醒,唤醒后的程序从停止时的下一条开始执行,也就是105行。唤醒之后的单片机状态没有任何变化,程序照常运行。
实验现象:文章来源:https://www.toymoban.com/news/detail-819242.html
在CubeMX中打开NVIC窗口可以看到有很多默认开启的中断项目,这些涉及到单片机底层运行,这些中断项目都都会导致睡眠模式的唤醒。
在超级终端上可以看到程序运行时会快速而频繁的睡眠和唤醒,这是由于NVIC默认的中断项目导致的中断唤醒。
3. 停止模式
停止模式的开启方法和睡眠模式几乎一样,只是调用了不同的HAL库函数。
同样是在程序中需要进入停止模式的地方插入第108行的HAL_PWR_EnterSTOPMode()函数。此函数有两个参数,第一个参数可选择主电源开启或低功耗电源开启,第二个参数可选择中断唤醒或事件唤醒,由于停止模式是将关闭单片机内部的所有功能所以第一个参数选择低功耗电源开启,当按下开发板上的KEY2按键执行完第108行单片机停止运行等待中断唤醒。如果有外部中断、RTC闹钟、USB信号等唤醒单片机,程序将从停止处的下一行 (第111行)继续运行。由于停止模式关闭了内部功能的时钟,所以唤醒后第111行调用了系统时钟初始化函数,重新初始化系统时钟才能重启内部功能,单片机才能进入运行状态。
为了能够在开发板上演示停止和唤醒效果,需要把KEY1按键设置为外部中断功能,当按下KEY1按键被触发下降沿中断唤醒单片机。当程序执行完第108行进入停止模式,单片机内部功能停止不会产生中断,只有按下开发板上的KEY1按键产生外部中断触发单片机被唤醒。按下KEY2按键再次进入停止模式。
实验现象:
4. 待机模式
待机模式是在停止模式的基础上关闭1.2V电源域,也就是FLASH存储器和SRAM内存的电源,使正在运行的程序全部丢失只能复位重启,待机模式下连外部中断也不能唤醒,只能通过设置WKUP引脚唤醒,WKUP引脚是专用待机唤醒的引脚,当引脚上出现上升沿信号单片机将从待机模式中唤醒。
在开发板电路原理图上,WKUP复用在PA0端口,在CubeMX端口视图中单击PA0端口可以选择SYSWKUP模式,但这里存在一个问题PA0端口没有连接上拉或下拉使它的电平处在不稳定状态。
先将PA0设置为GPIO_Input模式,此时才能将PA0的参数设置为下拉模式。至于WKUP端口将在程序代码中开启。
在主循环开始之前的第96行加入复位标志位的判断程序,判断本次复位是不是待机模式的唤醒,如果是则执行第98行,可以在这里插入待机唤醒的处理程序,然后第100行禁止WKUP功能,第101行清除复位标志位。
第118行是正式进入待机状态的HAL库函数,但在此之前要做一些准备工作,第116行清除WKUP状态标志位,为接收端口的上升沿信号做好准备,第117行调用HAL库函数开启WKUP功能,此时当执行完第118行进入待机状态,按下开发板上的WKUP按键并松开时,必然产生电平上升沿触发唤醒,由于待机状态下的唤醒无法继续运行只能复位重新开始,所以第118行的下面没有添加唤醒处理程序,处理程序是放在主函数开始处的第95~102行。
实验现象:
文章来源地址https://www.toymoban.com/news/detail-819242.html
到了这里,关于洋桃电子STM32F407单片机入门教程笔记九:低功耗模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!