网站空间单位,wix建设网站,电商分销主要做什么,网站建设 教学视频目录
一、什么是低功耗
二、低功耗的核心思想
三、STM32的3种低功耗模式
1、睡眠模式 (Sleep Mode)
2、停止模式 (Stop Mode)
3、 待机模式 (Standby Mode)
四、相关电源管理寄存器
1、PWR_CR (Power Control Register, 电源控制寄存器)
2、PWR_CSR (Power Control/St…目录
一、什么是低功耗
二、低功耗的核心思想
三、STM32的3种低功耗模式
1、睡眠模式 (Sleep Mode)
2、停止模式 (Stop Mode)
3、 待机模式 (Standby Mode)
四、相关电源管理寄存器
1、PWR_CR (Power Control Register, 电源控制寄存器)
2、PWR_CSR (Power Control/Status Register, 电源控制/状态寄存器)
五、其他降低功耗
1. 降低系统时钟频率
代码示例
2. 关闭未用的外设时钟
代码示例
六、FreeRTOS低功耗Tickless模式
1、FreeRTOS低功耗Tickless模式简介
2、工作原理
3、FreeRTOS 低功耗 Tickless 模式相关配置项
小结 一、什么是低功耗 低功耗指的是在系统设计中通过硬件和软件优化使设备在执行任务时尽量减少能量消耗。特别是在嵌入式系统、物联网设备和电池供电的设备中低功耗设计至关重要因为它可以延长设备的工作时间减少频繁充电或更换电池的需求。 二、低功耗的核心思想
1、减少不必要的资源消耗尽量关闭不必要的模块或外设减少芯片功耗。
2、降低工作频率和电压通过降低系统的工作频率和电压来减少功耗。
3、进入低功耗模式大多数微控制器如STM32有多种低功耗模式可以根据需求选择不同的低功耗模式。
三、STM32的3种低功耗模式 STM32的这三种低功耗模式主要针对不同的功耗和性能需求逐级降低功耗 1、睡眠模式 (Sleep Mode) 特点内核CPU停止运行但系统时钟 (Systick) 和一些外设如NVIC仍然可以工作。这种模式非常适合短时间的休眠。 功耗优势因为外设仍在运行所以可以保持较快的响应时间但功耗相对较高。 应用场景适用于短暂的休眠比如等待外设数据或在周期性任务之间短暂进入低功耗状态。 进入方式设置 __WFIWait For Interrupt指令让 CPU 暂停执行直到有中断发生适合在等待特定中断事件时使用。它能在没有中断时节省功耗并在中断发生时自动唤醒 CPU或 __WFEWait For Event指令让 CPU 暂停执行直到有“事件”或中断发生可以等待外设、系统事件或中断。在没有中断的情况下也可以通过事件比如唤醒事件使 CPU 唤醒。指令进入睡眠模式。 唤醒方式任何中断都可以唤醒 CPU 并恢复正常工作。 // 使能睡眠模式
HAL_SuspendTick(); // 暂停Systick中断可选
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
// 唤醒后
HAL_ResumeTick(); // 恢复Systick中断2、停止模式 (Stop Mode) 特点系统时钟停止1.8V内核电源继续工作PLL锁相环关闭后系统失去倍频效果、HIS高速内部振荡器内部时钟源不再为CPU和外设提供高速时钟和HSE RC高速外部振荡器用于系统时钟的基准源失去高精度的时钟源振荡器关闭寄存器和SRAM数据保留。只有低速时钟 (LSI或LSE) 可以工作允许使用低功耗的外部中断来唤醒。 功耗优势停止模式大大降低了功耗因为大部分时钟已经关闭但数据仍然保留适合较长时间的低功耗状态。 应用场景适合在处理任务后进入低功耗状态等待外部事件或定时器唤醒。典型应用包括长时间采集数据的传感器设备。 进入方式调用 HAL_PWR_EnterSTOPMode停止模式下主调节器仍然供电内存保持数据。 唤醒方式通过外部中断如 RTC、GPIO 中断唤醒。 注:为了进入停止模式所有的外部中断的请求位(挂起寄存器(EXTI_PR))和RTC的闹钟标志都必须被清除否则停止模式的进入流程将会被跳过程序继续运行。 // 进入停止模式
HAL_SuspendTick(); // 暂停Systick中断可选
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后重新配置系统时钟
SystemClock_Config(); // 根据具体项目需要配置系统时钟
HAL_ResumeTick(); // 恢复Systick中断3、 待机模式 (Standby Mode) 特点内核电源关闭所有寄存器和SRAM内容丢失仅保留备份寄存器和待机电路供电。种模式能够实现最低功耗适用于极限低功耗场景。 功耗优势待机模式实现了最低功耗但所有数据除备份寄存器都会丢失重新唤醒后需要重新初始化。 应用场景适合在设备长时间不使用时进入待机比如按键唤醒的电池供电设备或极低频次使用的物联网传感器节点。 进入方式调用 HAL_PWR_EnterSTANDBYMode进入待机模式关闭所有电源仅保留RTC或待机引脚。 唤醒方式通过唤醒引脚如 WKUP、RTC 警报或重启上电复位或IWDG复位等。 注待机模式下所有I/O引脚处于高阻态除了复位引脚、被使能的唤醒引脚等 待机模式下不能下载程序必须退出待机模式才能下载 // 清除唤醒标志确保顺利进入待机模式
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// 进入待机模式
HAL_PWR_EnterSTANDBYMode();
// 唤醒后将从复位开始这三种模式适用于不同的应用场景具体选择取决于功耗、响应时间以及数据保留需求。 根据最低电源消耗最快启动时间和可用的唤醒源等条件选择一种最佳的低功耗模式
四、相关电源管理寄存器 PWR_CR 和 PWR_CSR 是 STM32 中的两个电源管理寄存器用于配置和监视低功耗状态。 1、PWR_CR (Power Control Register, 电源控制寄存器) 作用用于配置 STM32 的低功耗模式。设置PDDS位进入深度睡眠时进入待机模式。设置CWUF位清除之前的WUF唤醒位。
LPDS (Low-Power Deep Sleep)在深度睡眠模式下启用低功耗调节器减少功耗。
PDDS (Power Down Deep Sleep)当设置为 1 时进入待机模式 (Standby Mode)否则进入停止模式 (Stop Mode)。
CWUF (Clear Wakeup Flag)写 1 来清除唤醒标志 (WUF)用于防止错误唤醒。
CSBF (Clear Standby Flag)写 1 来清除待机标志 (SBF)。
VOS (Voltage Scaling)控制电压缩放可以通过降低工作电压进一步节省功耗。
通过设置 PWR_CR 中的这些位用户可以控制进入哪种低功耗模式如停止模式、待机模式同时调节系统的电压和深度睡眠状态。
2、PWR_CSR (Power Control/Status Register, 电源控制/状态寄存器) 作用用于监测电源状态和低功耗唤醒标志。 设置EWUP使能WKUP引脚用于待机模式唤醒。WUF唤醒标志用来判断是否发生唤醒事件。
WUF (Wakeup Flag)当有唤醒事件发生时该位被置 1用于指示是否有唤醒源。
SBF (Standby Flag)当进入待机模式时该位被置 1表示系统已经进入过待机状态。
EWUP (Enable Wakeup Pin)使能唤醒引脚允许从待机模式中通过外部引脚唤醒。
PWR_CSR 用于监控进入低功耗模式后的状态和唤醒标志通过读取 WUF 和 SBF 标志用户可以判断系统是否因为某个事件唤醒或是否处于待机状态。
五、其他降低功耗 在 STM32 中降低运行模式下的功耗主要通过降低系统时钟频率和关闭未使用的外设时钟来实现。这种方式适用于系统运行中不能进入低功耗模式的情况例如执行任务时希望减少功耗而又保持一定的功能性。 1. 降低系统时钟频率
通过降低系统的主频系统的功耗会大幅降低。STM32 的系统时钟可以通过修改配置来降低频率如降低 AHB 总线和 APB 总线的时钟频率。
代码示例
以下代码降低系统时钟频率到指定值可以在初始化时或在运行时动态调整
void SystemClock_Config_LowPower(void) {RCC_ClkInitTypeDef clkInitStruct {0};RCC_OscInitTypeDef oscInitStruct {0};// 配置振荡器设置oscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSI;oscInitStruct.HSIState RCC_HSI_ON;oscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_DEFAULT;oscInitStruct.PLL.PLLState RCC_PLL_ON;oscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSI;oscInitStruct.PLL.PLLM 16;oscInitStruct.PLL.PLLN 100; // 调整这个值来改变频率oscInitStruct.PLL.PLLP RCC_PLLP_DIV4;oscInitStruct.PLL.PLLQ 4;HAL_RCC_OscConfig(oscInitStruct);// 配置系统时钟分频器clkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;clkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK;clkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV2; // 降低 AHB 时钟clkInitStruct.APB1CLKDivider RCC_HCLK_DIV4; // 降低 APB1 时钟clkInitStruct.APB2CLKDivider RCC_HCLK_DIV2; // 降低 APB2 时钟HAL_RCC_ClockConfig(clkInitStruct, FLASH_LATENCY_3);
}在需要更低功耗的状态下可以使用更低的分频值。在恢复正常工作时可以重新设置更高的频率。
2. 关闭未用的外设时钟
STM32 的外设是通过 AHB 和 APB 总线时钟驱动的未使用的外设时钟可以禁用以进一步节省功耗。我们可以通过重置 RCC 寄存器的相关位来实现禁用未用外设。
代码示例
以下示例展示了如何禁用某些未使用的外设时钟以减少功耗
void DisableUnusedPeripheralClocks(void) {// 禁用 APB1 外设时钟__HAL_RCC_UART4_CLK_DISABLE();__HAL_RCC_UART5_CLK_DISABLE();__HAL_RCC_I2C3_CLK_DISABLE();__HAL_RCC_CAN1_CLK_DISABLE();__HAL_RCC_PWR_CLK_DISABLE();// 禁用 APB2 外设时钟__HAL_RCC_SPI1_CLK_DISABLE();__HAL_RCC_SDIO_CLK_DISABLE();__HAL_RCC_ADC1_CLK_DISABLE();// 禁用 AHB 外设时钟__HAL_RCC_DMA1_CLK_DISABLE();__HAL_RCC_DMA2_CLK_DISABLE();__HAL_RCC_CRC_CLK_DISABLE();
}此函数可以在初始化时调用关闭系统中不使用的外设。需要时也可以通过重新使能的方式开启外设时钟。例如在 SPI 需要使用时可以调用 __HAL_RCC_SPI1_CLK_ENABLE() 恢复其时钟。
六、FreeRTOS低功耗Tickless模式 FreeRTOS的Tickless模式是一种减少系统功耗的机制。通常FreeRTOS会以固定时间间隔“Tick”触发时钟中断用于任务调度和系统计时。但这种频繁的中断在低功耗需求场景下会导致系统资源的浪费。Tickless模式通过在空闲时段停用Tick中断大幅降低功耗是常用的低功耗设计。Tickless低功耗模式的本质是通过调用指令 WFI 实现睡眠模式。 1、FreeRTOS低功耗Tickless模式简介
任务运行时间统计实验中可以看出在整个系统的运行过程中其实大部分时间是在执行空闲任务系统中的所有其它任务都阻塞或被挂起时才运行的。
Tickless模式的核心思想是当系统进入空闲状态并不需要频繁调度时停止或减少时钟中断使系统进入更深的低功耗模式。系统会根据需要再次唤醒然后恢复时钟计数这样可以避免因频繁的时钟中断唤醒而浪费功耗。
判断执行在vTaskStartScheduler()函数中具体如下
/* 此条件编译检查应使用不等于0的判断而不是等于1。* 这样可以确保当用户定义的低功耗模式实现需要 configUSE_TICKLESS_IDLE * 设置为除1以外的值时依然能够调用 portSUPPRESS_TICKS_AND_SLEEP()。*/
#if ( configUSE_TICKLESS_IDLE ! 0 ){TickType_t xExpectedIdleTime;/* 不希望在空闲任务的每次循环中暂停并恢复调度器。* 因此首先在调度器未暂停的情况下对预计空闲时间进行初步测试。* 此处的结果不一定有效仅为初步估计。*/xExpectedIdleTime prvGetExpectedIdleTime(); // 获取下一个任务解锁的时间即进入低功耗模式的预计空闲时间/* 如果预计空闲时间大于等于设定的最小空闲时间则进入低功耗模式 */if( xExpectedIdleTime configEXPECTED_IDLE_TIME_BEFORE_SLEEP ){vTaskSuspendAll(); // 暂停调度器防止在配置低功耗模式时发生任务切换{/* 现在调度器已暂停可以重新获取准确的预计空闲时间 */configASSERT( xNextTaskUnblockTime xTickCount ); // 断言确保下一任务的解锁时间不早于当前Tick计数xExpectedIdleTime prvGetExpectedIdleTime(); // 重新获取准确的预计空闲时间/* 定义以下宏以在应用程序不需要调用 portSUPPRESS_TICKS_AND_SLEEP()* 时将 xExpectedIdleTime 设为0。*/configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime ); // 用户自定义处理可以在此进一步优化低功耗逻辑/* 如果 xExpectedIdleTime 仍大于等于设定值则进入低功耗模式 */if( xExpectedIdleTime configEXPECTED_IDLE_TIME_BEFORE_SLEEP ){traceLOW_POWER_IDLE_BEGIN(); // 跟踪低功耗状态开始供调试或分析用portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); // 进入低功耗模式抑制Tick中断traceLOW_POWER_IDLE_END(); // 跟踪低功耗状态结束}else{mtCOVERAGE_TEST_MARKER(); // 覆盖率测试标记供测试覆盖率分析工具使用}}( void ) xTaskResumeAll(); // 恢复任务调度器}else{mtCOVERAGE_TEST_MARKER(); // 覆盖率测试标记供测试覆盖率分析工具使用}}
#endif /* configUSE_TICKLESS_IDLE */2、工作原理
判断空闲时间当系统发现没有就绪任务并进入空闲任务Idle Task时FreeRTOS会评估空闲时间的长短。关闭时钟中断如果空闲时间足够长则禁用Tick中断让系统进入深度低功耗状态。恢复运行状态当预定的唤醒时间或某个事件发生时如外部中断、定时器溢出等系统唤醒并重新使能Tick中断。调整Tick计数系统恢复时通过记录的休眠时间来调整Tick计数器以保证时间精度。
Tickless模式常用于电池供电的物联网设备和嵌入式系统中以延长电池寿命和降低系统功耗。
3、FreeRTOS 低功耗 Tickless 模式相关配置项
FreeRTOS 提供了一些配置项用于设置和控制Tickless模式。这些配置项需要FreeRTOSConfig.h 中进行设置。 configUSE_TICKLESS_IDLE启用Tickless模式的总开关设置 #define configUSE_TICKLESS_IDLE 1configEXPECTED_IDLE_TIME_BEFORE_SLEEP配置空闲时间的最小长度只有超过此时长系统才会进入Tickless模式。这可以避免过于频繁地进入和退出低功耗模式 xExpectedIdleTime prvGetExpectedIdleTime();configPRE_SLEEP_PROCESSING进入Tickless模式前的处理回调函数。可以在这个宏中定义进入低功耗模式前的操作如关闭外设、降低电压等 #define configPRE_SLEEP_PROCESSING( xModifiableIdleTime ) myPreSleepFunction( xModifiableIdleTime )configPOST_SLEEP_PROCESSING从低功耗模式中唤醒后的处理回调函数。用于恢复低功耗模式前关闭的外设、恢复系统时钟等。 #define configPOST_SLEEP_PROCESSING( xExpectedIdleTime ) myPostSleepFunction( xExpectedIdleTime )configTICK_RATE_HZ设定Tick的频率即每秒的中断次数对于低功耗应用Tickless模式会减少系统实际的Tick中断频率以降低功耗 #define configTICK_RATE_HZ 1000小结
FreeRTOS的Tickless模式通过减少系统Tick中断的频率在空闲时段进入低功耗模式有效减少系统整体功耗。通过合理配置 configUSE_TICKLESS_IDLE、configEXPECTED_IDLE_TIME_BEFORE_SLEEP 以及低功耗前后的处理函数系统可以在满足实际应用需求的同时实现尽可能低的功耗。 参考资料
66PWR-低功耗模式原理和配置讲解_哔哩哔哩_bilibili
第59讲 Tickless低功耗模式实战编程_哔哩哔哩_bilibili
文章转载自: http://www.morning.xdjsx.cn.gov.cn.xdjsx.cn http://www.morning.qmbtn.cn.gov.cn.qmbtn.cn http://www.morning.080203.cn.gov.cn.080203.cn http://www.morning.fmkjx.cn.gov.cn.fmkjx.cn http://www.morning.hfnbr.cn.gov.cn.hfnbr.cn http://www.morning.rfhwc.cn.gov.cn.rfhwc.cn http://www.morning.lzwfg.cn.gov.cn.lzwfg.cn http://www.morning.zdqsc.cn.gov.cn.zdqsc.cn http://www.morning.mcqhb.cn.gov.cn.mcqhb.cn http://www.morning.dwgcx.cn.gov.cn.dwgcx.cn http://www.morning.rnxs.cn.gov.cn.rnxs.cn http://www.morning.yysqz.cn.gov.cn.yysqz.cn http://www.morning.xkmrr.cn.gov.cn.xkmrr.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.jzykq.cn.gov.cn.jzykq.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.mkpqr.cn.gov.cn.mkpqr.cn http://www.morning.kcyxs.cn.gov.cn.kcyxs.cn http://www.morning.qphgp.cn.gov.cn.qphgp.cn http://www.morning.ttrdr.cn.gov.cn.ttrdr.cn http://www.morning.yrjfb.cn.gov.cn.yrjfb.cn http://www.morning.rrcrs.cn.gov.cn.rrcrs.cn http://www.morning.qrcxh.cn.gov.cn.qrcxh.cn http://www.morning.bfybb.cn.gov.cn.bfybb.cn http://www.morning.lxthr.cn.gov.cn.lxthr.cn http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn http://www.morning.ycmpk.cn.gov.cn.ycmpk.cn http://www.morning.hhxpl.cn.gov.cn.hhxpl.cn http://www.morning.trbxt.cn.gov.cn.trbxt.cn http://www.morning.pbgnx.cn.gov.cn.pbgnx.cn http://www.morning.gtcym.cn.gov.cn.gtcym.cn http://www.morning.bkppb.cn.gov.cn.bkppb.cn http://www.morning.gywfp.cn.gov.cn.gywfp.cn http://www.morning.jgcrr.cn.gov.cn.jgcrr.cn http://www.morning.wrbnh.cn.gov.cn.wrbnh.cn http://www.morning.zbkdm.cn.gov.cn.zbkdm.cn http://www.morning.xscpq.cn.gov.cn.xscpq.cn http://www.morning.wnwjf.cn.gov.cn.wnwjf.cn http://www.morning.wlqll.cn.gov.cn.wlqll.cn http://www.morning.xdfkrd.cn.gov.cn.xdfkrd.cn http://www.morning.hdrrk.cn.gov.cn.hdrrk.cn http://www.morning.glxdk.cn.gov.cn.glxdk.cn http://www.morning.gnlyq.cn.gov.cn.gnlyq.cn http://www.morning.wgkz.cn.gov.cn.wgkz.cn http://www.morning.bxfy.cn.gov.cn.bxfy.cn http://www.morning.jgnjl.cn.gov.cn.jgnjl.cn http://www.morning.qcfgd.cn.gov.cn.qcfgd.cn http://www.morning.kmldm.cn.gov.cn.kmldm.cn http://www.morning.ghwtn.cn.gov.cn.ghwtn.cn http://www.morning.wyrsn.cn.gov.cn.wyrsn.cn http://www.morning.wqwbj.cn.gov.cn.wqwbj.cn http://www.morning.mxmdd.cn.gov.cn.mxmdd.cn http://www.morning.bmncq.cn.gov.cn.bmncq.cn http://www.morning.rmmz.cn.gov.cn.rmmz.cn http://www.morning.ndrzq.cn.gov.cn.ndrzq.cn http://www.morning.dwfzm.cn.gov.cn.dwfzm.cn http://www.morning.sfmqm.cn.gov.cn.sfmqm.cn http://www.morning.fbjnr.cn.gov.cn.fbjnr.cn http://www.morning.cfnht.cn.gov.cn.cfnht.cn http://www.morning.hylbz.cn.gov.cn.hylbz.cn http://www.morning.ynlpy.cn.gov.cn.ynlpy.cn http://www.morning.skrrq.cn.gov.cn.skrrq.cn http://www.morning.qlhkx.cn.gov.cn.qlhkx.cn http://www.morning.tkhyk.cn.gov.cn.tkhyk.cn http://www.morning.nlrxh.cn.gov.cn.nlrxh.cn http://www.morning.qzqjz.cn.gov.cn.qzqjz.cn http://www.morning.kdnrp.cn.gov.cn.kdnrp.cn http://www.morning.pznqt.cn.gov.cn.pznqt.cn http://www.morning.fykqh.cn.gov.cn.fykqh.cn http://www.morning.rmjxp.cn.gov.cn.rmjxp.cn http://www.morning.pdwzr.cn.gov.cn.pdwzr.cn http://www.morning.zwwhq.cn.gov.cn.zwwhq.cn http://www.morning.hlhqs.cn.gov.cn.hlhqs.cn http://www.morning.oumong.com.gov.cn.oumong.com http://www.morning.rpstb.cn.gov.cn.rpstb.cn http://www.morning.qztsq.cn.gov.cn.qztsq.cn http://www.morning.qytby.cn.gov.cn.qytby.cn http://www.morning.guangda11.cn.gov.cn.guangda11.cn http://www.morning.nqmwk.cn.gov.cn.nqmwk.cn http://www.morning.kjkml.cn.gov.cn.kjkml.cn