STM32的RTC时钟,星期(week)不是万年历

STM32L1系列单片机的RTC时钟在处理星期时存在误导,实际上RTC的星期参数并不属于万年历功能,而是一个普通寄存器。在跨天时会自动递增,导致星期读取不准确。例如,周六会被读为周一。为正确获取星期,需要在RTC校准时额外计算星期。可以利用特定公式自行计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

由于以前项目上使用的RTC时钟没有用到星期的概念,一直也没有发现整个问题。这次项目上会涉及到week,就发现获取的尽然是不对的。使用的是STM32L1系列的单片机,实际仿真获取一下记录。

先看一下官方寄存器说明吧

在这里插入图片描述

实际都到的RTC寄存器

在这里插入图片描述

解析一下

在这里插入图片描述
发现星期是对不上的,实际是周六这里读取的是周一

结论

RTC时钟里面,week整个参数不属于万年历,只是一个普通的寄存器,在跨天时,会自动递增。所以在校准RTC时,需要单独计算星期。

可以根据这个公式自己计算
链接: link.

基于STM32的实时时钟RTC万年历代码是用于实现日期、时间和万年历功能的程序。以下是一个简单的示例代码: ```c #include "stm32f4xx.h" #include "stm32f4xx_rtc.h" #include "stm32f4xx_rcc.h" #include "stdio.h" void RTC_Configuration(void); int main(void) { RTC_Configuration(); // 配置RTC while (1) { RTC_TimeTypeDef RTC_TimeStructure; RTC_DateTypeDef RTC_DateStructure; RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); // 获取当前时间 RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure); // 获取当前日期 printf("Current Date: %02d-%02d-%04d\n", RTC_DateStructure.RTC_Date, RTC_DateStructure.RTC_Month, RTC_DateStructure.RTC_Year + 2000); printf("Current Time: %02d:%02d:%02d\n", RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds); printf("Day of Week: %d\n", RTC_DateStructure.RTC_WeekDay); // 延时1秒 for (int i = 0; i < 1000000; i++){} RTC_ClearFlag(RTC_FLAG_SEC); // 清除秒中断标志位 } } void RTC_Configuration(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 使能PWR时钟 PWR_BackupAccessCmd(ENABLE); // 允许访问RTC和后备寄存器 RCC_LSEConfig(RCC_LSE_ON); // 使能LSE外部晶振 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){} // 等待LSE晶振稳定 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // 选择RTC时钟源为LSE RCC_RTCCLKCmd(ENABLE); // 使能RTC时钟 RTC_InitTypeDef RTC_InitStructure; RTC_StructInit(&RTC_InitStructure); RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; // 使用24小时制 RTC_InitStructure.RTC_AsynchPrediv = 127; // RTC异步分频器预分频值 RTC_InitStructure.RTC_SynchPrediv = 255; // RTC同步分频器预分频值 RTC_Init(&RTC_InitStructure); // 初始化RTC RTC_DateTypeDef RTC_DateStructure; // 设置初始日期为2021年1月1日 RTC_DateStructure.RTC_Month = RTC_Month_January; RTC_DateStructure.RTC_Date = 1; RTC_DateStructure.RTC_Year = 21; RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Thursday; RTC_SetDate(RTC_Format_BIN, &RTC_DateStructure); } ``` 以上代码实现了一个基于STM32的实时时钟RTC万年历功能。在`main`函数中,获取并显示当前的日期、时间和星期几,并通过循环每秒刷新显示。`RTC_Configuration`函数用于配置RTC相关的寄存器和时钟源,并设置初始日期为2021年1月1日。请注意,此示例代码仅供参考,并且可能需要根据具体的STM32型号和开发环境进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值