▲ 点击上方 关注STM32

RTC,Real_Time Clock,即实时时钟,在许多电子系统中都能看到实时时钟的存在。

今天是第6篇分享,《STM32学习笔记》之RTC日历基础应用问题分析

每块STM32内部都集成了一个RTC模块,是一个独立的定时器/计数器,具有计数、时钟和闹钟等功能。

STM32 RTC 基础内容

STM32内部集成的RTC相当于一个TIM,具有计数的功能,但和TIM有一些区别,比如供电来自备份区域,可作为低功耗模式自动唤醒单元等。

STM32的RTC除F1系列不具有BCD寄存器(日历功能)之外,其他系列的RTC大同小异,本文以F4系列RTC为例进行讲述。

1. RTC时钟源

RTC不具备自己输出时钟信号的功能,和TIM一样由内部,或外部晶振提供时钟源。

通常是由低速外部晶振(LSE)32.768 kHz,或者低速内部晶振(LSI)提供。内部晶振误差大,如果要求高精度需使用外部晶振。

当然,还可以使用高速外部晶振(HSE)的分频信号作为时钟源,但该时钟源有最高频率限制。

2. RTC日历

RTC的日历功能算是一个比较重要的功能,但是在早期的F1系列中不具备该功能,需要结合软件计算才能实现日期和时间的功能。

除F1系列的RTC自生具备日历功能,即具有日期、时间、亚秒等于日历相关的寄存器,只需要直接读取寄存器即可获取日历信息。

同时,系统可以自动将月份的天数补偿为 28、 29(闰年)、 30 和 31 天。并且还可以进行夏令时补偿。

3. RTC闹钟

RTC闹钟功能也是一个比较实用的功能,大部分RTC都具有两个可编程的闹钟:闹钟A和闹钟B。

RTC闹钟可产生中断信号,也可以产生闹钟输出信号。

4. RTC自动唤醒

有的产品需要周期性唤醒,比如间隔5秒唤醒一次休眠的芯片。

RTC自动唤醒由 16 位可编程自动重载递减计数器生成,通过 WUTE 位可扩展至17位。如果频率为1Hz,则自动唤醒时间可以 1s 到 36h 左右。

以上是重点知识点,更多细节请查阅芯片对应的参考手册。

STM32 RTC 参数配置

STM32 的RTC使用比较方便,不像TIM各种复杂的关系,可以通过STM32CubeMX很简单就能使用RTC的各项功能。

下面以F4、Cube配置日历为例。

1. 配置时钟源

2. 配置分频值

通过32.768kHz信号得到1Hz分辨率,可参考例程默认分频配置:

32768/128/256 = 1.

备注:从0开始分频,所以配置的分频值需要减一:127 = 128 - 1, 255 = 256 - 1.

3. 初始化时间和日期

通过Cube工具初始化时间、日期以及格式:

以上就是通过Cbue工具配置的参数,生成的代码:

static void MX_RTC_Init(void)
{/* USER CODE BEGIN RTC_Init 0 *//* USER CODE END RTC_Init 0 */RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef sDate = {0};/* USER CODE BEGIN RTC_Init 1 *//* USER CODE END RTC_Init 1 *//** Initialize RTC Only */hrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv = 127;hrtc.Init.SynchPrediv = 255;hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}/* USER CODE BEGIN Check_RTC_BKUP *//* USER CODE END Check_RTC_BKUP *//** Initialize RTC and set the Time and Date */sTime.Hours = 0x0;sTime.Minutes = 0x0;sTime.Seconds = 0x0;sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sTime.StoreOperation = RTC_STOREOPERATION_RESET;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}sDate.WeekDay = RTC_WEEKDAY_MONDAY;sDate.Month = RTC_MONTH_JANUARY;sDate.Date = 0x1;sDate.Year = 0x0;if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}/** Enable the WakeUp */if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK){Error_Handler();}/* USER CODE BEGIN RTC_Init 2 *//* USER CODE END RTC_Init 2 */
}

RTC通过Cube工具配置比较省心,如果使用标准外设库进行配置,就需要注意很多细节,简单参考官方提供例程。

STM32 RTC 常见问题

STM32内部RTC模块应用场景相对简单,不像TIM有复杂的配置以及关联性。但使用RTC仍需要注意一些细节问题。

问题一:RTC时间不准

有不少工程师都遇到过RTC计数一天,相差几秒甚至几十秒的情况。导致时间不准最根本的原因是时钟源,还有时钟分频值。

低速内部晶振(LSI)的误差相对较大,特别是温差变化较大的环境。

还有关于时钟分频值,上面已经提到了分频128,实际配置参数应该为127.

解决办法:使用更高精度低速外部晶振、校正、软件配置正确分频值。

问题二:RTC时钟配置失败

RTC的供电来源备份区域电源,操作RTC之前,需要使能后备区域操作。如果没有这一步操作,你会发现操作低速时钟、RTC可能会失败。

当然,出现这种情况,一般是使用标准外设库配置导致的失败。

解决办法:使用Cube工具,或参考官方例程初始化代码。

问题三:RTC日历不更新的问题

在我们的RTC应用中,经常有人反映在做日历数据读取操作时发现日历不更新的情形。其实,STM32  RTC的日历寄存器由两个组成,为了保证读取时间点的一致性,先读时分秒然后读日期做为一个完整的日历读取操作。在读取TIME【时分秒】后,硬件会将当前日历数据锁住,直到DATE【年月日】寄存器被读取后释放。否则会遇到读取日历时发生数据不更新的情况。

解决办法:对于RTC日历的读取要注意读取动作的完整性,读了TIME还要读取DATE才算一个完整操作,以保持读取时间的一致性。

【STM32】学习笔记RTC日历基础应用问题分析相关推荐

  1. STM32学习笔记 | CAN总线收发数据常见问题分析

    关注+星标公众号,不错过精彩内容 CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. CAN总线和UART.I2C.SP ...

  2. STM32学习笔记1——软硬件基础之keil5编程与GPIO开发

    目录 前言 一.Keil uVision5 MDK软件的安装以及一些问题的解决方案 1.1 软件安装 1.2 注意事项 二. keil5编程与GPIO开发 2.1 第一步:使能IO口时钟 2.2 第二 ...

  3. 野火STM32学习笔记一、固件库文件分析

    STM32固件库文件分析 汇编编写的启动文件 startup_stm32f10x_hd.s: 设置堆栈指针.设置PC指针.初始化中断向量表.配置系统时钟.调用C库函数main最终去到C的世界 时钟配置 ...

  4. 《STM32学习笔记》4——核心功能电路与编程(下)

    接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...

  5. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

  6. 《STM32学习笔记》2——开发环境的建立

    接上文,文中的图片知识,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.接口定义 1 芯片引脚整体简介 2 各部分引脚介绍 二.开发板简介 三.IS ...

  7. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

  8. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)

    菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...

  9. STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...

最新文章

  1. editplus替换空白行的正则表达式
  2. vim 使用技巧 转载
  3. stm32f103 spi slave从机模式miso需要上拉
  4. golang interface的使用和实现(翻译整理)
  5. react学习(45)----react组件
  6. javascript框架比较(二)
  7. 基于Metronic的Bootstrap开发框架经验总结(11)--页面菜单的几种呈现方式
  8. weightedrandomSamplers(2)
  9. 同质异质网络——(F(fraud) A(Analytics) UDPSNT(Wylie_2015))
  10. sendmessage()模拟鼠标点击
  11. win10中VM15内centos7的安装
  12. 在没有源代码的情况下调试JAR包..
  13. linux模拟发包工具,发包开源工具TRex在IPS测试中的应用
  14. mysql数据库巡检方案_美团 MySQL 数据库巡检系统的设计与应用
  15. 课堂笔记-爬虫beautifulsoup模块
  16. 罗永浩:做直播带货很赚钱,一晚上利润轻松几百万 比卖锤子手机过瘾
  17. linux操作的进程调度没有采用,Linux进程调度分析
  18. 没“硬货”!不卖手机的苹果做起了信用卡和脱口秀
  19. VMware vSphere 介绍、安装 服务器虚拟化部署完整配置
  20. <dl>、<dt>、<dd> 的使用

热门文章

  1. JavaWeb总结(四)—JSP深入解析
  2. android-数据库SQLite相关
  3. iOS 应用开发基础翻译 改为 笔记和总结
  4. IE6环境下遭遇winow.location.href=''的跳转bug
  5. UA MATH563 概率论的数学基础 鞅论初步9 分支过程简介
  6. UA SIE545 优化理论基础4 对偶理论简介2 弱对偶与Duality Gap
  7. hdu2100(大数加)
  8. Dockerfile命令详解
  9. 340. 通信线路(分层图最短路)
  10. CSDN代码块显示颜色