实时时钟(RTC)是独立于主功能外的一个模块,用做与日历时间有关的计时功能。过去有专门的芯片如:DS1302。现在由于芯片的集成度工艺的提高,很多MCU芯片厂商将时钟芯片集成到一个芯片当中。使得设计大大简化了。但是原则上RTC是一个外置的模块,MCU的活动不影响RTC的功能。如果需要RTC模块可以使用独立的电池供电,来保证时间的连续性。
这是我从STM32G431手册上摘录的RTC功能:
- 具有BCD(二进制编码的十进制)格式的亚秒,秒,分钟,小时(12或24格式),星期,日期,月份,年份的日历。
- 自动更正每月的28、29(闰年),30和31天。
- 两个可编程警报器。
- 从1到32767 RTC时钟脉冲进行实时校正。这可用于将其与主时钟同步。
- 参考时钟检测:可以使用更精确的第二个源时钟(50或60 Hz)来提高日历精度。
- 具有0.95 ppm分辨率的数字校准电路,以补偿石英晶体的误差。
- 时间戳功能,可用于保存日历内容。可捕获时间戳引脚上的事件,篡改事件或切换VBAT模式触发事件。
- 17位自动重载唤醒定时器(WUT),用于具有可编程分辨率和周期性事件。 RTC供电切换开关,该开关可以控制VDD电源或VBAT引脚供电。
RTC的时钟源可以是: (1)32.768 kHz外部晶体(LSE);(2)外部谐振器或振荡器(LSE) ;(3)内部低功耗RC振荡器(LSI,典型频率为32 kHz);(4)高速外部时钟(HSE)32分频。
RTC由LSE计时时,在VBAT模式和所有低功耗模式下均可用。当使用LSI时钟时,RTC在VBAT模式下不起作用,但在除关机模式外的所有低功耗模式下都起作用。所有RTC事件(警报,唤醒定时器,时间戳)都可以生成中断并将设备从低功耗模式唤醒。
对以上主要内容做个介绍:
根据以往的经验,RTC模块的计时还是比较准确的,工作也较为稳定。但是该模块相较DS1302还是比较费电的。有时CR1220的电池用不了一年就没电了(不知道是不是我的电池问题还是我的电路设计或是运行环境的事?)。需要主意的是:RTC的时钟一定要选对了,如果你选择了内部时钟计数器,时钟的误差就会很大!
RTC的模块中除了有计时功能外,还有一块RAM,叫做:备份寄存器。这个RAM可以使用电池供电,常常用来保存一些需要掉电保持的数据。如机器的运行状态什么的,因为是RAM所以读写次数不限,只要电池有电。可以代替有擦写次数限制的EEPROM。这一区域是独立于主MCU功能的,所以不能直接使用地址来访问。需要RTC的操作寄存器来访问。
入侵检测:RTC模块设有专用的引脚,只要这个引脚出现电平变化,就会擦除备份寄存器中的数据。这个功能可以用防止恶意的拆机等应用。
本次测试还是使用的STM32Cube,首先设置RTC功能使能。注意时钟设置为外部32.768K晶振。
然后激活日历功能。
HAL_RTC_GetTime(&hrtc, &stimestructure, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sdatestructure, RTC_FORMAT_BIN);
printf("%02d/%02d/%02d\r\n",2000 + sdatestructure.Year, sdatestructure.Month, sdatestructure.Date);
printf("%02d:%02d:%02d\r\n",stimestructure.Hours, stimestructure.Minutes, stimestructure.Seconds);
使用HAL_RTC_GetTime和HAL_RTC_GetDate函数读取RTC的计时和日历。HAL_RTC_SetDate和HAL_RTC_SetTime设置初始的时间。到此你的时钟就可以使用了。
此
内容由EEWORLD论坛网友bigbat原创,如需转载或用于商业用途需征得作者同意并注明出处