STM32-RTC 08
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寄存器中读取时间戳 时间戳转换为日期
更多推荐

所有评论(0)