STM32 低功耗STOP模式,RTC唤醒
芯片:STM32L071CB
开发环境:STM32CubeMX + keil5.33
使用实时时钟RTC的 WakeUpTimer定时器产生的中断将STM32从STOP低功耗模式下唤醒。
STOP模式: STM32低功耗运行模式之一,该模式下CPU会停止工作,但RAM中的数据仍然保留。待中断或事件触发后程序可以继续运行。
note:1、STOP模式退出后,系统时钟会自动配置为MSI或HSI,需要手动重新配置时钟,以及使用时钟的外设。
2、为了进一步降低STOP模式下的功耗,可以将GPIO设置为ANALOG输入模式,退出stop模式后重新配置GPIO
3、为了能够在STOP模式下进行调试,在main函数中添加 DBGMCU->CR |= DBGMCU_CR_DBG_STOP;
一、使用STM32CubeMX配置工程
1、配置STM32系统时钟,选择石英晶振,外部高速时钟HSE经锁相、倍频、分频后得到32M的系统时钟
2、配置一个用于控制LED灯的GPIO. 推挽输出模式,常拉低
3、配置RTC,激活时钟源、中断使能
RTC使用内部晶振LSI 37KHz 因此预分频系数设置为124 和 295 ,使分频后的时间正好是1秒。
(124+1)*(295+1) = = 37000
二、keil中添加功能性代码
实现的功能是LED灯点亮3秒,LED灯熄灭后进入STOP模式,由RTC定时4秒后唤醒。依次循环
/* USER CODE BEGIN WHILE */ DBGMCU->CR |= DBGMCU_CR_DBG_STOP; /* 为了能够在停止模式下调试 */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET); HAL_Delay(3000); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET); //HAL_Delay(3000); if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 11560, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK) { Error_Handler(); } __HAL_RCC_PWR_CLK_ENABLE(); //使能电源管理时钟 HAL_PWREx_EnableUltraLowPower(); //使能超低功耗 HAL_PWREx_EnableFastWakeUp(); //使能快速唤醒 HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); //进入低功耗STOP模式 //退出stop模式后执行 SystemClock_Config(); MX_GPIO_Init(); } /* USER CODE END 3 */
RTC的初始化配制函数如下:
static void MX_RTC_Init(void) { /** Initialize RTC Only */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 124; hrtc.Init.SynchPrediv = 295; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; 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(); } /** Enable the WakeUp */ if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 11560, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK) { Error_Handler(); } }
RTC初始化配置中的HAL_RTCEx_SetWakeUpTimer_IT 需要保留,否则无法产生中断,系统将一直维持STOP
覆写中断回调函数:
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); }
清除PWR_FLAG_WU标志位是进入STOP模式的必要条件。
三、RTC定时时长的计算
函数 HAL_RTCEx_SetWakeUpTimer(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock) 中的参数WakeUpCounter 和 WakeUpClock 决定定时的时长:
wakeup time = WakeUpCounter * (WakeUpClock /LSI)
本例中:wakeup time = 11560 *(16/37000) = 4s
四、后记
1、程序通过STLINK下载后,按键reset 进行复位,程序无法进入STOP模式,必须断电重启才能进入STOP模式。 不知原因,先行记录。