一.概要
在生活中通过关掉用电器可以实现省电节能的目的,同样的道理单片机也可以通过这种方法实现降低功耗。单片机是由许多部件组成,一些组件的电源系统是独立的,可以通过关闭单片机内部的组件的电压,可以实现降低功耗。
二.STM32单片机低功耗基本介绍
STM32提供了一些低功耗模式。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为CPU提供时钟,并执行程序代码。当 CPU 不需要继续运行(例如等待外部事件) 时,可以利用多种低功耗模式来节省功耗。
STM32提供了多种功耗模式,以达到不同层次的降低功耗的目的:
STM32主要低功耗模式:
• 睡眠模式 (内核停止工作,外设仍在运行)
• 停止模式 (所有时钟都停止)
• 待机模式 ( 1.8 V 内核电源关闭)
WFI和WFE都是系统指令,WFI是表示中断,WFE表示事件。
睡眠模式:
仅关闭了内核时钟,内核停止运行,但其片上外设,CM3 核心的外设全都照常运行,在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。
睡眠模式退出:
如果执行WFI指令进入睡眠模式,任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒。
如果执行WFE指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。
停止模式:
进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码 。
停止模式退出:
当一个中断或唤醒事件会退出停止模式。
待机模式:
它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了,也就是说, 从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测BOOT条件,从头开始执行程序 。
待机模式退出:
WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位可以退出待机模式。
三.STM32单片机待机模式介绍
待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。
如何进入和退出待机模式,细节参考如下表:
待机模式下的输入/输出端口还有外设状态
在待机模式下,所有的I/O引脚处于高阻态,除了以下的引脚:
● 复位引脚(始终有效)
● 当被设置为防侵入或校准输出时的TAMPER引脚
● 被使能的唤醒引脚
● RTC和IWDG(如果开启)继续运行。
四.CubeMX配置一个待机低功耗例程
STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口下载程序,下载完程序,用万用表的电流档,串联到小系统板的供电中。
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚,配置外部低频晶振引脚
PC13配置成输出
配置系统主频
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();//初始化1毫秒 Tick
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();//外部8M晶振,系统72M主频
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
__HAL_RCC_PWR_CLK_ENABLE();//电源管理打开
/* Check and handle if the system was resumed from Standby mode */
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)//清标志
{
/* Clear Standby flag */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
}
/* Insert 5 seconds delay */
HAL_Delay(2000);
for(int i=0;i<50;i++)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);//LED灯闪烁
HAL_Delay(100);
}
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
/* Clear all related wakeup flags*/
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
/* Enable WakeUp Pin PWR_WAKEUP_PIN1 connected to PA.00 */
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//使能唤醒按键
/* Enter the Standby mode */
HAL_PWR_EnterSTANDBYMode();//进入待机模式
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);//PC13引脚翻转输出
HAL_Delay(100);//等待100ms
}
/* USER CODE END 3 */
}
实验效果
STM32单片机进入低功耗前,板子功耗是28mA左右
5秒之后,STM32单片机进入待机状态,板子功耗是2.8mA左右,说明进入待机状态,功耗降的比较明显,后给PA0引脚一个高电平唤醒,板子又进入重新运行状态。
五.CubeMX工程源代码下载
通过百度网盘分享的文件:低功耗
链接:https://pan.baidu.com/s/14J2eHq9AJInwZlazu430nA
提取码:ouk8
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
六.小结
STM32单片机支持多种低功耗模式,包括睡眠模式、待机模式等,这些模式通过降低时钟频率、禁用外设和进入深度睡眠状态来实现节能。通过仔细选择和配置这些模式,可以显著减少功耗,从而延长设备的续航时间。