STMCU小助手
发布时间:2021-3-9 13:11
|
STM32学习笔记 | RTC日历基础应用问题分析 ) k" y! ]; m3 h6 C# u; h RTC,Real_Time Clock,即实时时钟,在许多电子系统中都能看到实时时钟的存在。 # O# }) v9 @6 @2 U( E/ O 每块STM32内部都集成了一个RTC模块,是一个独立的定时器/计数器,具有计数、时钟和闹钟等功能。 ; p6 O# T. g& n4 U) P( ^# \ STM32 RTC 基础内容 STM32内部集成的RTC相当于一个TIM,具有计数的功能,但和TIM有一些区别,比如供电来自备份区域,可作为低功耗模式自动唤醒单元等。 STM32的RTC除F1系列不具有BCD寄存器(日历功能)之外,其他系列的RTC大同小异,本文以F4系列RTC为例进行讲述。 1. RTC时钟源 Z; o3 |: ?4 M& G RTC不具备自己输出时钟信号的功能,和TIM一样由内部,或外部晶振提供时钟源。 通常是由低速外部晶振(LSE)32.768kHz,或者低速内部晶振(LSI)提供。内部晶振误差大,如果要求高精度需使用外部晶振。 当然,还可以使用高速外部晶振(HSE)的分频信号作为时钟源,但该时钟源有最高频率限制。 7 {! r" S+ h- i0 c" E9 d$ l
2. RTC日历 RTC的日历功能算是一个比较重要的功能,但是在早期的F1系列中不具备该功能,需要结合软件计算才能实现日期和时间的功能。 除F1系列的RTC自生具备日历功能,即具有日期、时间、亚秒等于日历相关的寄存器,只需要直接读取寄存器即可获取日历信息。 同时,系统可以自动将月份的天数补偿为 28、 29(闰年)、 30 和 31 天。并且还可以进行夏令时补偿。 ! i2 O B! V% q9 T4 R: c* r1 T 3. RTC闹钟 # ~8 h7 S# h/ ]5 {- j9 H RTC闹钟功能也是一个比较实用的功能,大部分RTC都具有两个可编程的闹钟:闹钟A和闹钟B。 RTC闹钟可产生中断信号,也可以产生闹钟输出信号。 # f' o8 S+ v8 p2 ]8 @7 x 4. RTC自动唤醒 有的产品需要周期性唤醒,比如间隔5秒唤醒一次休眠的芯片。 RTC自动唤醒由 16 位可编程自动重载递减计数器生成,通过 WUTE 位可扩展至17位。如果频率为1Hz,则自动唤醒时间可以 1s 到 36h 左右。 以上是重点知识点,更多细节请查阅芯片对应的参考手册。 : R2 E" m( A4 H0 L STM32 RTC 参数配置 ) f% b' e" v' `- ^3 @5 {1 B STM32 的RTC使用比较方便,不像TIM各种复杂的关系,可以通过STM32CubeMX很简单就能使用RTC的各项功能。 下面以F4、Cube配置日历为例。 8 }$ W! W: ?8 U0 A" X1 J 1. 配置时钟源 ! o( W8 O! z, F& i
2. 配置分频值 通过32.768kHz信号得到1Hz分辨率,可参考例程默认分频配置: 32768/128/256 = 1. 备注:从0开始分频,所以配置的分频值需要减一:127 = 128 - 1, 255 = 256 - 1. # s) ^. U! T/ C o' z 3. 初始化时间和日期 + T- T) i# H+ n1 f8 \2 M; a# y2 `2 K 通过Cube工具初始化时间、日期以及格式:
以上就是通过Cbue工具配置的参数,生成的代码:
RTC通过Cube工具配置比较省心,如果使用标准外设库进行配置,就需要注意很多细节,简单参考官方提供例程。 STM32 RTC 常见问题 STM32内部RTC模块应用场景相对简单,不像TIM有复杂的配置以及关联性。但使用RTC仍需要注意一些细节问题。 [" o* ^) k2 p# i8 P$ ^4 ?1 x 问题一:RTC时间不准 有不少工程师都遇到过RTC计数一天,相差几秒甚至几十秒的情况。导致时间不准最根本的原因是时钟源,还有时钟分频值。 低速内部晶振(LSI)的误差相对较大,特别是温差变化较大的环境。 还有关于时钟分频值,上面已经提到了分频128,实际配置参数应该为127. 解决办法:使用更高精度低速外部晶振、校正、软件配置正确分频值。 0 q& g3 s1 @$ t/ c: | 问题二:RTC时钟配置失败 RTC的供电来源备份区域电源,操作RTC之前,需要使能后备区域操作。如果没有这一步操作,你会发现操作低速时钟、RTC可能会失败。 当然,出现这种情况,一般是使用标准外设库配置导致的失败。 解决办法:使用Cube工具,或参考官方例程初始化代码。 问题三:RTC日历不更新的问题 在我们的RTC应用中,经常有人反映在做日历数据读取操作时发现日历不更新的情形。其实,STM32 RTC的日历寄存器由两个组成,为了保证读取时间点的一致性,先读时分秒然后读日期做为一个完整的日历读取操作。在读取TIME【时分秒】后,硬件会将当前日历数据锁住,直到DATE【年月日】寄存器被读取后释放。否则会遇到读取日历时发生数据不更新的情况。 解决办法:对于RTC日历的读取要注意读取动作的完整性,读了TIME还要读取DATE才算一个完整操作,以保持读取时间的一致性。 复盘一下 ▼RTC 基础内容:时钟源、日历、闹钟、自动唤醒; ▼RTC 参数配置:时钟源、分频值、初始化; ▼RTC 常见问题:RTC时间不准、RTC时钟配置失败、重启会复位RTC时钟; 文章出处: STM32 |
《STM32CubeMX2 实战课程》学习笔记5+CubeMX2生成的Uart初始化代码中没有使能
《STM32CubeMX2 实战课程》学习笔记4+FreeRTOS中的SysTick错误及改正
使用stm32C542做的低功耗密码锁示例
《STM32CubeMX2 实战课程》学习笔记1+由MX2生成MDK5项目并打开
《STM32CubeMX2 实战课程》学习笔记3.+sleep/stop/standby低功耗模式的入口
《STM32CubeMX2 实战课程》学习笔记2+MX2生成的MDK5工程中添加已存在文件(*.c / *.h)
【STM32MP257-DK】01开发板开箱、ST MPU 生态资源使用、环境搭建以及镜像更新
基于STM32在线升级OTA经验分享
【STM32C0测评】Nucleo-C092开发板驱动DS1302实验
Keil下的STM32N6之RAM运行工程配置说明
微信公众号
手机版