你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32G4 NUCLEO G431RB】+ I2C通讯终于完成

[复制链接]
老牛洋车 发布时间:2019-9-20 21:19
    之前完成了GPIO模拟I2C驱动DS1307和AT24C32之后,便继续测试如何使用硬件I2C。在热心版主和坛友的帮助下,经过几天的反复测试,硬件I2C也基本完成,在阻塞方式下完成了对DS1307和AT24C32的操作,下图为测试过程:
; E7 b0 C9 f& m$ X/ B. z6 u I2C_Bus_Ok.jpg . r, N: R5 E4 F' ^
! u: `8 Y4 a, q  A0 H
    屏幕下部的日期和时间是从DS1307芯片读取的,利用systick的毫秒中断进行秒计时,每分钟读取一次DS1307的日期数据,并用秒、分、时数据对AT24C32进行一次先读后写的操作,读出的数据(也就是上次写入的数据)显示在倒数第三行,当前写入的数据显示在倒数第二行。对DS1307读取数据交替采用HAL_I2C_Master_Receive()和HAL_I2C_Mem_Read()函数,读写的代码如下:' Q4 ]' m+ k1 y  w- o( o
  1. /****************************************************************************************** . b' o* ]+ C  s6 a2 g
  2. * 函数名称: DS1307_I2C_Transmit(uint8_t size): |& Q% e! \, W: m  |1 Z, o" i
  3. * 功能说明: 写数据到DS1307/ H+ o8 p  A1 n1 a
  4. * 输    入: size 数据个数(要写入数据在全局数组DS_Buff中)
    / z) [5 B- P! s3 V+ Q& @
  5. * 输    出: 0 = 成功写入  1 = 写数据过程中出现错误
    3 E' N  q* Q1 s5 w3 e
  6. ******************************************************************************************/. ^) F& @) D7 R0 P
  7. uint8_t DS1307_I2C_Transmit(uint8_t size)2 q0 |; L8 J2 a8 Q6 N, M: `; d
  8. {1 \% b8 A% v- W1 X( ~
  9.     uint8_t addr = 0;' B  \4 N; `3 l% o7 f
  10.         DS1307_DataToBuff();      //将时间及日期数据转换到Buff数组中; K& m" f0 O- Q6 R3 r) `
  11.         HAL_I2C_Master_Transmit(&hi2c1,0xD0,&addr,1,10000);//发送起始地址1 L$ d2 V: _3 S5 I8 n2 N- a( D6 z
  12.         2 r0 ^( t( z$ ~! i+ {; k+ r
  13.         if(HAL_I2C_Master_Transmit(&hi2c1,0xD0,(uint8_t*)DS_Buff ,size,10000) != HAL_OK)
    # y3 A& J4 A, E. }6 d( B
  14.     {
    # Q. ]! c. v3 ^2 ~
  15.         return 1;
    2 G2 w  N# ^& o; S& [- k
  16.     }
    ' m- \, d  ~& F( e4 w/ u% l
  17.         return 0;
    2 J! ^( T7 `1 a6 Z: a3 ]. q- O: |& y4 D
  18. }1 T+ C* v% S7 n0 k% h! R3 T

  19. 6 J: L; s6 ?2 A( H5 u
  20. /******************************************************************************************
    ; @* _6 e% K, c; u- @0 a
  21. * 函数名称: DS1307_I2C_Receive(uint8_t size)
    ! V. o/ t0 y. U- b, w+ a* Y" T
  22. * 功能说明: 从DS1307读出数据) u1 R2 Q4 B0 z2 Z% P0 S/ j. m1 D
  23. * 输    入: size 数据个数(读出的数据在全局数组DS_Buff中)
    ) s# i$ _1 b6 T: S6 z
  24. * 输    出: 0 = 成功读出  1 = 读数据过程中出现错误" u% _. v' b. {7 O6 `2 G+ k" r
  25. ******************************************************************************************/
    ) \& `' F8 C* D. Q5 I8 x
  26. uint8_t DS1307_I2C_Receive(uint8_t size). m( l5 |6 @; Y9 h5 |
  27. {
    4 f' O: I9 e  @0 q$ P" K
  28.         uint8_t addr = 0;
    ( ?0 P' }* [& c% b6 Y0 `" l& B& q
  29.         HAL_I2C_Master_Transmit(&hi2c1,0xD0,&addr,1,10000);//发送起始地址1 R; N+ z0 Y  J8 L
  30.         7 m* t4 _8 m/ _/ _
  31.     if(HAL_I2C_Master_Receive(&hi2c1,0xD0,DS_Buff,7,10000) != HAL_OK)
    & q7 t: t9 `+ J
  32.     {1 S+ N. F; c, I, h3 f+ [
  33.         return 1;
    - V7 ]5 p- O% k) X$ v# }
  34.     }1 K- s$ c! W0 {% L- `# ?: E
  35.     if(size == 1){               //检查DS1307是否需要初始化
    2 q. y1 x2 `9 M3 n: ]+ Q
  36.                 if(DS_Buff[0]>127){: N4 S  z: t0 n5 W( A1 s% n
  37.             year = 2019;
    7 Z8 y8 r% }+ i% A* c3 f9 P
  38.                     month = 9;
    ( }* X; |7 m! s9 k2 Z7 ~8 Z
  39.                     day = 18;
    * a- Y- q( t# y0 u% I  {3 u
  40.                     week = 3;
    2 _8 V( N$ P3 |) H; w( k
  41.                     hour = 9;: v. t3 v% P1 l, J( P
  42.                     minute = 1;0 H, p1 E/ m/ x) G( h7 Z
  43.                 $ R) l) o3 y3 ~" I9 k7 q9 m& \
  44.             DS1307_DataToBuff();) k5 b7 o4 K% N7 i+ T( n
  45.                         DS1307_I2C_Transmit(8);
    * n" o- Y  S/ i$ E' ~
  46.                 }
    ! Z( \8 `* _# u/ B
  47.         }" V9 w; @: R! k8 ^  ~' {, A: P
  48.         else{
    $ E  s( u- k& [  r
  49.             DS1307_BuffToData();3 F/ G9 p  ]' @  u, ?# ]1 O
  50.     }6 }; l. W8 W. g
  51.         return 0;        1 @* v+ b4 C+ z3 M" [
  52. }
    4 e2 J6 Z  Y) M2 h
  53.                  $ Y" E0 ~6 s) C# o, L9 B' d" Z
  54. /******************************************************************************************
    + R" A' j7 S, |
  55. * 函数名称: DS1307_I2C_Read()
    ( ]0 U! i/ y  q  n! d& O
  56. * 功能说明: 读DS1307的日历数据,并转换为各自的变量值! v1 ]( B7 o5 D4 \- k* e
  57. * 输    入: 无
    0 s& Y, ?! l% m
  58. * 输    出: 0 = 成功从DS1307获取数据  >0 = 从DS1307获取数据过程中出现错误
    ( v% w6 e7 Y! z9 e9 w5 D1 w2 }
  59. ******************************************************************************************/
    4 ~1 ]4 V( I! Y, \9 _
  60. void DS1307_I2C_Read(void)8 ^9 H5 U$ [$ U" I4 J7 F1 u* X
  61. {
    8 ?" R3 _' U9 e: _! }( R

  62. ; ]% y- L* d3 Y* v/ z5 P" C. Y
  63.     while (HAL_I2C_Mem_Read(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,7,10000) != HAL_OK)
    # D$ s, O' d% B) m0 V) u' F
  64. //        while (HAL_I2C_Master_Receive(&hi2c1, 0, (uint8_t *)DS_Buff, 7, 10000) != HAL_OK)2 _8 m" @3 w2 [' D& x
  65.     {; x) }/ x: U! O" y# m
  66.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    % \. h/ s- Y* I( |$ M
  67.         {7 o6 h1 U! q. s" R
  68.             LCD_write_ASCII(0,3,1,(uint8_t *)"DS_Read_Error!");* O: w( @  L% e9 l# I6 W
  69.         }
    ; V9 \) ?9 c% n% n7 P; E
  70.     }7 l# A& K% Y. K4 J8 p$ K) [2 }
  71. 7 E& Y2 s" Y9 J5 X2 j  H1 A- P- ^; U
  72.         DS1307_BuffToData();
    - G' x3 A+ x, c" ~1 m
  73.         3 R& {& e5 W1 \3 Z1 c
  74. }
    8 A! ^5 P' R7 V
  75. . L# ]" e8 `- R' ]
  76. /****************************************************************************************** . B2 O* r1 n0 [; G- m/ G
  77. * 函数名称: DS1307_I2C_Write()
    4 k4 j  [- j. ]+ `2 f7 e# T4 z$ {
  78. * 功能说明: 将当前的日历数据写入DS1307
    # P7 M0 z$ O) {3 d5 W) h: o
  79. * 输    入: 无
    : @9 H8 P& q' P: c% H6 ]
  80. * 输    出: 0 = 成功写入数据  >0 = DS1307写入数据过程中出现错误3 z/ P% a- V2 c) c
  81. ******************************************************************************************/3 [5 X. d" m$ @  K, p5 A
  82. void DS1307_I2C_Write(void)
    & o! a/ G9 p) C
  83. {
    ; Z: g1 d. z; X+ C
  84.     DS1307_DataToBuff();           //时间日期数据转换存入Buff数组中
    ! a0 F3 y' W0 P* V6 e
  85.         ) {2 F9 Q8 G. i, o2 J+ |3 Z: T. l" L" h
  86.     while (HAL_I2C_Mem_Write(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,7,10000) != HAL_OK)
    ; l$ t* C5 V1 Z2 u. o
  87. //    while (HAL_I2C_Master_Transmit(&hi2c1, 0, (uint8_t *)DS_Buff, 7, 10000) != HAL_OK)
    : t) ^( e! C. J$ M* z) ~  d$ n
  88.     {
    + K' V- }% q# D" u7 N' B- p2 n
  89.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    6 J! @3 E6 K8 z! {- y" m3 [1 \
  90.         {
    : J% ?/ ?/ A8 z& L9 |3 J
  91.             LCD_write_ASCII(0,3,1,(uint8_t *)"DS_Write_Erro!");
    2 t6 z2 a* Z/ @: E
  92. //                        return 2;
    $ D  v% p2 P+ h
  93.         }
    . N+ ?5 Y" E( v( P& l4 W
  94.     }  U- e7 v  T( t8 ]1 R
  95. //        return 0;
    . f/ t* I0 W' R9 q9 Q, z% P
  96. }
    + A) s8 p1 W# d0 A% l& M
  97. + T/ c3 q* |  [- ]7 m* H( p
  98. /******************************************************************************************
    9 O% s+ y5 S! W, ~7 A
  99. * 函数名称: DS1307_Chick()
    8 [* N2 w3 z8 H, ]
  100. * 功能说明: 检查DS1307是否已经初始化,若未初始化则用特写日期进行初始化
    " C( B% N8 D: }' n) R
  101. * 输    入: 无
    - |4 p) k. [! R/ J+ Z# l8 _
  102. * 输    出: 无- ]' \# |! w. b* O
  103. ******************************************************************************************/4 b4 u! X- N# }$ x2 q" U9 Z
  104. void DS1307_Check(void)
      Q$ x( T. j* z- D; u
  105. {5 C- g. O" e- ^( D6 W
  106. 7 j4 A0 j% X3 h- U
  107. //        LCD_write_ASCII(0,3,1,(uint8_t *)"Check_Begin...");
    9 t7 D" n7 W: Y, @
  108.     while (HAL_I2C_Mem_Read(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,1,10000) != HAL_OK)
    % @# M. `& Z, H8 @) r$ @3 G* s
  109.     while (HAL_I2C_Master_Receive(&hi2c1, 0, (uint8_t *)DS_Buff, 1, 10000) != HAL_OK): ^6 p' N# {5 c& F- O
  110.     {: w! a3 h5 M" Z0 y; _
  111.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)7 u/ l5 R+ I# ~5 g& W
  112.                 {
    * r1 y% l- A4 t
  113.                     LCD_write_ASCII(0,3,1,(uint8_t *)"CheckReadErro!");0 t! ~6 V" u6 g% C4 Y$ J* K
  114.                 }
    : \- y4 T4 U9 W
  115.         }
    $ }& W. h+ i+ G; k% N6 b
  116.         LCD_write_value(0,4,3,0,1,DS_Buff[0]);8 m- y, g" `' R0 A$ T3 h" R
  117.         if(DS_Buff[0]> 127){
    % V" c1 y* w( O6 w9 a0 N0 z0 X! @
  118.         year = 2019;) I6 ^* ]1 E3 z0 U. f& }
  119.                 month = 9;
    % L0 m$ Z" ^/ \7 |$ y
  120.                 day = 18;
    " G* Q- ]0 m1 e, L/ }
  121.                 week = 3;
    ) F* O0 B! V4 u, c& Z4 ]) z
  122.                 hour = 9;
    / D  Z; y9 u0 L* n( E( X
  123.                 minute = 1;
    ! d8 A5 U" ]! m2 H# ]
  124.                
    9 `8 C" N* A" F* e6 [
  125.         DS1307_DataToBuff();- E! y4 G* d" Q4 f& a
  126. ( L" W8 Q; Y" T& e- F; t8 \& \
  127.         while (HAL_I2C_Mem_Write(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,1,10000) != HAL_OK)  Z( B& h' M2 ]" m( B
  128. //        while (HAL_I2C_Master_Transmit(&hi2c1, 0, (uint8_t *)DS_Buff, 8, 10000) != HAL_OK)
    ! [# Q1 c- U+ _
  129.         {, y7 ?, Y. \% V, W. p
  130.             if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)& \4 N  |( r- j+ t, u% `4 \' }+ d
  131.             {
    ) L# f; }+ q6 c
  132.                 LCD_write_ASCII(0,3,1,(uint8_t *)"CheckWriteErr!");
    $ W& z& }' N% Z# U
  133.             }
    + I% _- o  |- K/ s/ \) a
  134.         }. n$ a* t( i' {. f6 @) ]
  135.         }
    ( R! B% C  U8 h7 W2 |
  136. }1 ?" \% e8 [7 M( ~* d- e5 m

  137. % R3 C# X' e, O1 [  f
  138. /******************************************************************************************
    9 o" C. `' i0 s0 Y) X! f
  139. * 函数名称: DS1307_DataToBuff()3 M% y8 I5 L5 ~- \
  140. * 功能说明: 将时间日期变量数据转换到数组Buff中
    5 M8 l. W  k, T) Z! e+ t
  141. * 输    入: 无& |  }$ O  ?; l9 A
  142. * 输    出: 无
    7 g! T5 o! W2 C/ o
  143. ******************************************************************************************/
    ( \# g$ K  E4 G% g, ?7 e$ |' ?- {3 l2 _
  144. void DS1307_DataToBuff(void)" ^  r4 v2 \: {& h- O; X. }. J
  145. {
    6 q. y3 |, q3 O( [
  146.     uint8_t temp;
    ' |  }: Q* L* M. M0 K' E
  147.         DS_Buff[0] = 0;                  //秒  }; ^8 o- E$ y  A' b0 g0 _
  148.     temp = ((minute/10)<<4|(minute%10));
      x1 f6 l! O7 J3 Z: x/ r
  149.     DS_Buff[1] = temp;               //分
    0 |: t" |  L3 X/ x, U6 ]
  150.     temp = ((hour/10)<<4|(hour%10));8 i! [9 q1 J' d( G
  151.     DS_Buff[2] = temp;               //时  p$ C5 w1 f5 ?) [0 w
  152. : Q4 S( Y6 U( P$ @
  153.     DS_Buff[3] = week;               //星期( L, y6 V; U  G0 t4 P: G

  154. 2 F3 e2 x- ~, F# X9 k
  155.     temp = ((day/10)<<4|(day%10));& w  |0 ^" k: ]' ~
  156.     DS_Buff[4] = temp;               //日/ `9 l* G& v! L$ v4 Q% r* N
  157.     temp = ((month/10)<<4|(month%10));) U  k% U# b9 b1 |
  158.     DS_Buff[5] = temp;               //月
    9 h% X* j6 {* A5 Y; {4 U* N
  159.     temp = ((year%100)/10<<4|(year%10));( R9 T8 E+ |, @: o; P1 [+ ]3 h
  160.     DS_Buff[6] = temp;               //年
    2 n8 H1 Q: t+ ?* U0 T: G9 _
  161.     DS_Buff[7] = 32;                 //0010 0000 = 允许按1Hz输出方波3 f3 }# O8 q2 F3 ^" a: F
  162. }
    9 d, z0 ?# w6 |! a2 T2 d& R

  163. " F' y2 J6 z  D" ~9 K

  164. 3 I: p. i" w2 O% ^( F
  165. /******************************************************************************************
    ; H. p& g  I& g: _) G
  166. * 函数名称: DS1307_BuffToData(). d% n5 Q/ q8 G& p. u
  167. * 功能说明: 将数组Buff数据转换到时间日期变量中
    7 Q7 v9 |% E) g- p) B
  168. * 输    入: 无
    ; U- s9 L  n8 t7 ?# T- t
  169. * 输    出: 无
    8 R4 V- g1 x$ `
  170. ******************************************************************************************/
    8 X: o2 V2 T5 j7 c. c0 L/ X
  171. void DS1307_BuffToData(void)
    " U1 X1 G5 x6 i8 ~3 u
  172. {
    , f6 [. u' Z: s9 y5 f3 e# u
  173.     second = ((DS_Buff[0]&0x70)>>4)*10 + (DS_Buff[0]&0x0F);//秒,屏蔽秒的第7位的标志0 g4 W0 s1 q, E1 w8 V" t- L/ k
  174.     minute = ((DS_Buff[1]&0x70)>>4)*10 + (DS_Buff[1]&0x0F);//分(取低7位)
    - `; j- }/ V, ?! E" n) C  A- W
  175.            hour = ((DS_Buff[2]&0x30)>>4)*10 + (DS_Buff[2]&0x0F);  //时(取低5位)8 t3 x- C; t5 T# H) J5 W
  176.            week = (DS_Buff[3]&0x07);                              //周(取低3位)( \* c' X3 h, }+ q0 }( z5 f
  177.     day = ((DS_Buff[4]&0x30)>>4)*10 + (DS_Buff[4]&0x0F);   //日(取低6位): h4 r2 }3 a  l! m3 m; ?
  178.     month = ((DS_Buff[5]&0x10)>>4)*10 + (DS_Buff[5]&0x0F); //月(取低5位)
    " _1 F, a. Z9 M
  179.     year = 2000 + (DS_Buff[6]>>4)*10 + (DS_Buff[6]&0x0F);  //年
    ) Y% M6 L3 L8 i& t; z) `
  180. }, c" A' M7 e: v$ n, ]8 S- ~* z8 U

  181. : o: U: P* v. \5 ~' k/ O7 O: H
  182. /******************************************************************************************
    . x, u% [4 [$ Y8 c+ }+ I3 ~8 m& P
  183. * 函数名称: AT24C32_I2C_Read()
    " }1 S3 X$ @( F+ n2 g
  184. * 功能说明: 读取AT24C32的数据(存放在DS_Buff数组中)
    + j: ^/ M1 o+ P9 n/ r
  185. * 输    入: adrr(起始地址),size(读取的字节长度)
    * d5 G- ]3 \% N: C4 p
  186. * 输    出: 无
      ~% }1 G, N5 S2 z3 u
  187. ******************************************************************************************/
    $ S7 `% Q8 f% Z, ~4 Y5 L
  188. void AT24C32_I2C_Read(uint16_t addr,uint8_t size)
    ( a, B+ x4 g& }! ?: v, x3 H
  189. {
    5 y" z) b3 A1 n( b* {7 d! ^: y
  190. 2 L1 @- n! U" `6 ~, N8 N7 l
  191.     while (HAL_I2C_Mem_Read(&hi2c1,0x00A0,addr,I2C_MEMADD_SIZE_16BIT,(uint8_t*)DS_Buff,size,10000) != HAL_OK)  N/ W$ ]9 e# R; Q1 Z# z0 V2 o) `9 K
  192.     {+ G4 Q/ A9 m: K3 I1 s  I! y' N) S3 F
  193.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    # w4 r) l& s+ }5 C; P& t1 d' A
  194.         {- H# L# ^6 b9 ^# G4 `
  195.             LCD_write_ASCII(0,3,1,(uint8_t *)"AT_Read_Error!");
    # n1 n# v5 U& @
  196.         }
    1 w& s* K; b4 D" q
  197.     }
    4 [8 W* L; f& ^8 {% E% M5 d0 W+ O

  198. 4 Y) i. v# a! s4 c7 t0 s1 v
  199. }
    # N' a9 T" c  ^

  200. # V& d% b' p5 ?& K# l5 R
  201. /******************************************************************************************
    . D" s- z  Y9 G8 P3 b9 D
  202. * 函数名称: AT24C32_I2C_Write(uint16_t addr,uint8_t size)
    ) N" I- ~7 j- b" B! k
  203. * 功能说明: 写入数据到AT24C32(要写入的数据存放在DS_Buff数组中)
    & Q0 l8 X, y; k+ V/ `
  204. * 输    入: adrr(起始地址),size(写入的字节长度). u: D+ b# M! p8 n9 ]
  205. * 输    出: 无
    0 E; Y' D2 P. P* q+ l) J& @- }# e
  206. ******************************************************************************************/
    - c+ |+ A2 E* m
  207. void AT24C32_I2C_Write(uint16_t addr,uint8_t size)% K  L" f% B$ ~
  208. {  s( s6 {" m: |2 _$ m
  209.     while (HAL_I2C_Mem_Write(&hi2c1,0x00A0,addr,I2C_MEMADD_SIZE_16BIT,(uint8_t*)DS_Buff,size,10000) != HAL_OK)8 N9 @, w1 w+ r, L0 W
  210.     {0 r' d+ H5 c! u( \! b! R
  211.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)' B2 N) a, W3 @' \7 K/ B( N! n# o
  212.         {) H' b8 W- x7 u) L" R  h! A" s
  213.             LCD_write_ASCII(0,3,1,(uint8_t *)"AT_Write_Erro!");; k( A" o/ A+ ]4 p+ j; R
  214.         }, ^8 \! b2 }5 w0 v, _" N0 k
  215.     }
    ( R3 w7 ~( `$ b$ V$ ?  E
  216. 1 ^2 K) {7 n" x; H  r
  217. }
复制代码

, K% ?0 l& O0 x$ h/ X+ Y
+ P) y0 Q! i3 W3 R  v& s/ |9 d. U3 Q/ s  l; a5 P; ^

. V7 \7 A7 _! v
% J, ^7 }3 M( |6 ~/ s
收藏 1 评论4 发布时间:2019-9-20 21:19

举报

4个回答
Litthins 回答时间:2019-9-22 22:01:27
DS1307和DS1302区别大吗?
老牛洋车 回答时间:2019-9-23 12:10:18
有区别,DS1307要依靠器件地址来选定,也就是说可以挂在标准的I2C总线上使用,而DS1302则不需要器件地址,直接发送要操作的内存(寄存器)地址就行,按我的理解就是在这个总线上只能一个器件。
香醋 回答时间:2019-9-23 13:50:32
顶一下~~!
kongxiangtong28 回答时间:2019-11-16 12:08:07
您好,能给我发一下G4的pack吗?官网下载老是提示错误,谢谢

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版