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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

1、在系统中安装wiringPi(这个就不多说了很简单)# d9 w. s& \% e9 O
2、连接ds1302模块和树莓派引脚6 [1 ]: t/ X( a6 a# m( J
连接前需要在ds1302的DTA引脚上添加一个10K的上拉电阻,/ K* P- v2 z* A- @2 C
VCC—3.3V—-2 K# f9 A+ t. s4 X
GND—0V—-. q' [6 J: J2 X$ D; B- }
CLK—SCLK—-230 I% ^! j, x3 N. u  T$ C
DTA—SDA0—-24
* }0 L% `4 M* W; ?! mRST—CE0—–27
) b# o& Z* J: Y3、修改程序
5 D5 A- i& M, N, Gds1302.c的mian函数里有一个ds1302setup()函数 ,用来设置引脚,修改如图:
3 N6 ?( l9 f3 N8 W4 y; R6 x$ P( n( q* ]% h
0 a* j$ o* H  ], ?' C& G) s
  1. int main(int argc, char *argv[])
    / U4 F( i* s) z6 g# i* V  k/ p
  2. {
      j: Y4 F# Z* k7 f; }* r* J
  3. int i;
    ; l# s8 q1 k7 a- h
  4. int clock[8];6 G3 F# Z2 f. m; w
  5. / s: T% T( p' J7 }' V; V/ T
  6. wiringPiSetup();3 K& K! E: f! D0 X+ O: B
  7. //ds1308setup(0,1,2);
    * n3 k: V8 n5 |1 K; [
  8. ds1302setup(14,10,30);
    7 _, T" U5 Q+ U$ I( `! J2 j

  9. # d7 J; a. v* U! R; J" l1 Y* F
  10. if(argx == 2)
    7 ]- _' r, A) C% H: P6 N* e
  11. {4 s" D" X, f& C. F8 w
  12.   /**/if(strcmp(argv[1],"-slc") == 0)
    ; U, e) c* I7 q
  13.    return setLinuxClocl();! v8 l$ M' I# q/ D, b
  14.   else if(strcmp(argv[1],"-sdsc") == 0)
    / F0 G3 i# v- a$ p
  15.    return setDSclock();9 ?0 Y) m2 |( l$ ^
  16.   else if(strcmp(argv[1],"-rtest") == 0)- _0 Q+ J$ X. C/ M% r
  17.    return ramTest();: V0 A  f9 F, b8 M# F
  18.   else
      Q" A; D1 p' a% ]8 @$ }7 |5 e
  19.   {
    & Z4 ]0 D2 b8 ~$ c! ~/ E& Y0 c
  20.   printf("Usage:ds1302[-slc|-sdsc|-rtest]\n");
    9 M& ?; d9 J2 t0 D: P7 z; g2 n
  21.   return EXIT_FAILURE;; Q& V% A" p9 L1 j$ _- S% H
  22.   }
    7 x# r- H1 }8 `8 o" E
  23. }- m) U3 s$ h+ X8 O  m1 D$ H1 @

  24. ; P+ l! r7 Y1 e9 j6 @; o+ n& d
  25. }
复制代码
这里的14,10,30引脚号是wPi的编号不要弄错了# U  y/ g) @, S6 g; I

  @2 u4 Z' ^  |$ m4 _
" N2 k9 j1 k# k! ?- D; }在wiringPi/examples目录下有ds1302.c文件 在wiringPi/examples目录下执行make ds1302即可生产可执行文件ds13021 {' b- h6 R) l, i: |; \+ v& e; W6 w
4、测试
8 _1 e+ `! Y8 }1 J4 N0 t4.1 执行sudo ./ds1302 -rtest
( J; p# m: c( T显示:
" z8 j' l# ^5 g% I, C
. s9 x5 n8 g, P- o+ y7 f说明一切正常,否者请检查连接是否正确) }* {* E  j9 r$ l6 \) c
4.2 sudo ./ds1302 -sdsc 即可将系统时间写进ds1302模块中去+ F. ^6 \! t! [0 s& S
4.3 从DS模块读取时间
7 l0 Q$ ^6 w# q& A: ?  M' u执行sudo ./ds1302' o# e& m7 g3 [: u$ {

0 F9 M; B/ D$ [3 s' ^+ @; f4.4 从DS模块读取时间来设置系统的时间
% N! _7 Y2 V0 vsudo ./ds1302 -slc- W. O: {6 _5 }3 i1 @0 C
5、获取当地时间 (以上获取的是UTC(Coordinated Universal Time)时间到当前时刻的秒数,要想从该秒数转换成本地时间需要用localtime()函数struct tm *localtime(const time_t *clock),)/ F/ x' s5 c/ z. A* Y2 _7 s
修改ds1302.c中的setDSclock()函数
) e& q+ _) \8 y$ n" r7 d6 e如下:! ], f( v( G3 b

7 C( V% @- G  o: a6 c
  1. static int setDSclock (void)
    & L  {; }) W* [- L" S
  2. {  E4 ~" j5 L& ~) W( o
  3.   //struct tm t ;
    ' m2 ^, F5 Y! m" m9 Q$ u
  4.   struct tm* t = NULL;$ g' K' U% p" V8 W
  5.   time_t now ;
    , H* p, d4 s4 O+ }+ z0 r
  6.   int clock [8] ;8 v9 ~- {2 b5 r4 G
  7. , `+ |+ V. @8 P3 P0 ?9 y
  8.   printf ("Setting the clock in the DS1302 from Linux time... ") ;
    3 W. \8 n# h1 V& X) @

  9. , @5 Z+ a( ^! z4 v
  10.   now = time (NULL) ;: ~% S- ^! ?, N: G6 S% @1 J- Q9 Q
  11.   //gmtime_r (&now, &t) ;( G. C1 U" ?: [6 o3 `( [7 g
  12.   t = localtime(&now);
    2 Y* @# x# L" C  z; J- A  D3 ^0 o6 Z
  13.   # Z( O, F; h' U: d$ a( ?. i
  14.   //clock [ 0] = dToBcd (t.tm_sec) ;        // seconds
    / \5 x' K6 u9 i9 v2 P2 b/ }+ Z) r
  15.   //clock [ 1] = dToBcd (t.tm_min) ;        // mins2 c' h& _! N9 L; T
  16.   //clock [ 2] = dToBcd (t.tm_hour) ;        // hours: a0 y/ D0 v: L4 g, }
  17.   //clock [ 3] = dToBcd (t.tm_mday) ;        // date
    - p' Y" T3 e  t1 H/ s
  18.   //clock [ 4] = dToBcd (t.tm_mon + 1) ;        // months 0-11 --> 1-12
    ' T4 ?0 `9 n+ Y/ Q2 \, k4 K* c
  19.   //clock [ 5] = dToBcd (t.tm_wday + 1) ;        // weekdays (sun 0)
    - q, g% }. Q) N$ c' A
  20.   //clock [ 6] = dToBcd (t.tm_year - 100) ;       // years9 |6 Z) T) V" p% e0 g; i3 G
  21.   //clock [ 7] = 0 ;                        // W-Protect off1 {) G2 L0 t: R& F* K+ j2 f
  22.   6 c) F( T) O2 F* D( V' Q' `
  23.   clock [ 0] = dToBcd (t->tm_sec) ;        // seconds' ]- z- J5 b9 i1 [& @# ?
  24.   clock [ 1] = dToBcd (t->tm_min) ;        // mins
    6 |' O, }- s/ h7 W0 H9 _6 _
  25.   clock [ 2] = dToBcd (t->tm_hour) ;        // hours: z4 z) v2 z7 l# A2 {
  26.   clock [ 3] = dToBcd (t->tm_mday) ;        // date
    9 ~  F$ j- C" p* c
  27.   clock [ 4] = dToBcd (t->tm_mon + 1) ;        // months 0-11 --> 1-12" u' _3 _, B, b+ x9 ~
  28.   clock [ 5] = dToBcd (t->tm_wday + 1) ;        // weekdays (sun 0)
    6 B9 q3 p) e+ i$ x1 o
  29.   clock [ 6] = dToBcd (t->tm_year - 100) ;       // years) S2 B1 b6 m, A' E2 s' A
  30.   clock [ 7] = 0 ;                        // W-Protect off
    7 ~, q% c5 F% {# O

  31. ( U$ i! ^) g# q( i6 A1 s2 x
  32.   ds1302clockWrite (clock) ;* V; {6 |; Z- B: B+ [6 Z8 g, b

  33. ; Y. V$ U! n& E6 S8 t/ F% i- N
  34.   printf ("OK\n %2d:%02d\n %2d:%02d\n",t->tm_hour,t->tm_min,dToBcd (t->tm_hour),dToBcd (t->tm_min) ) ;
复制代码
( V: U5 t% z/ t" e# {6 F8 M
之后重新编译make ds1302 重新执行以上指令即可获取当地时间了
1 Q' E& K* F9 j
/ y, e/ d/ U3 ?1 o' |$ }  H
) ~# z5 t3 A5 ^/ M: y9 R/ {8 B8 W/ N6 E5 M2 A3 P1 @' ]
相关文章:树莓派4B 更新wiringPi库到2.52的方法

最新评论

admin 发表于 2020-7-20 23:34:22
如果出现报错 ) u. ^9 }- `4 i) ^- b
DS1302 RAM TEST FAILURE. 433 errors.
5 Y" w: z: {' C5 ZDS1302 RAM TEST FAILURE. 465 errors.
; x  W7 m+ j: y" d5 b" ?等错误 那就是你接了三角 并没有接vcc和gnd接地
admin 发表于 2020-7-21 00:10:20
VCC:模块的电源引脚,接树莓派的1号引脚(3.3V)
( t4 D4 e/ u- s2 o' `. a8 p
2 T1 W+ H2 M: D0 I% S2 G0 TGND:模块的地,接树莓派的6号引脚(Grand)
+ Y# Z% C9 B' T2 C# c1 F
0 i' e6 k, y! k! N% ~' qCLK:SCLK 串行时钟,接树莓派wiringPi 0(物理编号:11号)
, H. e9 W6 ~5 r4 k$ R. G% Q+ o; B9 w, ?
DAT:I/O 数据线,接树莓派wiringPi 1(物理编号:12号)
% C4 Z' r9 Z7 Y8 j3 r8 J7 ~) |5 ]; a5 t
RST:复位引脚,接树莓派wiringPi 2(物理编号:13号)
admin 发表于 2020-7-21 00:14:23
七、开机同步时间
将树莓派的时间与网络同步后,就可以写入到DS1302中,这样DS1302具有准确的当前时间,就算掉电也不会丢失,在树莓派离线时,可以在每次开机时将DS1302的时间写入到树莓派中,从而使得树莓派实现了实时时钟的功能。
获得可执行文件ds1302的目录
  1. pi@raspberrypi:~/wiringPi/examples $ pwd, Q+ h. @* W& y. i# H# @0 f: [  |
  2. /home/pi/wiringPi/examples
复制代码
然后修改 /etc/rc.local 文件,在exit 0前面添加时间同步命令,这样在树莓派开机时就会自动将DS1302的时间同步到树莓派上。添加以下命令:
  1. sudo /home/pi/wiringPi/examples/ds1302 -slc
复制代码
保存后退出。我们将树莓派断网,然后树莓派关机,过一会开机,使用date命令读取时间,可以看到树莓派的走时和当前时间一致,说明时间自动同步成功!
- D3 @0 k2 N0 u1 K5 d
admin 发表于 2020-7-21 00:29:14
解决小时无法同步问题8 u  Z; m  k! x  S  @

$ \2 d# n; t; |4 b( O
  1. static int setDSclock (void)
    # ^3 |7 `7 R- W/ H4 H2 s$ ?8 k
  2. {
    8 O% `' ]$ J: p8 Q; W3 E4 q
  3.   //struct tm t ;
    ( I! N" [9 Y9 V2 r
  4.   struct tm* t = NULL;5 S/ X3 S# G! w( v7 I3 y5 G
  5.   time_t now ;
    $ i6 A! z; R* Y5 G
  6.   int clock [8] ;* h1 C1 y, o3 j
  7. 3 C* P7 O4 n" v" X# r
  8.   printf ("Setting the clock in the DS1302 from Linux time... ") ;1 z# _3 I  A' u, I$ u

  9. ; h. d4 _4 [+ W2 \4 \
  10.   now = time (NULL) ;
    9 Z5 h6 |% Y/ r$ x3 ^1 d
  11.   //gmtime_r (&now, &t) ;
    7 f1 f2 H% i, B& b
  12.   t = localtime(&now);$ Q- e; o2 r( r' ~; m. ?7 `
  13.   / H. W) x; V  ?) I; I
  14.   //clock [ 0] = dToBcd (t.tm_sec) ;        // seconds5 N! i5 i5 u. Z% x6 ^
  15.   //clock [ 1] = dToBcd (t.tm_min) ;        // mins
    1 G- h  T( W$ _8 X& m9 }
  16.   //clock [ 2] = dToBcd (t.tm_hour) ;        // hours/ a3 p1 B% N- O" U) r1 ^5 K5 d. p" j
  17.   //clock [ 3] = dToBcd (t.tm_mday) ;        // date
    % S. g- x- o0 R. S
  18.   //clock [ 4] = dToBcd (t.tm_mon + 1) ;        // months 0-11 --> 1-12( l7 R0 K: E1 T" |8 Z3 k7 ]$ y
  19.   //clock [ 5] = dToBcd (t.tm_wday + 1) ;        // weekdays (sun 0)
    ; x8 L; T4 M* Z  q, k5 w
  20.   //clock [ 6] = dToBcd (t.tm_year - 100) ;       // years
    / m9 W) G# i( y
  21.   //clock [ 7] = 0 ;                        // W-Protect off% O* O$ {$ Y$ ]& J; G8 d
  22.   
    - m# Q! U; b0 f3 R- D( I2 Z
  23.   clock [ 0] = dToBcd (t->tm_sec) ;        // seconds0 P  e2 s1 s$ l" w. L
  24.   clock [ 1] = dToBcd (t->tm_min) ;        // mins
    # I% j& b) d9 j- k
  25.   clock [ 2] = dToBcd (t->tm_hour) ;        // hours
    # Z) r* o, J  [7 [; _: o
  26.   clock [ 3] = dToBcd (t->tm_mday) ;        // date1 k5 s/ L  g5 Q7 l$ `4 A3 X9 Z  Y) ~
  27.   clock [ 4] = dToBcd (t->tm_mon + 1) ;        // months 0-11 --> 1-12& k2 Q# Y' q" I
  28.   clock [ 5] = dToBcd (t->tm_wday + 1) ;        // weekdays (sun 0)
    : r+ N& q, b9 P8 ?& l8 x  ^( Z" ?
  29.   clock [ 6] = dToBcd (t->tm_year - 100) ;       // years2 O% @- l) T0 h' j' _
  30.   clock [ 7] = 0 ;                        // W-Protect off
    % `$ }9 I' @* ?' i) U% W

  31. ; w; Y$ e% R: _" h
  32.   ds1302clockWrite (clock) ;
    " z' }% ?& B4 I' J0 ~% e
  33. ! j6 G0 p; a" S6 G8 a8 l
  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
- Z' E8 A8 }  e2 E
admin 发表于 2020-7-21 15:27:02
gpio readall 调出接口图
  X& j& l; U2 s% Z. r# l
0 g6 O! [2 N$ X  R" g( d/ F7 \
  1. +-----+-----+---------+------+---+---Pi A+--+---+------+---------+-----+-----+( H  G7 a5 W. X3 a* x( H
  2. | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
    $ A2 z; k4 p0 V* d! u9 D& S$ R  n1 ~
  3. +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
    - \2 c* C. Q9 x
  4. |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |0 [2 Q' k1 P" ]$ C# T: y" [
  5. |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |5 N1 o( q8 w! g, i$ J
  6. |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
    & S/ A* I% `! R7 B4 ?5 v* c
  7. |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |( E9 W; n/ E/ j9 \; g4 \% D6 t
  8. |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
    . r* \% i3 e+ v  o4 n/ X
  9. |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
    - |  i! g; C' {8 X4 X5 o
  10. |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
    * b3 W% U2 ~% b* c0 e
  11. |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
    ; L! H" Y: N) r
  12. |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
    # h$ z2 ?* Q6 ~! F; e4 E1 I
  13. |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |- ~8 y6 B+ L3 O' s
  14. |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |5 E( e2 J; e0 p# J! G% ]: Z
  15. |  11 |  14 |    SCLK |  OUT | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
    + v; ?! W: ~3 T% U" R5 j- t9 A( \
  16. |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |" q: s3 `! u+ o$ o: U
  17. |   0 |  30 |   SDA.0 |  OUT | 0 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |) {7 B1 x. i0 @! i* J, Z6 W
  18. |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |# q' A) E/ Z* `( D7 E% o0 ]- j  x
  19. |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |- r  A- y' b) p/ F6 w* ?& X  m; J% h
  20. |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
    - Z/ D' C) R* l9 o
  21. |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
    9 X, X  E- Y" a9 P
  22. |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |9 t4 D' v6 n4 C/ b% S  u& I! S
  23. |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |' d* |: `# I0 E# ]* w1 d
  24. +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+8 m$ q: A4 m! M# g
  25. | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |  _, \$ p5 I$ R. ~$ n
  26. +-----+-----+---------+------+---+---Pi A+--+---+------+---------+-----+-----+
    3 B( S+ v- }6 X# u7 |* S2 Z
复制代码

GMT+8, 2026-6-19 22:26 , Processed in 0.060544 second(s), 21 queries .

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