前言
低功耗设计对于一些便携式产品以及智能穿戴产品尤其重要,其是一种在满足功能、性能要求的前提下,尽量降低集成电路能耗的设计方法。
一、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.系统时钟设置
配置如下:
System Clock source | PLL (MSI) |
---|---|
SYSCLK(Hz) | 80000000 |
HCLK(Hz) | 80000000 |
AHB Prescaler | 1 |
APB1 Prescaler | 1 |
APB2 Prescaler | 1 |
MSI Frequency(Hz) | 4000000 |
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 ms
Wakeup 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等模式,后续还会出其他模式低功耗进入以及唤醒分享!如果觉得有用请点赞加收藏!