RTC简介

RTC前置:

  • Unix时间戳 从UTC/GMT的伦敦时间1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒

  • 时间标准GMT/UTC GMT:把地球自转一周的时间间隔等分为24小时一天,作为时间标准 UTC:它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒,将此作为时间基准。 纠偏:当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时(地球越转越慢),UTC会执行闰秒(多走1s)来保证其计时与地球自转的协调一致 注意 示例:中国东八区 北京时间表示GMT+8/UTC+8

  • 后备区域 包括 LSE、RTC、备份寄存器、唤醒电路

RTC定义: 独立的频率的计数器,可为系统提高时钟与日历的功能 32位可编程秒计数器,对应Unix时间戳;20位可编程预分配器,适配不同频率的输入时钟输出1Hz的输出时钟

RTC:

  • 时钟源选择 LSE,频率:32.768KHz,RTC_CLK为32768,为2的15次方,进行2的15次方分频,即可得1Hz的信号 HSE,频率:8MHz,RTC_CLK为8MHz/128 LSI,频率:4OKHz,RTC_CLK为4OKHz

  • 寄存器同步 问题:驱动RTC外设的时钟不再是系统总线的时钟,而是LSE RTC_CLK,当cpu读写RTC寄存器还是通过系统总线,所以会存在一个同步的问题

机制:影子寄存器供CPU读写 实际寄存器LSE驱动更新

硬件同步操作:CPU读影子寄存器,硬件等待LSE时钟边沿,将数据从实际寄存器加载到影子寄存器;CPU写影子寄存器,硬件等待LSE时钟边沿,将数据从影子寄存器加载到实际寄存器;

同步等待读取:读取RTC影子寄存器时,需等待RTC_CRL的RSF位,等待实际寄存器数据已同步到影子寄存器 同步等待写入:写入RTC实际寄存器时,需要先等待上一次写入完成(RTOFF位)

  • RTC外设的使用 其他外设:开启时钟 RTC外设:开启PWR RTC时钟,PWR使能RTC访问

  • 内置时间差 LSE 外部晶振误差,导致RTC_CLK误差,经过分频后,计时频率误差

RTC函数

RTC 等待同步函数:

  • 函数使用: 函数:RTC_WaitForSynchro 无参无返回值

  • 函数调用示例

RTC_WaitForSynchro();

注意 cpu通过系统总线读取RTC寄存器时,等待实际寄存器同步到影子寄存器

RTC 等待上一步操作完成函数:

  • 函数使用: 函数:RTC_WaitForLastTask 无参无返回值

  • 函数调用示例

RTC_WaitForLastTask();

注意 cpu通过系统总线写RTC寄存器时,等待影子寄存器同步到实际寄存器

RTC 设置预分频值函数:

  • 函数使用: 函数:RTC_SetPrescaler 参数:分频值 返回值:无

  • 函数调用示例

RTC_SetPrescaler(32768 - 1);

RTC 设置秒计数器函数:

  • 函数使用: 函数:RTC_SetCounter 参数:时间戳 返回值:无

  • 函数调用示例

RTC_SetCounter(time_cnt);

RTC 获取秒计数器值函数:

  • 函数使用: 函数:RTC_GetCounter 参数:无 返回值:时间戳

  • 函数调用示例

uint32_t time_cnt = RTC_GetCounter();

RTC 设置闹钟函数:

  • 函数使用: 函数:RTC_SetAlarm 参数:闹钟值 返回值:无

  • 函数调用示例

RTC_SetAlarm(RTC_GetCounter() + 10);

注意 当CNT与ALR相等,闹钟标志位为1

RTC 标志位:

RTC模块函数

RTC开启时钟

RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_LSEREADY) == RESET);
​
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);

RTC设置时间

现有日期转换为时间戳
把时间戳写入RTC寄存器                        

RTC获取时间

从RTC寄存器中读取时间戳   
时间戳转换为日期                    
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐