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

【经验分享】STM32H7下载和调试方法(IAR8)

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
7.1   初学者重要提示
* K: w5 j  t" q, Z3 B  如果使用JLINK调试下载STM32H7,务必使用JLINK V9或V10,之前的版本已经不支持。9 x2 e: V1 s' {6 A$ j( H6 d/ m
  如果使用STLINK调试下载STM32H7,推荐使用最新的电脑端驱动和对应的固件,详情见第2章的2.6小节。$ ]) H  f) F1 [7 ?$ u& J3 B
  JLINK无法下载解决思路以及常见问题整理,适用于其它LINK% ]+ }6 w) E" L, ]  u. i) m) j, T

, o) M0 A  m- V9 t7.2   使用IAR调试和下载程序设置(JLINK)

( [3 w4 @6 C+ b$ u, g9 }* @. V" R, J调试下载STM32H7,务必使用JLINK V9或V10,之前的版本已经不支持,JLINK的驱动安装等相关文件已经在本教程第2章的2.5章节有说明。2 i' a- s. @7 L5 }4 u& I
  e+ D9 l  Y( R( H
在上个章节里面,我们已经将Options对话框里面大部分设置选项都做了说明,本章节主要是调试下载的设置。7 k+ G3 \8 H! T2 K& P( s
( F2 G& @, G8 P( z/ t
7.2.1      开发板和JLINK的接线图
& Y7 m% H7 W/ ~4 r7 g开发板接上JLINK的效果图如下,JLINK端需要插入开发板赠送的JTAG转SWD转接板:
5 s9 a9 }2 }% k: }& F* h7 f8 @( v' K
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

& s* a1 {: E8 j2 B) c. {  }
& M% @$ f# T& T6 u) X注意转接板不要插反了:1 T- U1 C2 D8 `/ H' p
4 w4 e7 Z- h* I3 C4 J
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
4 o$ H0 j" p- Y8 k+ J
/ Y& b' ?$ V$ K0 w
7.2.2      设置Options里面的Degubber选项
9 d5 k8 G2 Z, jDebug选项主要用于调试设置。) R. x( I& B) U1 k3 p
* m+ N- T5 k5 R/ ^$ J$ ], @
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

3 }+ S' o) {, L1 S) Y0 V# }" N4 |, h0 [* V5 T
设置完毕后,别忘了点击OK。
7 P! K" w% g+ r( S0 b, }. }8 O9 I* o9 V0 I
7.2.3      设置Options里面的JLINK选项; x+ K* B/ a" `
注意,在Debugger选择里面选择了JLINK后,才可以设置此选项。Setup部分使用默认配置即可,无需修改:
4 H! P8 n8 L- I0 _: S! Z! X
! `9 v: }9 F! A4 l$ K. s
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
" N$ Q. y9 Z% k( q- ~

7 s7 n8 v" a" x- w$ G( ~* ?/ a  MConnection部分要选择SWD接口:
. u/ b  `0 |- F) z/ m6 B; `' X, k, i0 y' _
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

6 b' Z, X% }6 Z8 l* J$ n
$ B3 }- h! p4 r8 G: t$ ]+ ^设置完毕后别忘了点击OK。) t  L( a3 l/ I" K9 k0 h' ]

/ x0 b! {; v) p" h7.2.4      程序下载
/ Z6 ~! ~# H4 R7 O: s7 Z) l, h前两步设置好之后,JLINK插到电脑端并跟开发板连接好,将板子上电,就可以下载了。菜单Project->download->download Active Application:
- p4 Y! H( m; u/ O; P
) r! u! s3 L* q
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

* B9 c# i: V5 k2 X- b* O
& t/ w9 u6 v* a' K下载成功后将开发板重新上电,可以看到开发板上的LED开始闪烁,IAR的Debug log窗口也有信息展示:
: C" `8 `2 ^4 }5 {0 x+ Y/ ]
8 N, l7 _" v, _
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

# k6 i5 s4 i2 ?8 v* ?" E
) I' l6 e- h3 H+ ~# |0 p7.3   使用IAR调试和下载程序设置(STLINK)
/ t2 H) K8 n- \% e$ W1 p" x调试下载STM32H7,请将STLINK固件升级到最新版,关于固件升级和驱动安装等相关文件已经在本教程第2章的2.6章节有说明。# H* t% G/ Y9 P# {3 k

$ l9 Y' M3 I0 ^3 T, p( y, C在上个章节里面,我们已经将Options对话框里面大部分设置选项都做了说明,本章节主要是调试下载的设置。
- T" d$ ~! _" d  }  J
: ~' [8 c5 `$ v. O9 a7.3.1      开发板和STLINK的接线图$ i) f' Q* ~/ o. B7 Q4 p- n( V0 z, }
开发板接上STLINK的效果图如下:- n( Z; o8 S/ F7 `
# z, p& d% E, h  O) }
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

: `' P7 t4 ], _) X
4 E  S7 m' @7 E2 F* B4 C如果是下面这种STLINK,需要接上转接板:
6 I: Y8 O) _( U, {: F* e6 f; {' e8 o8 n5 Q
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

+ d' ?% y* h6 j9 H, Q; d
+ L, e4 [4 ]6 J! q0 u' I
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

: W* d: ], ~4 Z* |
; j$ v( y4 g; F  r- H7.3.2      设置Options里面的Debug选项* b' f5 W9 Y) a
Debug选项主要用调试:
2 e8 P9 e( N( Z: C) r! R0 ^' i8 ]
. _/ y: {; V% I8 E
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
4 q! M4 A# j$ [4 Y+ E( w( _
1 W- y% R5 ]8 f) T' a+ p
7.3.3      设置Options里面的STLINK选项
" r; Z- g  D+ t/ \% T3 o注意,在Debugger选择里面选择了STLINK后,才可以设置此选项。Setup部分选择SWD接口,其它默认即可:  Z# y) |3 B9 W( Y% |8 H
" X0 L2 Y) A& X$ E; i
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

; W+ P+ x& M1 Q4 p! _2 @8 J2 u( E( M
7.3.4      程序下载$ M) m. u6 t* P) _& S7 [; w
前两步设置好之后,STLINK插到电脑端并跟开发板连接好,将板子上电,就可以下载了。点击这里即可:
4 R) k, c" m) }. `9 a5 M( l0 i9 n+ t/ [
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
* V) A# P8 j. S6 |& T1 F3 l

* s7 s9 }0 h) H下载成功后将开发板重新上电,可以看到开发板上的LED开始闪烁,IAR的Debug log窗口也有信息展示。+ L7 }2 E; r5 q+ N& z

  |3 `  r* M& U8 v6 K' z
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
9 p& c- l3 \1 P
' O$ n) ?! s" c" F3 W1 l
7.4   IAR程序调试
8 X/ b  p3 j/ f/ Z2 S7 QJLINK或者STLINK设置完毕后,调试是一样的。
& l# n2 X/ L" x% X& q+ o6 j3 q* a9 q0 N; g' R$ X: a5 I8 b- w
7.4.1      全速运行和单步调试
: U0 s& i: \5 L3 Y% S1 D5 ?点击如下按钮可以进入调试状态(下载程序到芯片同时开启调试):
; e2 I/ ^+ F, B
5 y- R5 X7 f9 Z; y9 O* R
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

* j4 P, e0 t- I, q* b7 G- c5 R' ?  e7 z' {3 c! K
进入调试状态后的效果如下:2 q" N: u7 l7 V% b% E* Y

4 I  d" ~: k, ?2 D
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
+ V4 i, G' ^3 n

% T( F/ C; V& S# f0 T首先要认识下这11个图标的含义(进入调试状态后,鼠标放在这几个图标上会有提示):" w: B( e* L& u

! P0 y; S' U1 W3 e% E
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

3 Q1 m3 O/ L3 Y# V$ v. H
2 V2 s, V9 A6 N# s( ?  第1个图标是重新编译例程并进入调试状态。- p# b6 V/ p6 a: U! Z
  第2个图标是重新进入调试状态。" V- ~0 P. h- N1 T
  第3个图标是停止调试。
( m/ S" ?) E! f. E4 m* R  第4个图标是Step Over(Step over the current step point),每次点击以函数为单位运行,不会进入函数内部。
! i# B' j" H! d6 g9 [  第5个图标是Step Into(Step into the current step point),单步调试,每次点击运行一行代码,所以只要有子函数就会进入。- M: W9 {) _- _/ y# Y+ y0 L
  第6个图标是Step out(Step out of the current line),点击后退出当前运行的函数,执行下一个函数。/ o* t: W8 g: ~. M4 _
  第7个图标是Next Statement(Step to the next statement),进入下一个状态,跟第4个图标功能差不多。
" n7 T0 v' ~4 _, \  第8个图标是Run to Cursor(Execute to the current cursor position),直接运行到用户设置的行,设置方法比较简单,用户仅需在那行使用鼠标左键点击一下,可以看到前面有光标即可(注意,程序不能倒着执行,也就是能往回设置)
0 r+ [: @& C) D+ j" _
) Q% B( Z/ }( s& f
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
% Z5 t$ i  W$ b5 v. R( {

0 a1 p' N: y& P* w0 v9 n; ]然后点击此图标即可,可以看到前面多了一个绿色的小箭头,说明已经运行到此行) x' z5 U2 w$ k! p; f" W

# N) a: f# {/ q9 j* K
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

) @$ ]6 g# i1 r& i: ~$ h3 |! F
- d' b- H/ m! H' b  第9个图标是全速运行。* i; E' X. a: t: V
  第10个图标是用于暂停全速运行。
: j3 U0 {8 X3 \+ [! E  第11个图标是复位调试,重新回到main函数开始执行。0 T  q3 v" w3 D7 f/ y
7 p8 ~) s5 i  N9 L6 b8 U$ N
前面几个图标的功能,大家多测试几次就熟练了。
1 V1 q3 q( W+ e. h( k) E2 m* k0 S7 x5 Y0 n0 @- t, N
7.4.2      外设寄存器的查看" U# |4 y- R5 k
初次使用IAR8的话,容易出现找不到在哪里查看寄存器的问题,首先需要点击这里View ->Register
$ |6 i8 C( K) ~7 _" ^
3 P7 w5 m- q+ m9 |0 n->Register 1(共提供了四个register窗口,打开那个都行,要查看多个外设时,可以同时打开多个窗口查看):
+ ]6 f0 P' G( ?, t. ^% ]( k, ~; w4 S2 ]4 c! S
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
1 t  r2 ?8 A5 y# }9 Y# p
2 J4 F: G5 z3 z4 z
给出的都是CPU寄存器:9 R0 d' M% c4 P5 h
  U. V- X" u) k
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

) S" @7 e0 \9 M) Z+ r1 \/ l5 R# R4 i3 n- D
这个并不是我们想要的,还有继续下一步,在红色的方框区域右击:  E6 X$ L4 k( |7 g4 A3 u

) M, e$ e8 v" w+ i; s$ X( F( K
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

0 ~* ~2 e* G& g" \0 v! l: z  O& i; f% }
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
( P* S4 R1 s+ v. B0 e/ ~# ?7 g
3 w7 ]1 ~) a" R% K6 b9 f& n0 y
比如查看DAC:8 F  D  t) @5 E, E+ K

1 K7 X: P! j& ?
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

: }8 {/ ~: h4 a; [5 @6 m0 `. a8 W/ `, \+ Q) e
7.4.3      全局变量的查看
' m8 e$ J/ X4 y( }5 Q针对全局变量,IAR提供了专门提供了Watch1, Watch2,Watch3和Watch4窗口,每个窗口可以添加很多变量。从菜单View ->Watch进行添加:
3 h' H& N7 K$ k+ \& d0 W0 E2 e- B# M) g6 N$ i8 F
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

& v9 f0 ?; ~/ x' m% U7 E! O6 \& m# d5 i8 B- F/ c1 u
比如定义了一个全局的32位变量count,用户可以直接在Watch1窗口里面输入此变量:# [7 W6 I2 y* Z  C  i. F

9 Q3 G* o1 `. W
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
6 E* Z; g! r5 `5 o
- s0 K! n$ D3 c4 v
也可以在源文件里面,鼠标右击此变量进行添加。调试过程中,这些窗口里面添加的变量是会更新的。但是全速运行状态,这些变量就不会更新,为了解决这个问题,IAR有一个Live Watch可以在全速运行状态查看变化:
1 [* C% [$ C0 N  b! @  [
6 ?  ?2 S) V3 R% X4 d; a
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
9 w& \- c( p2 r8 Y
: K& @$ p$ b6 e- T- H
用户可以直接在Live Watch窗口里面输入变量查看,如果程序里面做了一个简单的加法计数,就可以在全速调试状态查看此变量的动态变化:
* @9 G* C; v0 T* l$ p* _' _0 D* \1 B& y
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

# s* }, o' D: P" x/ R: k7 e; O& X" {
7.4.4      局部变量的查看1 W  I+ d( w7 s& g
针对局部变量,IAR专门提供了一个栈窗口,用于查看函数中各种局部变量,这个不需要用户添加,IAR会自动添加。从菜单View ->Locals进行添加窗口:
2 H* V6 f( D' R& N# F+ o0 C8 p& s& E& [. T- D5 a9 M
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

% t6 F4 s2 r3 |, s# m3 G0 E% ~: p( a+ L; {
局部变量需要进入到那个函数里面才可以查看,这点要特别注意,因为局部变量是来自栈空间的,进入函数申请栈空间,函数退出后,栈空间就会被释放掉。比如main函数里面一个num局部变量, Q5 t% t& m8 _3 Y
: b1 b5 Z. A# |  t8 }. N
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
( x8 d4 K- A: s! |1 X5 d/ R8 R

# L  s* d, A0 P0 w8 N( A7 W# ~7.4.5      Flash区或者RAM区的查看# b4 G) k' _8 m% @
如果要查看Flash区或者RAM区的内容,IAR提供了4个Memory窗口。从菜单View ->Memory进行添加:
+ W; V& b: b  G1 `
3 k" g8 @+ ]* D. m# o' t
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
8 s9 R& l( m  J' j
: C) U  P% s: a) G& M8 S# H
比如要查看0x2000 0000地址开始的内容,直接输入即可,这个地址是STM32H7的DTCM首地址
3 ^8 B5 p3 m' |# b9 {
8 g2 A" e- ~+ [4 e& x9 t
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

, F' Z. n& X+ p+ ]: _7 Q! z; e' j7 Z' Y! t& b
7.4.6      断点调试
1 z4 Z3 ]7 x# Y7 i* B断点调试比较重要,进入调整状态后,如果大家想让程序在指定的位置停止运行,可以添加断点,通过这个小红点来添加(注意,取消断点也是用的这个图标)。
' f5 D( K7 N9 V; i
/ N4 h& ]9 n! ~; x" U( ]( l
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png

6 V- f4 {' v/ k1 `- d
; n8 F# }* c& `! P, H比如想在79行添加断点。, x; i0 z; r& M* X; |5 `/ X( M

. K: J, `# \" v* |6 }- f; |: i% T
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
' `+ m/ F# u0 N' H" d; }

$ f* O6 ?. t. k" _+ m3 f用户仅需在那行使用鼠标左键点击一下,然后单击断点图标即可,断点设置好的效果如下:# N& [; H+ m0 A- g4 c
6 |/ N8 S# W. D; w, Z1 Y" e5 G
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
2 ?& q* m8 j: G# F
' p$ y; D* W0 H8 F& `, X+ B
然后点击全速运行,如果程序有执行到这个地方,就会停在这里。可以看到绿色小箭头也显示在左侧了,说明程序执行到这个地方了(此时还没有执行该语句):8 I$ D+ ~+ w! x1 E( r  W
4 P+ b* j7 }# j# p
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
  P! f& s1 O9 M, [$ v0 v
9 L) D: j8 r& w6 p( u7 y+ O
7.4.7      动态更新频率设置
& I. @0 f& k: S  F3 J2 z7 T8 oIAR有个周期性更新频率设置选项,菜单Tools->Options:
% ]8 \: S: E( M" ~! g3 j8 G' U  j4 s2 o, U, d* G4 U2 E3 x
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
) O+ N" w; k2 y

/ C5 l: v, n* W0 n3 A单位都是毫秒,最小1ms:1 ~0 G5 X! k4 ?: r- l
+ Q) W6 T/ t  R8 J$ v; N
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png
* E1 t1 _. r; E" Q5 f" ~" c# J
8 j/ P" _! _" O5 y
7.5   总结
: z. ~% I% {. p对于初学者来说,务必要实际动手操作一遍。特别是调试方法,要熟练掌握,因为以后工程代码调试时,用到的最多。* }$ m0 D) H) i9 `4 C

. E( E& A$ d9 W4 Q/ ?5 A) P% n) Z" o6 a+ l' z
: I  U; Q1 s  c

' S5 K0 L1 K3 {' T
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版