芯片: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模式。 不知原因,先行记录。