STM32L0系列之02 RTC唤醒待机模式

前言

使用芯片:STM32L051R8T6
软件平台:KEIL V5、STM32CubeL0
库函数:HAL

一、硬件介绍

1、单片机的系统时钟为:32Mhz,由PLL时钟提供
2、PLL通过8MHz的高速外部晶振(HSE)经过8倍频,2分频后得到
3、RTC始终源选择32.768KMz的石英晶体振荡器(LSE),是的RTC在停机和待机两种低功耗模式下工作,并可以用作唤醒源;
4、如果 RTC 的时钟由 LSE 提供,则 RTC 在系统复位后仍可获得时钟并保持正常工作。

二、待机模式介绍

1、待机模式下I/O状态

在待机模式下,除以下各部分以外,所有 I/O 引脚都处于高阻态:
(1) 复位引脚
(2)唤醒引脚(WKUP1、 WKUP2、 WKUP3)
(3)以下 I/O 上的 RTC 功能(入侵、时间戳、 RTC 闹钟输出、 RTC 时钟校准输出):
– 类别 3: PC13、 PA0
– 类别 5: PC13、 PA0、 PE6

2、进入待机模式

  PDDS 位 +SLEEPDEEP 位 +WFI,从 ISR 返回或 WFE

3、退出待机模式

WKUP 引脚上升沿、RTC 闹钟(闹钟 A 或闹钟 B)、 RTC 唤醒事件、RTC 入侵事件、RTC 时间戳事件、NRST 引脚外部复位、IWDG 复位

三、程序代码

1、 系统时钟配置

void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/**Configure the main internal regulator output voltage */__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/**Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;//RCC_OscInitStruct.HSIState = RCC_HSI_ON; //ADC的时钟源RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/**Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK){Error_Handler();}
}

2、 RTC时钟配置

void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{RCC_OscInitTypeDef RCC_OscInitStruct;RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;/*##-1- Configue the RTC clock soucre ######################################*/
#ifdef RTC_CLOCK_SOURCE_LSE/* -a- Enable LSE Oscillator */RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSE;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;RCC_OscInitStruct.LSEState = RCC_LSE_ON;if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){ while(1);}/*##-2- Enable the RTC peripheral Clock ####################################*//* Enable RTC Clock */__HAL_RCC_RTC_ENABLE();/*##-3- Configure the NVIC for RTC Alarm ###################################*/HAL_NVIC_SetPriority(RTC_IRQn, 0x0, 0);HAL_NVIC_EnableIRQ(RTC_IRQn);
}

3、 RTC初始化配置配置

void SystemPower_Config(void)
{__HAL_RCC_PWR_CLK_ENABLE(); HAL_PWREx_EnableUltraLowPower();/* Enable the fast wake up from Ultra low power mode */HAL_PWREx_EnableFastWakeUp();/* Configure RTC */RTCHandle.Instance = RTC;/* Set the RTC time base to 1s *//* Configure RTC prescaler and RTC data registers as follow:- Hour Format = Format 24- Asynch Prediv = Value according to source clock- Synch Prediv = Value according to source clock- OutPut = Output Disable- OutPutPolarity = High Polarity- OutPutType = Open Drain */RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;HAL_RTC_Init(&RTCHandle) ;__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);    // 清除唤醒标志__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // 清除待机标志HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 8192, RTC_WAKEUPCLOCK_RTCCLK_DIV16);__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);}

写程序的时候忘记配置 __HAL_RCC_PWR_CLK_ENABLE(); 导致RTC不能正常工作

4、 进入待机模式

void LowPower_enter_standby(void)
{printf("=== Power standby ===\r\n");HAL_Delay(50);//UART1; 减少16uAHAL_UART_MspDeInit(&huart);HAL_UART_MspDeInit(&huart2);__HAL_RCC_GPIOA_CLK_DISABLE();__HAL_RCC_GPIOB_CLK_DISABLE();__HAL_RCC_GPIOC_CLK_DISABLE();__HAL_RCC_GPIOH_CLK_DISABLE();// 禁用 调试端口 少800uA,下面2句函数功能一样!//HAL_DBGMCU_DisableDBGStandbyMode();HAL_DBGMCU_DBG_DisableLowPowerConfig(DBGMCU_SLEEP | DBGMCU_STOP | DBGMCU_STANDBY);// 若需要在低功耗模式下调试程序,可以打开此函数//HAL_DBGMCU_DBG_EnableLowPowerConfig(DBGMCU_SLEEP | DBGMCU_STOP | DBGMCU_STANDBY);// PIN1 连接到 PWR->CR 的 PWR_FLAG_WU 标记// 用于待机模式IO唤醒,唤醒后判断WKUP按钮状态//       WKUP pin 1 (PA00) if enabled.//      WKUP pin 2 (PC13) if enabled.//      WKUP pin 3 (PE06) if enabled, for stm32l07xxx and stm32l08xxx devices only.//      WKUP pin 3 (PA02) if enabled, for stm32l031xx devices only.HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // 清除待机标志/*## Setting the RTC Wake up time ########################################*//*  RTC Wakeup Interrupt Generation:Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI))Wakeup Time = Wakeup Time Base * WakeUpCounter= (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI)) * WakeUpCounter==> WakeUpCounter = Wakeup Time / Wakeup Time BaseTo configure the wake up timer to 4s the WakeUpCounter is:RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16Wakeup Time Base = 16 /(~32768Hz) = ~488.3usWakeup Time = ~4s = 0,410ms  * WakeUpCounter==> WakeUpCounter = 4s/488.3us = 8192  */
#ifdef __rtc_H// 该功能可以用Cubme RTC内配置,代码可以参考rtc.c文件内// rtc 唤醒采用LSE时钟,第一参数,计数溢出唤醒;第二参数:进行16分配HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 8192, RTC_WAKEUPCLOCK_RTCCLK_DIV16);__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
#endif/* Enter Standby Mode */HAL_PWR_EnterSTANDBYMode();}

三、测试结果

TM32L0系列之02 RTC唤醒待机模式相关推荐

  1. STM32的RTC闹钟唤醒待机模式

    通过RTC闹钟不能唤醒待机模式下的STM32,但是当注释掉下面这一句程序的时候,就能通过RTC闹钟唤醒. PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚功能 这就给我们一种错误的判 ...

  2. STM32——浅谈睡眠模式、停机模式、待机模式

    若要理解低功耗,则先要说一下STM32的事件和中断 事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断.在STM32中,中断与事件不是等价的,一个中断肯定对应一个事件,但一个事件不一 ...

  3. [STM32F1]STM32 低功耗待机模式与RTC周期唤醒

    STM32等类似Cortex-M3的MCU在系统或电源复位以后,MCU就会处于程序运行状态.当用户不需继续运行程序时,可以利用进入低功耗模式来节省电池电量,当需要重新运行时,可以通过特定条件进行唤醒程 ...

  4. 【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

    [STM32笔记]低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_5340 ...

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

    [极海APM32替代笔记]低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_ ...

  6. STM32 待机模式 和 停止模式 RTC闹钟调试笔记

    待机模式 不进入待机模式 闹钟中断服务函数可以进去 进入待机模式WakeUp唤醒后能否进入闹钟中断服务函数 1.待机模式唤醒后,不会进入闹钟中断服务函数,所以会导致wakeup唤醒后,此时闹钟唤醒时间 ...

  7. STM32CubeMX(stm32F030C8T6) 之RTC闹钟唤醒停机模式-STM32开发实战 (2)

    一.概述 本例程是用STOP休眠模式,用RTC的周期性自动唤醒功能来唤醒芯片. 根据手册的说明:这里有个可编程的可自动重装的向下计数器,按照相应的时钟频率赋予适当的值,每当向下计数到0时便产生一个唤醒 ...

  8. stm32 cubemx RCT 闹钟 待机模式唤醒

    工程文件: https://download.csdn.net/download/qq_44179528/19142503 https://download.csdn.net/download/qq_ ...

  9. STM32/AMP32F407进入低功耗待机模式后立马被唤醒的解决办法

    最近项目用到低功耗,但是调试发现进入待机就被唤醒的问题,清除WU.SB两个唤醒标志位,也依然被立马唤醒一次. /* 进入待机模式 */HAL_PWR_EnterSTANDBYMode(); 通过极海的 ...

最新文章

  1. mysql 列累加计算
  2. JavaScript学习笔记——underscore操作对象的方法
  3. 傅里叶级数FS, 离散傅里叶变换DFT
  4. C中指针和数组引发的探索二
  5. java面向对象编程集合边框_第六章使用java实现面向对象-集合框架
  6. C++ 中的深入浅拷贝和深拷贝
  7. JAVA对象转Json对象
  8. Android如何修改手机文件名称
  9. 计算机42D,汉印G42D 电子面单打印机
  10. Springboot集成SMS发送短信
  11. CHD的impala实现hive和hbase数据查询
  12. smartbi连接mysql数据库_Smartbi_V9配置MySQL8作为知识库
  13. 测试用例方法--错误推测法
  14. 【实例】python 使用beautifulSoup 抓取网页正文 以淘宝商品价格为例
  15. 语雀可以导出html吗,工具 - Confluence 迁移到语雀 - 《语雀使用文档》 - 书栈网 · BookStack...
  16. java pdf 套打_itext生成发票套打(操作PDF)
  17. Linux--增加用户、添加用户组
  18. Android Studio类微信界面之RecyclerView设计
  19. 中括号文本添加下滑线样式
  20. 彻底卸载MySQL8.0

热门文章

  1. intel、ATi显卡驱动的安装及其它显卡的驱动资源
  2. LCD1602驱动(51单片机)
  3. 1.1GIS工具箱中英文对照(基于10.2)——Spatial Analyst Tool,Analysis Tools
  4. 支付宝微信推出高速收费新服务器,微信、支付宝启动高速收费无感支付
  5. FPGA智能交通灯控制器系统系统设计
  6. 天问51单片机结合WIFI模块上传温度数据到TCP服务器
  7. 算法导论/第一部分_基础知识
  8. SAP 系统设置不允许到对象XXX的修改或系统更改选项不允许更改对象
  9. IDEA 2021免费下载(附安装教程)
  10. Qin Shi Huang's National Road System( 次小生成树 )