文章目录
前言一、STM32L4单片机简介二、程序设计及相关步骤1.系统时钟设置2.RTC以及系统电源配置2.1 RTC配置2.2 系统电源配置3.主程序代码三、测试结果总结前言
低功耗设计对于一些便携式产品以及智能穿戴产品尤其重要,其是一种在满足功能、性能要求的前提下,尽量降低集成电路能耗的设计方法。
一、STM32L4单片机简介
STM32L4系列是超低功耗32位ARM MCU+FPU,工作频率高达80MHz,具有100DMIPS,集成了多达1MB闪存,320KB SRAM,USB OTG FS,提供多达三个快速12位ADC(5 Msps),两个比较器,两个运放,两个DAC通路,一个内部基准电压缓冲器,一个低功耗RTC,两个通用32位计时器和两个专用马达控制的16位低功耗计时器,七个通用16位计时器和两个16位低功耗计时器。主要用在包括音频和图像等低功耗的应用。这里主要用到STM32L496,使用STM32CubeMx进行配置。
相关软件设计主要为:系统时钟设置为80 MHz,SysTick编程为每1ms产生一次中断。默认情况下,低速内部(LSI)时钟用作RTC时钟源。EXTI_Line20内部连接到RTC唤醒事件。启动后5秒,系统自动进入待机模式。RTC唤醒被配置为在大约33秒之后的上升沿上产生中断。启用RTC功能的待机模式下的电流消耗可以在这段时间内进行测量。选择超过半分钟的时间以确保电流收敛到最低工作点。从待机模式唤醒后,程序将以与软件复位后相同的方式重新启动。
二、程序设计及相关步骤
1.系统时钟设置
配置如下:
2.RTC以及系统电源配置
2.1 RTC配置
void MX_RTC_Init(void){/* USER CODE BEGIN RTC_Init 0 *//* USER CODE END RTC_Init 0 */RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef sDate = {0};RTC_AlarmTypeDef sAlarm = {0};/* USER CODE BEGIN RTC_Init 1 *//* USER CODE END RTC_Init 1 *//** Initialize RTC Only*/hrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv = 127;hrtc.Init.SynchPrediv = 255;hrtc.Init.OutPut = RTC_OUTPUT_ALARMA;hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}
2.2 系统电源配置
static void SystemPower_Config(void){/* Enable Power Control clock */__HAL_RCC_PWR_CLK_ENABLE();}
3.主程序代码
int main(void){HAL_Init();/* Configure the system clock to 80 MHz */SystemClock_Config();/* Configure RTC */RTC_Config();/* Configure the system Power */SystemPower_Config();/* 检查并处理系统是否从待机模式恢复 */ if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET){/* 清除待机标志 */__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); }/* 系统启动5s延迟后,进入待机模式 */HAL_Delay(5000);/* 以下为唤醒顺序- 1.禁用所有使用的唤醒源,- 2.清除所有相关的唤醒标志, - 3.重启所有使用的唤醒源,- 4.进入Standby模式.*//* 1.禁用所有使用的唤醒源*/HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);/* 2.清除所有相关的唤醒标志 */__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);/* 3.重启所有使用的唤醒源*//* ################设置唤醒时间#####################*//* 生成RTC唤醒中断: 唤醒计数器被设置为其最大值,以产生最长的待机时间,使电流达到其最低值,即功耗最低.当RTC_WAKEUPCLOCK_RTCCLK_DIV=RTCCLK_Div16=16时,最大值为0xFFFF,对应于约33秒:Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))Wakeup Time = Wakeup Time Base * WakeUpCounter = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI)) * WakeUpCounter==> WakeUpCounter = Wakeup Time / Wakeup Time Base要将唤醒计时器配置为33秒,将唤醒计数器设置为0xFFFF:Wakeup Time Base = 16 /(~32 kHz RC) = ~0.5 msWakeup Time = 0.5 ms * WakeUpCounter因此, wake-up counter = 0xFFFF = 65,535 Wakeup Time = 0.5 ms * 65,535 = ~ 33 s. */HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0xFFFF, RTC_WAKEUPCLOCK_RTCCLK_DIV16);/* 4.进入Standby模式 */HAL_PWR_EnterSTANDBYMode();while (1){}}
三、测试结果
将代码烧进开发板之后,上电5s以后系统进入Standby低功耗模式,大约33s之后被唤醒。这里也是用万用表测量了系统正常工作以及待机模式的功耗:
系统正常工作整机电流:52.1mA
Standby低功耗模式整机电流:2.22mA
总结
由于在测试的时候ST-link没有取下以及有一些飞线,造成有漏电电流,所以造成系统正常工作时电流还是挺大的,但进入Standby低功耗模式之后,电流下降得非常明显,还是非常给力的,如果取下ST-link以及去掉飞线,低功耗电流应该是微安级别的。
如果需要代码可以联系我!
STM32低功耗还有STOP1、STOP2、Sleep等模式,后续还会出其他模式低功耗进入以及唤醒分享!如果觉得有用请点赞加收藏!