ST意法半导体
直播中

h1654155275.5753

8年用户 1178经验值
私信 关注
[问答]

在STM32L431上使用内部RTC,时间运行到23:59:59秒后,变为了24:00:00并不是00:00:00,为什么?

大家好,我在STM32L431上使用内部RTC,时间运行到23:59:59秒后,变为了24:00:00,并不是00:00:00,并且weekday也没有加一,这是为什么呢?

回帖(2)

康永清

2025-3-11 16:19:27
观察一下寄存器,最好提供一下前后的寄存器截图。
举报

张涛

2025-3-12 17:41:03

在STM32L431上使用内部RTC时,时间从23:59:59变为24:00:00而不是00:00:00,并且weekday没有增加,可能是由于以下几个原因导致的:


1. RTC寄存器配置问题



  • RTC时间格式:STM32的RTC支持两种时间格式:24小时制12小时制。如果RTC被错误地配置为12小时制,当时间达到23:59:59后,可能会显示为24:00:00,而不是预期的00:00:00。


  • 检查RTC初始化代码:确保在初始化RTC时,正确配置了时间格式。可以通过检查RTC_CR寄存器中的FMT位来确认是否设置为24小时制。


     // 确保RTC设置为24小时制
    MODIFY_REG(RTC->CR, RTC_CR_FMT, 0);



2. RTC时间寄存器溢出处理不当



  • RTC时间寄存器:RTC的时间寄存器(RTC_TR)存储了小时、分钟和秒。如果程序在处理时间溢出时没有正确处理,可能会导致时间显示异常。


  • 检查时间更新逻辑:确保在读取和更新RTC时间时,正确处理了从23:59:59到00:00:00的过渡。例如,当秒数达到59时,应该增加分钟,并检查小时是否达到24,如果是,则重置为0。


     if (seconds == 59) {
         minutes++;
         if (minutes == 60) {
             minutes = 0;
             hours++;
             if (hours == 24) {
                 hours = 0;
                 // 增加weekday
                 weekday = (weekday % 7) + 1;
             }
         }
    }



3. RTC日期寄存器未正确更新



  • RTC日期寄存器:RTC的日期寄存器(RTC_DR)存储了年、月、日和星期。如果weekday没有增加,可能是因为日期寄存器没有正确更新。


  • 检查日期更新逻辑:确保在时间从23:59:59过渡到00:00:00时,日期和weekday也相应更新。


     if (hours == 24) {
         hours = 0;
         // 增加日期
         day++;
         if (day > days_in_month[month]) {
             day = 1;
             month++;
             if (month > 12) {
                 month = 1;
                 year++;
             }
         }
         // 增加weekday
         weekday = (weekday % 7) + 1;
    }



4. RTC时钟源或分频器配置错误



  • RTC时钟源:RTC的时钟源(如LSE、LSI或HSE)和分频器配置可能会影响RTC的计时精度和溢出行为。


  • 检查时钟源和分频器配置:确保RTC的时钟源和分频器配置正确,以避免计时错误。


     // 例如,使用LSE作为RTC时钟源
    RCC->BDCR |= RCC_BDCR_RTCSEL_LSE;
    RCC->BDCR |= RCC_BDCR_RTCEN;



5. RTC中断处理不当



  • RTC中断:如果使用了RTC中断来处理时间更新,确保中断服务程序(ISR)中正确处理了时间溢出和日期更新。


  • 检查中断处理逻辑:确保在RTC中断中正确处理了从23:59:59到00:00:00的过渡,并更新了weekday


     void RTC_IRQHandler(void) {
         if (__HAL_RTC_SECOND_IT(&hrtc)) {
             // 处理秒更新
             if (seconds == 59) {
                 // 处理分钟、小时、日期和weekday更新
             }
         }
         __HAL_RTC_CLEAR_FLAG(&hrtc, RTC_FLAG_SEC);
    }



6. 硬件或软件故障



  • 硬件故障:如果以上配置和代码都正确,但仍然出现问题,可能是硬件故障导致的。

  • 软件故障:检查是否有其他软件模块或库干扰了RTC的正常工作。


总结


建议从以下几个方面进行排查:



  1. 确认RTC时间格式设置为24小时制。

  2. 检查时间更新逻辑,确保正确处理了从23:59:59到00:00:00的过渡。

  3. 确保日期和weekday在时间溢出时正确更新。

  4. 检查RTC时钟源和分频器配置。

  5. 如果使用了中断,确保中断处理程序正确处理了时间溢出。


通过逐步排查,应该能够找到问题的根源并解决它。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分