STM32-RTC 08 📅 发布时间:2026/9/1 15:33:20 👁 浏览次数: 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)来保证其计时与地球自转的协调一致注意示例:中国东八区 北京时间表示GMT8/UTC8后备区域 包括 LSE、RTC、备份寄存器、唤醒电路RTC定义独立的频率的计数器可为系统提供时钟与日历的功能 32位可编程秒计数器对应Unix时间戳20位可编程预分配器适配不同频率的输入时钟输出1Hz的输出时钟RTC时钟源选择 LSE频率32.768KHzRTC_CLK为32768为2的15次方进行2的15次方分频,即可得1Hz的信号 HSE频率8MHzRTC_CLK为8MHz/128 LSI频率4OKHzRTC_CLK为4OKHz寄存器同步 问题驱动RTC外设的时钟不再是系统总线的时钟而是LSE RTC_CLK当cpu读写RTC寄存器还是通过系统总线所以会存在一个同步的问题机制影子寄存器供CPU读写 实际寄存器LSE驱动更新硬件同步操作CPU读影子寄存器硬件等待LSE时钟边沿将数据从实际寄存器加载到影子寄存器CPU写影子寄存器硬件等待LSE时钟边沿将数据从影子寄存器加载到实际寄存器同步等待读取读取RTC影子寄存器时需等待RTC_CRL的RSF位等待实际寄存器数据已同步到影子寄存器 同步等待写入写入RTC实际寄存器时需要先等待上一次写入完成RTOFF位RTC外设的使用 其他外设开启时钟 RTC外设开启PWRRTC时钟PWR使能BKP访问只有使能了备份域访问你才能去修改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 参数闹钟值 返回值无函数调用示例uint8_t alr 1000; RTC_SetAlarm(alr);注意当CNT与ALR相等闹钟标志位为1RTC 标志位RTC模块函数RTC开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSEREADY) RESET); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE);RTC设置时间现有日期转换为时间戳 把时间戳写入RTC寄存器RTC获取时间从RTC寄存器中读取时间戳 时间戳转换为日期