您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

为树莓派 添加一个 实时时钟DS1302

发布者: admin | 发布时间: 2020-7-20 22:10| 查看数: 22942| 评论数: 6|帖子模式

1、在系统中安装wiringPi(这个就不多说了很简单)
7 d' P. i- d) H0 {( f2、连接ds1302模块和树莓派引脚
  P3 A$ @; W3 p7 i4 ?连接前需要在ds1302的DTA引脚上添加一个10K的上拉电阻,0 V8 N* D1 K5 j# h; k; u5 t) j2 v
VCC—3.3V—-+ x' i8 W9 d& d, F+ J2 Q
GND—0V—-* ]5 E/ k2 K2 H4 h
CLK—SCLK—-23
5 X1 ]/ c1 J  G" D& v( k1 DDTA—SDA0—-24
% m2 j6 I# w0 d0 MRST—CE0—–27
2 @# h" |, E4 y7 a2 k" {3、修改程序
0 W" F' t3 j& }7 v) G+ cds1302.c的mian函数里有一个ds1302setup()函数 ,用来设置引脚,修改如图:5 ~+ U) D4 J9 w+ |3 C

: D4 o' B- q# ^4 \3 X
  1. int main(int argc, char *argv[])% L7 N3 c; Y; d, M
  2. {+ |. m9 v! i7 {) a3 i3 P: d0 f
  3. int i;3 f, I; @  z! ~
  4. int clock[8];! Y2 j. d# Y: i
  5. + C, u1 l: z) s7 e1 K: D
  6. wiringPiSetup();
    3 S, n' ?% s' o( `
  7. //ds1308setup(0,1,2);% B0 n$ s6 J  y, T0 u
  8. ds1302setup(14,10,30);" m  B5 `! e1 W

  9. 3 o5 B, n& w" N7 A
  10. if(argx == 2)
    ) I/ s+ _% c0 L7 l
  11. {
    # h% k% f1 _2 n) R
  12.   /**/if(strcmp(argv[1],"-slc") == 0)7 U) u5 j7 \! h
  13.    return setLinuxClocl();
    / \8 D: S* c6 P+ A
  14.   else if(strcmp(argv[1],"-sdsc") == 0)7 C% |/ N5 O+ z# V
  15.    return setDSclock();4 h4 o! b6 x. C9 j' x
  16.   else if(strcmp(argv[1],"-rtest") == 0)
    % f# o1 p0 p: j2 o" f" I/ B
  17.    return ramTest();
    8 m7 R0 Z% t% C  a
  18.   else
    7 _7 }3 y) F+ }" L5 Z* [$ _0 k
  19.   {% Z7 q5 x$ ?- r) T* }; S/ ^
  20.   printf("Usage:ds1302[-slc|-sdsc|-rtest]\n");( t, D" G5 d0 O( v* z
  21.   return EXIT_FAILURE;
    : {9 ~) Y/ _6 Z8 }7 Y: v5 y
  22.   }$ C- y, H7 s9 }. H! B2 ^' y, z  A
  23. }
    1 X& M  C* @) {2 o4 G( e5 v
  24. # _! w1 g- _, j: p
  25. }
复制代码
这里的14,10,30引脚号是wPi的编号不要弄错了
) {8 a& N4 M! H- K: l% n" B( O& l 4 {+ O# m9 c! u+ s

$ {5 _% a0 x( o% N在wiringPi/examples目录下有ds1302.c文件 在wiringPi/examples目录下执行make ds1302即可生产可执行文件ds1302# N8 c/ H" Y7 N0 \# Y1 H
4、测试; N# z8 o( H) ?( S, Y/ E& G
4.1 执行sudo ./ds1302 -rtest& O# P7 w0 Z! q* r7 m1 W
显示:
4 u1 `- F, N! s* m  z ) W% f6 V# U4 [! K/ N: [7 A; ?6 N
说明一切正常,否者请检查连接是否正确& |" @( L4 ]) J. q
4.2 sudo ./ds1302 -sdsc 即可将系统时间写进ds1302模块中去8 L: E4 D; \! m& O! ?& R
4.3 从DS模块读取时间$ L! q' t# ]! |6 ~/ m
执行sudo ./ds1302( O" |. Y. |* J& r; e. D, b$ p; U

9 u3 @$ T7 F0 Z" \9 ]4.4 从DS模块读取时间来设置系统的时间
4 {% E1 D% K8 B* X) Nsudo ./ds1302 -slc
3 e) K: o5 c' m# v- q7 T6 W5、获取当地时间 (以上获取的是UTC(Coordinated Universal Time)时间到当前时刻的秒数,要想从该秒数转换成本地时间需要用localtime()函数struct tm *localtime(const time_t *clock),); B" w, R2 Z2 h* J
修改ds1302.c中的setDSclock()函数, x9 F3 ^; s( Q7 `" a
如下:
' X0 p3 i5 w$ Y" V, s- [1 g; a
7 ^7 A5 I9 Q+ E# U3 k6 s
  1. static int setDSclock (void), @$ b* Z% ]2 q- w
  2. {4 E* i: [, [; i2 o5 F
  3.   //struct tm t ;6 j- m3 {& F4 _7 f6 f7 p
  4.   struct tm* t = NULL;
    ) D0 T; g: A. V' P2 H# j# Q
  5.   time_t now ;
    0 R. x( F9 o5 m+ Q* c8 L7 T
  6.   int clock [8] ;
    7 @' o$ n- [" ], `3 k

  7. $ d8 \: V7 D9 n6 @% m7 m# @  f
  8.   printf ("Setting the clock in the DS1302 from Linux time... ") ;" [2 \- }  t/ H  u

  9. 8 }$ x9 f* j' j* O% h; `4 h
  10.   now = time (NULL) ;& C7 m; v. e2 b4 v( m
  11.   //gmtime_r (&now, &t) ;5 x0 N8 t- t% a
  12.   t = localtime(&now);/ F. Z1 ]. U6 ?5 L* e
  13.   % u" ~6 K# r0 z2 W# Z  b. _* d
  14.   //clock [ 0] = dToBcd (t.tm_sec) ;        // seconds
    * {) Y4 f8 I/ v1 Z+ o5 ]% ^/ t  m# M
  15.   //clock [ 1] = dToBcd (t.tm_min) ;        // mins% B4 ~& q+ g  I, L
  16.   //clock [ 2] = dToBcd (t.tm_hour) ;        // hours
      N6 j' O5 A% G7 l" \% P
  17.   //clock [ 3] = dToBcd (t.tm_mday) ;        // date, _8 M( s% @! W/ I, e; h
  18.   //clock [ 4] = dToBcd (t.tm_mon + 1) ;        // months 0-11 --> 1-12# u- ?( \" c* E8 D
  19.   //clock [ 5] = dToBcd (t.tm_wday + 1) ;        // weekdays (sun 0)3 e: i" w! \" E  C
  20.   //clock [ 6] = dToBcd (t.tm_year - 100) ;       // years
    ; D$ R" `% Q2 C, f5 z/ X+ Z4 l1 E7 |) u2 q
  21.   //clock [ 7] = 0 ;                        // W-Protect off% P* }* J! {' A4 u2 U  a
  22.   
    / q! C  y  N+ t" v
  23.   clock [ 0] = dToBcd (t->tm_sec) ;        // seconds0 R, x) `: `0 P+ f
  24.   clock [ 1] = dToBcd (t->tm_min) ;        // mins# l) t# m5 Q' n  X0 p* k
  25.   clock [ 2] = dToBcd (t->tm_hour) ;        // hours
    / I* {  ]7 z" r- F: t
  26.   clock [ 3] = dToBcd (t->tm_mday) ;        // date6 g. X7 _4 B  I3 e( W, z: ~2 A
  27.   clock [ 4] = dToBcd (t->tm_mon + 1) ;        // months 0-11 --> 1-124 r# Y9 l# H7 g  C0 z9 I
  28.   clock [ 5] = dToBcd (t->tm_wday + 1) ;        // weekdays (sun 0)
    3 a2 l) r  h% K" {$ s
  29.   clock [ 6] = dToBcd (t->tm_year - 100) ;       // years
    % F7 o, }; C9 S# W* t) V
  30.   clock [ 7] = 0 ;                        // W-Protect off2 c7 _7 t' }. q9 ^' k5 I. y8 {0 t
  31. . i3 K1 d- K4 I9 N: f9 r, c
  32.   ds1302clockWrite (clock) ;
    , b7 e1 y  W$ I  M6 C9 |7 }% A

  33. ! p3 u/ i6 _1 c
  34.   printf ("OK\n %2d:%02d\n %2d:%02d\n",t->tm_hour,t->tm_min,dToBcd (t->tm_hour),dToBcd (t->tm_min) ) ;
复制代码

/ h* b5 |6 u; z) L) r之后重新编译make ds1302 重新执行以上指令即可获取当地时间了5 m4 m4 q( n  q" N! G6 u9 P
6 ?. q+ }/ U2 q# k8 i: L  ~

0 ~& T( D9 T4 B3 Z- ]. H5 E" Z7 W# I! F; ~
相关文章:树莓派4B 更新wiringPi库到2.52的方法

最新评论

admin 发表于 2020-7-20 23:34:22
如果出现报错
! K. f# l' W  D7 u8 O8 p0 FDS1302 RAM TEST FAILURE. 433 errors.
, s4 D8 ]2 D( G2 S) z- rDS1302 RAM TEST FAILURE. 465 errors.: t5 ~# Z# K8 L8 f, u0 ?- V
等错误 那就是你接了三角 并没有接vcc和gnd接地
admin 发表于 2020-7-21 00:10:20
VCC:模块的电源引脚,接树莓派的1号引脚(3.3V); E4 G2 o/ @4 L. L2 L

; y8 L/ p" {+ ^  \* V# pGND:模块的地,接树莓派的6号引脚(Grand)
8 e3 g- ?0 b0 r3 i
6 O- o0 ?* I# b/ GCLK:SCLK 串行时钟,接树莓派wiringPi 0(物理编号:11号)' R" y9 I7 [$ Q$ |- p3 C3 \! u

; t* x2 Y( G& B5 ]5 SDAT:I/O 数据线,接树莓派wiringPi 1(物理编号:12号)
/ k! Y6 D' [; |2 r$ |0 r7 t+ i* r
/ [- X3 ]- a) @5 [0 c0 BRST:复位引脚,接树莓派wiringPi 2(物理编号:13号)
admin 发表于 2020-7-21 00:14:23
七、开机同步时间
将树莓派的时间与网络同步后,就可以写入到DS1302中,这样DS1302具有准确的当前时间,就算掉电也不会丢失,在树莓派离线时,可以在每次开机时将DS1302的时间写入到树莓派中,从而使得树莓派实现了实时时钟的功能。
获得可执行文件ds1302的目录
  1. pi@raspberrypi:~/wiringPi/examples $ pwd
    0 s4 k; S9 U( W$ J& g$ M; P( e
  2. /home/pi/wiringPi/examples
复制代码
然后修改 /etc/rc.local 文件,在exit 0前面添加时间同步命令,这样在树莓派开机时就会自动将DS1302的时间同步到树莓派上。添加以下命令:
  1. sudo /home/pi/wiringPi/examples/ds1302 -slc
复制代码
保存后退出。我们将树莓派断网,然后树莓派关机,过一会开机,使用date命令读取时间,可以看到树莓派的走时和当前时间一致,说明时间自动同步成功!

& v' l$ V4 Q# V
admin 发表于 2020-7-21 00:29:14
解决小时无法同步问题
3 v1 b6 Q9 D( ~/ q4 x/ q0 e! O
) X: N  a7 z4 x) I" t$ V# O0 n
  1. static int setDSclock (void)9 {# y# O  W7 J% G+ [
  2. {( b: }1 F; m6 h+ m. @6 A) s
  3.   //struct tm t ;( O* @6 @& {0 Q
  4.   struct tm* t = NULL;6 B! `+ n# K2 d0 z! ^: `
  5.   time_t now ;3 d$ g. z# r$ t" @) _
  6.   int clock [8] ;
    9 j: E: z$ E$ Y& `' B( @

  7. 6 X! f- s4 o4 x  ]/ Q, d" B
  8.   printf ("Setting the clock in the DS1302 from Linux time... ") ;
    7 {: B% K+ p7 z1 a9 m4 Q
  9. * x* N3 L& o; e$ Y; ]
  10.   now = time (NULL) ;
    ( z3 @; `: G% u4 h, s6 J$ ^5 t8 o  G
  11.   //gmtime_r (&now, &t) ;
    + ~7 U5 P3 L/ N! z
  12.   t = localtime(&now);
      a% s3 w/ {4 O- _, j; J) W. g
  13.   
    & Z* |; r6 |9 |" n
  14.   //clock [ 0] = dToBcd (t.tm_sec) ;        // seconds
    ( e7 y% c) J$ ?  N6 l
  15.   //clock [ 1] = dToBcd (t.tm_min) ;        // mins
    9 c) y: d' }% q: {- k2 [' A- W
  16.   //clock [ 2] = dToBcd (t.tm_hour) ;        // hours
      r* z: ^# Q# z/ S) x1 M
  17.   //clock [ 3] = dToBcd (t.tm_mday) ;        // date1 [! `* d+ }$ v' ~5 s
  18.   //clock [ 4] = dToBcd (t.tm_mon + 1) ;        // months 0-11 --> 1-12" l* T# y3 L, V/ b7 h
  19.   //clock [ 5] = dToBcd (t.tm_wday + 1) ;        // weekdays (sun 0)
    / Q5 v9 U3 m2 E( q! g* E" j
  20.   //clock [ 6] = dToBcd (t.tm_year - 100) ;       // years
    ! v+ c% X# k7 v2 q) y1 |
  21.   //clock [ 7] = 0 ;                        // W-Protect off
    3 y) L2 t  [$ _9 X3 e6 o
  22.   $ j& n# s2 |: ?' ^# M) A& k
  23.   clock [ 0] = dToBcd (t->tm_sec) ;        // seconds
    7 Y' ~: o& _/ I5 g$ ?. R. d' ^! j
  24.   clock [ 1] = dToBcd (t->tm_min) ;        // mins8 S8 z4 b3 ?) _3 a7 Q" S' c
  25.   clock [ 2] = dToBcd (t->tm_hour) ;        // hours: e1 Z0 S- l5 r' M
  26.   clock [ 3] = dToBcd (t->tm_mday) ;        // date
    ' V$ m# j% {( r/ h$ e" r+ Q; O! V  h
  27.   clock [ 4] = dToBcd (t->tm_mon + 1) ;        // months 0-11 --> 1-12
    ! Z# Y# }6 ~3 R) V) r& e
  28.   clock [ 5] = dToBcd (t->tm_wday + 1) ;        // weekdays (sun 0)5 {- c6 y/ X9 A: ~- m: J  V  Z
  29.   clock [ 6] = dToBcd (t->tm_year - 100) ;       // years
    7 }9 c; E# K7 C  O7 E8 D% o* J4 I
  30.   clock [ 7] = 0 ;                        // W-Protect off# {. A- Y0 F: |2 v. p8 N0 P" F

  31. 5 [8 P8 M! p9 l; J3 {! N" k1 a
  32.   ds1302clockWrite (clock) ;- F" T- c6 A1 P9 t  }1 H5 _5 S/ K
  33. 1 i: b  q- o: H: J) X) G
  34.   printf ("OK\n %2d:%02d\n %2d:%02d\n",t->tm_hour,t->tm_min,dToBcd (t->tm_hour),dToBcd (t->tm_min) ) ;
复制代码
admin 发表于 2020-7-21 15:21:15
( t$ G9 ~# r  z' D5 A
admin 发表于 2020-7-21 15:27:02
gpio readall 调出接口图
( X8 T  D2 ~, x( [) z) U1 H4 S- i* m2 U+ n9 G! W$ \
  1. +-----+-----+---------+------+---+---Pi A+--+---+------+---------+-----+-----+
    5 N# E) t4 K1 b9 C4 D5 H
  2. | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |/ h; R( T6 G9 w+ p7 k
  3. +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+: [" B' i: j7 w  P" J
  4. |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
    , `/ _3 c# |% W) T: I8 P. L( K
  5. |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |/ F. K& j& s9 j/ t
  6. |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |% ~! Z( W1 e2 \! o
  7. |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
    3 w' e3 W5 F# g, \" c
  8. |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
    # G2 p8 X0 ?8 n" m( x& h
  9. |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
    # C* J1 w# i4 K$ O* P: f7 h) @$ i
  10. |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
    8 p- a& v3 R3 P8 C: a4 d9 o( d
  11. |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
    & ~! ]1 J. z3 Y! W2 ^
  12. |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
    2 d% r( A9 M! G
  13. |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |9 ]2 J" C6 O- v+ [
  14. |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |5 z* z' y, K2 t% z& o- q! H
  15. |  11 |  14 |    SCLK |  OUT | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
    . b! H1 V% P8 }1 a* A3 N" X
  16. |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |: O; S8 p8 I: P# s9 ?# ^# q1 r5 M
  17. |   0 |  30 |   SDA.0 |  OUT | 0 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
    ; ~& n! P3 Z$ r( @" O$ r3 e
  18. |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |" w$ X( p5 @* g" z  ]( T% {" C
  19. |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
    3 S, t1 W( L6 b* L& j: S! }- c
  20. |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |+ u- }' `* e! w0 I" \1 w  J
  21. |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
    3 N, F; M! @, @( b2 Y3 m* c( K
  22. |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |9 q& r7 b8 c. i8 F, I5 f
  23. |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |- X6 L5 V4 B% s) ^
  24. +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+$ l2 u5 v! ]3 [; a% p) V3 f) k/ ?
  25. | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |! {/ I$ W' T- k; i' F
  26. +-----+-----+---------+------+---+---Pi A+--+---+------+---------+-----+-----+9 ]1 p9 a; z; |/ Y2 _
复制代码

GMT+8, 2026-9-20 23:08 , Processed in 0.080866 second(s), 23 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!