主题资源网站建设 反思,将wordpress页面保存为模板,郑州网站建设工资,标准物质网站建设【STM32笔记】低功耗模式下的RTC唤醒#xff08;非闹钟唤醒#xff0c;而是采用RTC_WAKEUPTIMER#xff09; 
前文#xff1a; blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置#xff08;ADC唤醒无法使用、低功耗模式无法烧录…【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 */}