2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【极海APM32替代笔记】低功耗模式下的RTC唤醒(非闹钟唤醒 而是采用RTC_WAKEUPTIMER)

【极海APM32替代笔记】低功耗模式下的RTC唤醒(非闹钟唤醒 而是采用RTC_WAKEUPTIMER)

时间:2021-05-27 16:22:13

相关推荐

【极海APM32替代笔记】低功耗模式下的RTC唤醒(非闹钟唤醒 而是采用RTC_WAKEUPTIMER)

【极海APM32替代笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

【STM32笔记】低功耗模式配置及避坑汇总

前文:

/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唤醒引脚极性配置,其他模式无用** @returnNone*/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();}

注意:该唤醒方式其实是将RTC中断作为EXTI在使用

打包一下就是:

/*!* @brief 配置RTC在低功耗模式下的唤醒 ** @param [in]counter: 计数值*[in]clock: 时钟值*[in]EnableNotDisable: 使能或者关闭** @returnNone*/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 */}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。