当前位置: 首页 > news >正文

STM32F103VE 三种低功耗模式

STM32F103VE 低功耗模式详解及示例代码

STM32F103VE 提供了三种低功耗模式,每种模式的特点如下:

1. 睡眠模式 (Sleep Mode)

特点

  • 仅CPU停止工作,外设继续运行
  • 任何中断或事件都可以唤醒
  • 唤醒时间最短
  • 功耗降低最少

2. 停止模式 (Stop Mode)

特点

  • 所有时钟停止(HCLK, PCLK1, PCLK2)
  • 1.8V区域供电保持
  • SRAM和寄存器内容保持
  • 外部中断或RTC闹钟可以唤醒
  • 唤醒后时钟配置需要重新初始化

3. 待机模式 (Standby Mode)

特点

  • 最低功耗模式
  • 1.8V区域断电(除了备份域和待机电路)
  • SRAM和寄存器内容丢失(除了备份寄存器)
  • 只有特定事件可以唤醒(WKUP引脚上升沿、RTC闹钟、NRST引脚外部复位)
  • 唤醒后相当于复位重启

示例代码(使用标准库)

1. 睡眠模式

#include "stm32f10x.h"void Enter_Sleep_Mode(void)
{// 配置PA0为外部中断GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);// PA0配置为上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置EXTI线0GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 上升沿和下降沿EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);// 配置NVICNVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 进入睡眠模式__WFI(); // 等待中断唤醒
}void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) != RESET){EXTI_ClearITPendingBit(EXTI_Line0);// 唤醒后的处理}
}

2. 停止模式

void Enter_Stop_Mode(void)
{// 配置PA0为外部中断(与睡眠模式相同)// ...// 进入停止模式前可以选择降低电压调节器功耗PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);// 唤醒后需要重新配置系统时钟SystemInit(); // 重新初始化系统时钟
}void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) != RESET){EXTI_ClearITPendingBit(EXTI_Line0);// 唤醒后的处理}
}

3. 待机模式

	// 检测是否从待机唤醒if (Check_WakeUpFromStandby()) {// 这里是唤醒后的特殊处理代码// 例如:点亮LED指示唤醒LED2_ON;GUI_Delay(500);LED2_OFF;ShowCommon();ShowStateScreen();goto USER_CODE;}// 配置PA0为唤醒引脚(WKUP)
void WKUP_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;// 1. 使能GPIOA和PWR时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// 2. 配置PA0为下拉输入(因为按键接3.3V)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);// 3. 使能WKUP引脚唤醒功能PWR_WakeUpPinCmd(ENABLE);
}// 关闭所有可能引起唤醒的外设
void Disable_Wakeup_Sources(void) {// 1. 禁用所有中断(除了EXTI0)NVIC->ICER[0] = 0xFFFFFFFF; // 禁用所有32个中断NVIC_EnableIRQ(EXTI0_IRQn); // 重新启用EXTI0中断// 2. 关闭不必要的外设时钟RCC->APB2ENR = 0;//RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, DISABLE);RCC->APB1ENR = 0;//RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL, DISABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// 3. 配置未使用的GPIO为模拟输入(降低功耗)GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_Init(GPIOC, &GPIO_InitStruct);// 4. 特别关闭串口等可能产生中断的外设USART_Cmd(USART1, DISABLE);USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);USART_Cmd(USART2, DISABLE);USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);USART_Cmd(UART4, DISABLE);USART_ITConfig(UART4, USART_IT_RXNE, DISABLE);
}// 进入待机模式
void Enter_StandbyMode(void) {// 1. 清除所有唤醒标志PWR_ClearFlag(PWR_FLAG_WU);// 2. 禁用所有可能产生唤醒的外设Disable_Wakeup_Sources();// 3. 进入待机模式PWR_EnterSTANDBYMode();// 4. 唤醒后会从复位开始执行
}

主程序示例

int main(void)
{// 系统初始化SystemInit();// 其他初始化代码...while(1){// 检测按键按下if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) // 按键按下(低电平,因为上拉到VCC){// 消抖Delay_ms(20);if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0){// 选择进入哪种低功耗模式// Enter_Sleep_Mode();// Enter_Stop_Mode();Enter_Standby_Mode();}while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0); // 等待按键释放}}
}

注意事项

  1. 进入低功耗模式前,应关闭不必要的外设时钟
  2. 停止模式唤醒后需要重新初始化系统时钟
  3. 待机模式唤醒后相当于复位,程序会从头开始执行
  4. 实际应用中需要根据需求选择适当的低功耗模式
  5. 唤醒源需要根据具体模式进行配置

以上代码基于STM32标准外设库,实际使用时需要根据具体硬件和需求进行调整。

http://www.xdnf.cn/news/368659.html

相关文章:

  • CN3791 锂电池充电芯片详解及电路设计要点-国产芯片
  • java-多态
  • 机舱巡飞平台技术要点突破点详解!
  • 流式渲染 Streaming SSR
  • deep seek简介和解析
  • BERT模型讲解
  • 【C语言指针超详解(三)】--数组名的理解,一维数组传参的本质,冒泡排序,二级指针,指针数组
  • 开平机:技术深水区与产业变革的融合突破
  • spring ai alibaba ChatClient 获取大模型返回内容的方式 以及使用场景
  • 什么是 HEIC 格式?如何在电脑上查看HEIC格式的图像?
  • 软件开发的图表类型
  • RAG优化知识库检索(1):基础概念与架构
  • 结构性变革与新兴机遇
  • 如何评估SAP升级实施商的专业能力?
  • JWT原理及工作流程详解
  • 高频算法面试题总结
  • 系统的从零开始学习电子的相关知识,该如何规划?
  • 高效处理CR
  • 耀圣-气动带刮刀硬密封法兰球阀:攻克颗粒高粘度介质的自清洁 “利器”
  • (八)Java面向对象编程三大特性:封装、继承与多态性详解
  • Linux 系统安装Minio详细教程
  • 音视频同步知识
  • 今日行情明日机会——20250509
  • Codeforces Round 1023 (Div. 2)
  • 反向沙箱介绍
  • 麒麟系统使用-个性化设置
  • 库室指静脉人脸门禁机 LK-BM-S10C/JR
  • CDGP|数据治理怎么带动企业高速发展?
  • 革新锅炉厂智能控制——Ethernet IP转CANopen协议网关的工业互联新方案
  • 【UltralyticsYolo11图像分类完整项目-04】代码重构