RTC时间错误

发表在 RTC2019-4-12 17:23 [复制链接] 8 1442

各位老哥,我这里NTP同步时间后,RTC的时间的年份会不对,然后自己手动设置时间,发现年份也会和设置的不一致,多出了6年,代码本身没做修改,断点打了半天也没找到哪里的问题,有谁遇到这个问题的吗?   c! c1 X: Y6 A* f% P0 w. i

* j7 q8 ^+ B& h
TIM图片20190412172302.png
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-4-12 17:35:20 | 显示全部楼层
老哥看下这个文档,date也可以设置时间的,看看行不行呢?https://www.rt-thread.org/docume ... ual/device/rtc/rtc/
使用道具 举报 回复
发表于 2019-4-12 17:37:41 | 显示全部楼层
yangjie 发表于 2019-4-12 17:35
/ |2 a# A* y5 R& I, V0 }老哥看下这个文档,date也可以设置时间的,看看行不行呢?https://www.rt-thread.org/document/site/progra ...
7 g0 H) j/ Q9 C3 h& t5 c; S' o$ W
date也不正确,https://www.rt-thread.org/qa/for ... ypeid%26typeid%3D59,我用了这个帖子里的方法,解决了,看到这个板块下好多都是这个问题,会不会是什么BUG?
使用道具 举报 回复
发表于 2019-4-12 18:20:04 | 显示全部楼层
哪个BSP? 使用哪个RTC芯片? 或是内置RTC?' Z+ K9 _# A1 q0 T

" d/ h! h& |- t) l, U设置时间的时候,把转换后得到的时间戳也打印出来核对吧。
使用道具 举报 回复
发表于 2019-4-12 21:45:33 | 显示全部楼层
aozima 发表于 2019-4-12 18:20
+ O  d! C1 q7 @; _3 F3 m哪个BSP? 使用哪个RTC芯片? 或是内置RTC?( b, N, O+ v3 V$ t

) i$ {6 p- W3 F% h0 n# s# g0 o设置时间的时候,把转换后得到的时间戳也打印出来核对吧。 ...
1 h7 ]9 x: m2 L
用的是STM32F407HAL BSP ,内部RTC,打断点的时候一路过去都没问题,但在最后time()函数获取时间后到ctime()出来就错了不知道是什么情况
使用道具 举报 回复
发表于 2019-4-12 22:15:15 | 显示全部楼层
https://www.rt-thread.org/qa/thread-7037-1-1.html* O5 d( G5 q" t
我之前用stm32051遇到的问题,看看有没有帮助。
使用道具 举报 回复
发表于 2019-4-13 09:15:01 | 显示全部楼层
本帖最后由 aozima 于 2019-4-13 11:24 编辑 5 D: ~( h# b/ h0 A
就错了

2 l+ r" m9 T/ b$ G3 \% n建议更详细!输入参数是什么? 预期值是多少? 实际返回值是多少?
$ w6 W# k% P2 D5 M还有就是,设置后,这个错误的时间是否能正常走秒。
. m  m& k; x$ G8 z# J/ \
使用道具 举报 回复
发表于 2019-4-15 09:03:51 | 显示全部楼层
aozima 发表于 2019-4-13 09:15
1 @, O8 a9 t5 X! w6 D建议更详细!输入参数是什么? 预期值是多少? 实际返回值是多少?
# D# ^; f- i3 L. X. S8 T( i) H% Z还有就是,设置后,这个错误的时间是否 ...
+ s* O8 [3 X- x6 [* ]+ p5 p
输入参数就是我设置的时间,从年到秒,分别用date 命令设置和NTP同步正确的时间,当设置或同步时间后,再用date 命令查看时间,年份就会不对,往往比设置的或者同步的年份多出了4,5年,,时间只是年份错误,其他一切正常,按照我单步调试的情况来看,异常的地方在如下图所示代码的地方,之前的年份都是正确的年份,从rtc.c文件里的ctime出来以后就不正确了
  1. FINSH_FUNCTION_EXPORT(set_date, set date. e.g: set_date(2010,2,28))% `' n8 M# g0 ^- o, j) {9 u
  2. FINSH_FUNCTION_EXPORT(set_time, set time. e.g: set_time(23,59,59))
    # X4 _# d/ U' U" M; z7 r

  3. % a" S- [; a; {' L. \, \1 ?; V
  4. #if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
    & U: S# o0 ?7 O! V
  5. static void date(uint8_t argc, char **argv)8 ]3 o/ r! S7 _% P
  6. {
    & L/ Y, f' ]9 a0 c7 o3 d8 e( \
  7.     if (argc == 1)$ s8 i% A1 R# r* ]# ]/ G
  8.     {1 N- y% I' V( A$ K& D4 w
  9.         time_t now;
    ( f+ n8 E/ _! @8 m  G& M3 m
  10.         /* output current time */& v* j( A% H& c1 o" L, Q4 E
  11.         now = time(RT_NULL);4 J# y* `( i/ q) o% {7 S) C6 Z* ~
  12.         rt_kprintf("%s", ctime(&now));9 q4 c8 q8 T/ F7 v' b  F
  13.     }
    : G8 ^2 c0 p$ v5 r: q
  14.     else if (argc >= 7)  O+ e2 S+ a4 V- ?3 t8 }
复制代码
使用道具 举报 回复
发表于 2019-4-15 14:37:55 | 显示全部楼层
本帖最后由 charlown.cai 于 2019-4-15 14:47 编辑
6 |. X7 C- |$ E4 w
+ k( L8 {- B' }! Q5 U- E下了stm32全系列最新固件(HAL库),除了MP系列没发现rtc源码文件, 在F0~7,H7,G0, L1, L4, WB系列中,关于HAL_RTC_SetDate的实现,只有F1系列不需要手动设置weekday, U9 T6 s# ]) \3 I  V! c& I' v
F1系列:
+ L  O$ ~" a( }
( W  S; D1 s8 {9 q+ ?+ K
/* WeekDay set by user can be ignored because automatically calculated */- e& h: Y& C3 F5 n- [
  hrtc->DateToUpdate.WeekDay = RTC_WeekDayNum(hrtc->DateToUpdate.Year, hrtc->DateToUpdate.Month, hrtc->DateToUpdate.Date);
# X5 ]9 f) \. o9 Z' _. B  sDate->WeekDay = hrtc->DateToUpdate.WeekDay;
) |' l( |: `- X$ j- s7 s
' X, i% ^! o5 N: j其他系列(其中L4系列中的“13U”换成了“RTC_DR_WDU_Pos”):
1 H* x3 K5 H+ P1 d8 o" `1 \+ G$ s  Q: P4 N2 }! e5 S* j

* t& ], E3 s6 V1 Cassert_param(IS_RTC_WEEKDAY(sDate->WeekDay));# p8 p& v- s4 g- a& d2 l" e* J

. `( W/ B. B) p4 U  if(Format == RTC_FORMAT_BIN)4 s- r3 {2 p/ i8 Z5 ]
  {   ; q  B# ^8 f. R) U( ?
    assert_param(IS_RTC_YEAR(sDate->Year));
8 q5 q1 }5 C1 J7 r% k    assert_param(IS_RTC_MONTH(sDate->Month));- L; n$ @, T$ V' W* K/ K2 H
    assert_param(IS_RTC_DATE(sDate->Date)); ! M+ H" f( C+ ]- H, k8 n4 X4 }

+ w# ~6 _1 V! z& B6 o( K8 j  g   datetmpreg = (((uint32_t)RTC_ByteToBcd2(sDate->Year) << 16U) | \
1 y3 K. X; w2 b6 k9 t                 ((uint32_t)RTC_ByteToBcd2(sDate->Month) << 8U) | \
3 y2 N' ~  k5 p                 ((uint32_t)RTC_ByteToBcd2(sDate->Date)) | \+ \% U7 W  T  g9 J0 T# t
                 ((uint32_t)sDate->WeekDay << 13U));   
% |5 T: T" N) v- `# w- j4 Q- [9 A7 ]  }
1 S3 Z6 r  p, ]0 B( o! F1 F
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表