【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)
前文:
blog.csdn.net/weixin_53403301/article/details/128216064
【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)
低功耗模式如图所示
停止模式有三种 分别是0 1 2
其中 0 1可以由串口唤醒
2只能由LPUART唤醒
在手册里可以查到
进入也很简单:
/*!
* @brief 进入低功耗模式
*
* @param [in] mode_flag: 模式标志
* 0/大于4 不进入任何模式,1 进入睡眠,2 进入停止,3 进入待机,4 关机
* [in] WakeUpPinPolarity: 待机模式下WKUP唤醒引脚极性配置,其他模式无用
*
* @return None
*/
void Enter_Low_PWR(uint8_t mode_flag,uint32_t WakeUpPinPolarity)
{
__HAL_RCC_PWR_CLK_ENABLE();
switch(mode_flag)
{
case 0:
{
printf("[INFO] 不进入低功耗模式\n");
break;
}
case 1:
{
printf("[INFO] 进入睡眠模式\n");
delay_ms(10); //消抖
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
break;
}
case 2:
{
printf("[INFO] 进入停止模式\n");
delay_ms(10); //消抖
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);
break;
}
case 3:
{
printf("[INFO] 三秒后进入待机模式\n");
delay_ms(3000);
printf("[INFO] 进入待机模式\n");
HAL_PWR_EnableWakeUpPin(WakeUpPinPolarity);
delay_ms(10); //消抖
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_EnterSTANDBYMode();
break;
}
case 4:
{
printf("[INFO] 三秒后进入关机模式\n");
delay_ms(3000);
printf("[INFO] 进入关机模式\n");
HAL_PWR_EnableWakeUpPin(WakeUpPinPolarity);
delay_ms(10); //消抖
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWREx_EnterSHUTDOWNMode();
break;
}
default:
{
printf("[INFO] 不进入低功耗模式\n");
break;
}
}
}
要进入停止2模式则需要在pwr_ex.c中配置
HAL_PWREx_EnterSTOP2Mode();函数
其中
HAL_PWR_EnterSTOPMode中的PWR_MAINREGULATOR_ON、PWR_LOWPOWERREGULATOR_ON分别是开启稳压器和关闭稳压器 分别对应STOP 0和1
所有的模式都可以用RTC唤醒
可以在手册里面找到外部中断线 所以RTC可以唤醒任一模式
RTC开启Internal WakeUp
在Wake Up配置中 完全不用设置(后面的语句可以直接配)
另外开启唤醒中断
在进入低功耗前 需要先调用RTC唤醒中断配置
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,counter,clock);
同样 退出时 要在注册的回调里面关闭中断
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
__HAL_RCC_PWR_CLK_ENABLE();
SystemClock_Config();
__HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_IT();
}
打包一下就是:
/*!
* @brief 配置RTC在低功耗模式下的唤醒
*
* @param [in] counter: 计数值
* [in] clock: 时钟值
* [in] EnableNotDisable: 使能或者关闭
*
* @return None
*/
void Ctrl_RTC_WakeUp(uint32_t counter,uint32_t clock,bool EnableNotDisable)
{
if(EnableNotDisable)
{
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,counter,clock);
}
else
{
__HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_IT();
}
}
调用:
Ctrl_UART_StopMode_WakeUp(&huart2,true);
Ctrl_RTC_WakeUp(2000,RTC_WAKEUPCLOCK_RTCCLK_DIV16,true);
Enter_Low_PWR(2,0);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("[INFO] ADC: %f\n",Get_Real_ADC_Value(&hadc2));
Count_ADXL345();
Count_TMP75();
TIM_Delay_ms(1000,&htim6);
Ctrl_UART_StopMode_WakeUp(&huart2,true);
Ctrl_RTC_WakeUp(2000,RTC_WAKEUPCLOCK_RTCCLK_DIV16,true);
Enter_Low_PWR(2,0);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}