本帖最后由 雷精灵2046 于 2019-6-14 09:28 编辑
, x" Q" `4 b) o4 q0 n+ O& O% g8 W) X3 b* C! Y) _: [( \! h
没有用复杂的分立元件搭建发射接收电路,直接用的现成的2.4G无线模块jdy-40。: d" F2 l1 s) [9 G- R2 ~) h% |
; y9 A( {0 [: j l7 l2 K5 E `
9 \- ]4 L& u) c1 n! Z9 g发射端靠3.7V锂电池供电,用了一片SOP8封装的STC单片机,负责产生连发脉冲,同时负责检测电池电量,电压低于3V左右的时候触发低压中断,低压指示LED就会亮起来告知该充电了。平时发射模块和单片机均处于睡眠状态,有按键按下才会唤醒,从而实现省电。实测睡眠状态下整机电流约1~2uA。板子洗了一下稍微干净了一点。因为对于微功耗设备来说,焊接残余的助焊剂可能会增加漏电流。& i( C6 Y$ A! o4 }) N, X ]" w
1 K$ b+ K$ W( W, c4 r买了一个火花的FC山寨手柄,去掉里面的牛屎板子,并修正一下塑料挡板,把锂电池和充电模块装进去。
/ O% P [' t$ A) m7 \为了减少体积,充电模块裁剪得十分小,并且更换了充电电阻使之适应这个小小的锂电池。这么小容量的电池,也不需要多么大的充电电流是吧?+ |/ u9 _! V! R9 {" F$ F5 L
然后统统用热熔胶粘上。充电电流比较小,所以发热很少,不会熔化热熔胶。
4 u3 |' Y! v, a# C7 _3 E) n4 u3 V' g
* V9 ~: d+ |+ m2 d5 k; K
: O( {1 F+ c$ @- O最后把按键、导电橡胶和电路板装上去。1 x4 E8 Y) G1 R! g
精心裁剪了电路板,正好扣上,不会阻碍其他元件,也不会影响后盖和拧螺丝。
' _( y, T) ^4 N5 f8 ?
, o8 d: R7 G& B, Y: C# m3 v
5 k1 U. N: \$ \- a& f, n. q完工!6 F; q. R: E" q% ]; D% C: u5 u
- a' u: Z* H3 S7 e! n5 K) @) t2 o7 [0 l' L+ Q* i1 h
这是充电的MicroUSB插座。旁边的小孔用于透出低压报警LED的光线。
# _% f( {6 u6 v5 x1 v* H5 ?/ R/ e5 E1 f1 B& Z7 E& m/ l' L+ c M
9 s! P$ W" B) S7 I: f5 {0 B) k
接收端用一片DIP16封装的STC单片机模拟CD4021。为啥要用单片机模拟而不是直接用CD4021?因为jdy-40模块接收端在有按键按下的时候输出高电平,无按键按下输出低电平,和普通手柄正好相反。当然我也可以用两片74HC00或者74HC04之类的逻辑门进行反相,但那就增加了芯片的数量。对于FC手柄这种工作频率并不高的设备来说,STC单片机完全可以胜任模拟工作。
! h0 t. w+ K# V# u- ?
' l% }# T- u; M2 Q" r1 ~* b5 E$ V( A/ |0 T `6 O
E/ d: G% g" B3 @3 }& ~, ^电路设计有点小小的错误,所以有几根飞线。原本设计使用低压差LDO是XC6206,结果在做这个接收模块的时候,买的LDO居然找不到了!无奈只好用了AMS1117。幸好对于接收模块来说是5V降到3.3V,1117可以胜任。要是发射端手柄的话,3.7V降到3.3V,那就非得用6206不可了。
6 m* ~+ H3 W* d9 ^+ p3 _9 P7 l
7 E4 s. Q. \7 P, u/ D3 ~5 [实测十分灵敏,延迟极小几乎感觉不出来。可惜这山寨手柄的手感并不佳,尤其是方向键,软塌塌的。看来我得买个剪线手柄改装。' \) l g, ^9 l
4 s; F. ~4 Q; `, W5 X7 U6 `3 {这是电路图,有兴趣的朋友可以参考。" @# F( C# z1 T+ r& \9 E
0 y5 V5 X* W5 _. J3 y* Q
4 P2 q5 T/ j- t
我信奉开源主义,十分痛恨把技术藏着掖着。好东西大家分享嘛!所以两个单片机的源代码大公开!
, r! K1 ]* X8 Z& i- V/ b1 \编译器:Keil 51。" g' X7 k- E) ?- [7 K( \( e
/ G3 }! }5 m* h; I/ N% R( R1 Q发射端:9 Z* L! b: z1 U
- #include <INTRINS.H>) R7 U6 j7 `& e) B( N# K+ {, n
- #include "STC15W.h"
+ f+ J/ f" {! n2 S0 x! W/ u7 I - * h; g' J, E2 M7 D
- 4 w4 t( J4 z8 i' ^8 T
- /*
0 I7 l/ q. {# u/ X; y' @3 O - --------------------------+ O8 x- e5 a8 v1 a+ k: ]
- |1 (OUT) \__/ (INT1) 8|0 x% D# Y+ a( ^4 }4 y" @ ?
- | |
- _) k8 e, M4 B% L$ Z - |2 (VCC) (INT0) 7|
0 D' {- Z: ~6 |4 H- A4 M7 v - | STC15W204S |2 N! W9 b$ F1 F7 a0 ]# O
- |3 (LED) (TXD) 6|
" e$ Z) l$ R P } - | |) {1 p" ?! b# j$ [7 t! l
- |4 (GND) (RXD) 5|8 m$ b" y+ @; J5 G) y, ?+ v
- --------------------------
9 _$ F* U; O; D# \. i7 x- Q5 X( l# p - . W$ i' l" y3 C
- LED ---|<|---[===]--- VCC2 \" O- l% ]" ^9 d8 s
- Red 330
; W( H6 A) [; V' ^) S9 z6 v; ] - 3 J* b3 g+ V: O1 b2 {" ]# T: m) [0 q
- Fosc = 6MHz
: k# P3 [ J& t( y- a9 v% }% j, w2 G - */
+ u! N- s1 n/ u% |* u! g
. T/ z; k% I3 w' `& a# u
0 ^( I8 C4 [/ C3 q, X8 i- // 矩形波输出脚
! J- f9 ]$ r X' M1 p - sbit OUT = P5^4;
. q) f7 X7 X' X1 k4 l6 @3 v8 h - // 低压指示灯引脚
; x! k# u: j2 [% U( I0 r" k - sbit LED = P5^5;
2 v. A P: D. |& r$ \0 k \/ Z' U' c" Z
7 l) H J9 k$ V2 f- // 停机标志位% G/ S* K+ r9 ]: J; F3 }$ V
- bit isReadyToHalt = 0;. Z8 A2 _$ R/ |3 l7 n& G- J6 |) k, A
0 \& I- f4 O" @7 ?/ O- // 矩形波次数累计$ T& s/ R v: Z7 x, w, M' ~
- static volatile unsigned char count = 0;7 P1 a" O" W6 d! Q4 G; C) ?
- 4 n% A! |2 M6 y! q: ~, k) C: V; Q4 [1 }
- 8 h7 F. g0 u+ F; a5 Z
- static void GPIO_Init(){
5 q9 @$ E( a2 L4 a! q9 G - // P3口设置为准双向,默认靠内部弱上拉输出高电平. l) }6 \4 d0 S) }; E& E- b
- P3M0 = 0;) y5 h2 s1 D; A: O8 }
- P3M1 = 0;
) Y5 t4 M; z' \' S$ @) o1 U! c \! i - P3 = 0xFF;
6 s+ g8 t# F4 @2 H% t9 Q - // P5口设置为准双向,默认靠内部弱上拉输出高电平. Z$ l- f% Z$ U3 n a
- P5M0 = 0;
( Q1 Q/ I h! l6 a5 M- D - P5M1 = 0;
) p( y# A* b q- R% L$ w - P5 = 0xFF;
2 k# J1 [8 }9 O0 u: i% m2 o - }+ T: x; @- c+ N; ~
' X+ j v9 _5 u4 G7 w$ u( D- static void Timer0_Init(){. ~. e$ A$ ?9 X2 h
- // 16毫秒@6.000MHz
% C' J7 r3 ~6 h; n+ [, S5 x& f - AUXR &= 0x7F; // 定时器时钟12T模式
/ L# {8 g5 U+ @8 { - TMOD &= 0xF0; // 设置定时器模式6 z# o3 B. z. h
- TL0 = 0xC0; // 设置定时初值
4 s- t3 U( H3 N* [ - TH0 = 0xE0; // 设置定时初值
7 P6 r+ O& w$ L, `) r. N3 y* \ - TF0 = 0; // 清除TF0标志
" A2 Z( H3 h8 i$ R: `7 C - TR0 = 1; // 定时器0开始计时" g) l! X0 {0 P. R! m
- }
2 g$ B; k$ H5 K1 U) O - + h2 L9 q* d* M# @
- static void Interrupt_Init(){
! Q% T, J5 E: q G" n0 U - // INT0中断触发类型为下降沿触发
3 d" m9 o. F& O7 l: @, m/ F; z6 U/ w - IT0 = 1;
4 a$ w1 H* R' d - // 允许INT0中断
" y+ Q, t& T) w- o* f% P. I' Z/ \( m - EX0 = 1;
4 N r3 Z4 A: u+ I - // INT1中断触发类型为下降沿触发" h$ T! `# `: A8 Y: ]
- IT1 = 1;7 j5 y- |+ I/ s7 A
- // 允许INT1中断
7 l3 ~) |' [9 k/ y6 w8 W1 u - EX1 = 1; X" U: f5 l0 f* C# ~
- // 允许定时器0中断
' k- ?, E) p% o$ p5 q, p- e" H8 U2 v! B - ET0 = 1;# V+ ^" s- \9 ? W" R9 i
- // 允许全局中断, X/ E# O4 P% t# {' m
- EA = 1;/ N% O1 Y% y9 e- F S4 ] V2 U
- }
6 X0 c# I% L6 f) |* t1 v- _ - % c+ o, z! d3 |$ g# \, ^9 @, U
- static void INT0_Isr() interrupt 0{
) ^& g k$ p9 `1 G6 ^3 a, \. H% A - // 矩形波次数累计归零
% s6 e4 s- H& N3 w6 C& T0 g- |* ^ - count = 0;
p. j% i0 j( \$ ` - // 重开定时器0中断6 R! G o& x& {5 g3 a' R
- ET0 = 1;$ e1 ]. W3 ^2 {$ A; k! a5 q
- }
a4 @$ O. W/ j9 N/ E - + Y; }$ w' A" ?
- static void Timer0_Isr() interrupt 1{ i: O: O& {# X" b
- // 输出矩形波
7 T0 w6 X4 y# ^5 P) U8 W2 o - OUT = ~OUT;& B, o+ J; O# {; ]6 ?/ Z, y9 @
- // 累计矩形波次数
' }. V5 ~# A/ ]! n- M! x+ } [ - count++;
# R: w* r. s: Y) U0 M - // 超过250个矩形波,准备停机
" l5 N+ g7 w0 J5 e( l! W3 L - if(count > 250){
& q0 }* m. u+ ^: T: e - count = 0;
2 ?& M3 Y: {* H) E! `) E' h - isReadyToHalt = 1;, v% F; F* _1 E4 L ?1 D0 t7 v5 d* t
- }
5 ?: \/ Q8 y1 O& L) D4 }6 |1 r - }
0 E) \6 Z& p ?2 Z( Q, l3 R - - K* B6 L' w1 N: A7 G
- static void INT1_Isr() interrupt 2{ n0 {: q8 i K# y+ @ l
- // 矩形波次数累计归零9 l) v& w6 S+ L! c2 I
- count = 0;% j) {" o' u2 U
- // 重开定时器0中断/ D0 e5 |0 |2 q! `
- ET0 = 1;! |0 P. @' D6 d$ U3 A; k8 ]! L% w, H6 Y
- }
9 v1 g7 n; F8 A1 T7 d" w& g6 L
1 [' m# z$ i" l5 \9 Z8 V" y
- j7 b, J3 _9 t- O+ p' z- void main(){- c: _0 i# j3 x! \8 d% J$ d1 ~7 P
- // 初始化P3和P5口
# Z7 L( w5 O: w7 q1 P - GPIO_Init();
! M/ U; L% q3 k8 r) O+ F" a! O - // 初始化定时器0
; Z5 K2 e" L# ~0 w5 k: W - Timer0_Init();
# x* }8 C( W, X9 R; V1 V - // 初始化中断
) [. @4 d9 c9 q+ v, i6 a9 G - Interrupt_Init();
9 \- _) v4 _7 h5 l3 C - 4 \4 N! G4 t; g8 X7 f
- while(1){
0 h$ G, T' b* M' e; v - // 检测电量0 c& @$ h0 p7 N9 z' m' N9 \
- if(PCON & (1 << 5)){) r8 s. |9 d! D7 i
- // 如果电量低,低压指示灯亮
7 q1 H% j) B% S/ U* J: e8 D - LED = 0;: H G" d* ?1 g2 c8 ?$ Q U5 F/ ]
- // 清电量检测硬件标志位
( I+ H5 B/ _+ @+ i8 ` - PCON &= ~(1 << 5);/ N" b: g3 e: b* ?- w" ?$ |2 m
- }else{
9 a" T5 W! u6 B5 C - // 电量正常,低压指示灯灭
1 i3 w; ~; r% G+ k2 d- h( ~. v* D- y - LED = 1;
$ d# Q* S7 q/ Q: T6 _ - }6 k. L5 e# n% Y8 o
- # n! w. r. z' G
- // 检测到停机标志
( @8 j t$ c, h' J - if(isReadyToHalt == 1){# f9 c' ~' e# @) D y0 p, h
- // 暂时关闭定时器0中断
* Z5 D. U7 T0 Q% A9 U; |4 d - ET0 = 0;. Z' U* M1 ?0 r: `
- // 停机之前先把矩形波输出脚置低电平,以方便INT0和INT1唤醒CPU
T/ C0 x7 r+ N+ u - OUT = 0;4 H* G: Y |- B- r4 t
- // 停机之前先把低压指示灯灭掉,以省电
6 B2 B/ S1 }/ g5 i7 t2 _ - LED = 1;6 L! V( s2 Y3 w$ I |9 }
- // 进入停机模式, T. ]9 \% q3 K, E) x0 B
- PCON |= 0x02;
4 Z- q5 D V% o0 X% r L - _nop_();
: {, h C5 p$ J0 d7 m8 Z4 f - _nop_();: z2 R1 I! i2 b2 _
- _nop_();# c" q" I, y/ J& D- ` K9 `
- _nop_();
9 ~. V7 G" }- r" {# W( M- @5 E3 o - // 唤醒,清标志位- \- ?) _' c) f7 U9 M- s2 T4 Q9 @3 T
- isReadyToHalt = 0;' ~( r" d6 l: ~, P# i; P
- // 重开定时器0中断
& d! P* d& x9 [2 l( d! w7 \$ K - ET0 = 1;
) |" [. |6 a" K" N" e - }9 o _' j5 ]+ o1 ], H
- }. k( _; ~9 d6 m7 R" I; B) J" D2 t
- }
, c/ V! f$ M; Y8 K6 n
复制代码 $ ^1 C& }$ y v/ E2 \+ \9 R- F% J
硬件参数配置:% u7 M7 m; x# w+ W
# Y) }) Y, c u. R5 P$ [( A4 ]
9 O4 s# @0 h8 G; ~/ d/ @; z接收端:% `3 y" _/ B' J, g
- #include <INTRINS.H>
- H9 g; s: A, ^8 c - #include "STC15W.h"
7 c; U+ j7 r" e, i$ Z1 |3 @ - 3 X" @" }4 {) w! g4 y! W7 d
- , i" z/ s% c/ Y* u: I; Y6 C
- /*
5 d) i& D4 z6 v3 {: P7 @ - g; D4 b1 ?4 d+ g! w( e/ j' Y; `
- *---------------------------*: j L. e- ]/ {- [( W
- |1 (GPIO2) \__/ (GPIO1)16|- Y: ?) w+ y$ |9 H
- | |5 G+ L [9 R6 l
- |2 (GPIO3) (GPIO0)15|
. A$ i# U8 v/ b7 D: P - | |6 } t2 M/ U) h7 R- ?1 l& g. e
- |3 (GPIO4) 14|
J+ C; X$ G# q2 v& H" f, u- W4 N - | |0 L) c( X4 e% ~/ a7 l' g
- |4 (GPIO5) (DATA)13|. u" T# J$ q/ R! p3 t
- | STC15W204S |' k0 z! h* {( S" S- n0 [
- |5 (GPIO6) (LATCH)12|
" O2 E+ \# S2 o - | |: V0 x2 V# L' _2 ^4 G# K* U
- |6 (VCC) (CLK)11|
9 A! v% c( _1 D8 C - | |$ W( K9 F2 A' }/ W: G) [
- |7 (GPIO7) (TXD)10|- D* m& u/ \$ B3 [- o
- | |
) d1 B2 C y/ A3 ` - |8 (GND) (RXD) 9|
8 i7 f, `( i' X - *---------------------------** d0 k5 n* { q: a( Y% t2 C+ \
- Fosc = 12MHz4 b4 T8 T8 o1 L; m& X
) ^% B& Z! R: k- P1.0 -> 上
$ n7 V6 I& [! h - P1.1 -> 左/ m- H! L% @/ Q$ g
- P1.2 -> 下9 x1 \+ a6 ?& I9 F% _: P C
- P1.3 -> 右3 S8 f0 {* H3 b2 d: v+ V* n' k+ B
- P1.4 -> SEL& `( i! f! ^* L, R$ ?+ R4 Z: R
- P1.5 -> STA
+ N3 I/ L/ G8 }0 z# X/ r - P5.4 -> B. n4 e9 F- d# l& Z" v; M7 M# B
- P5.5 -> A
- M* c: h0 }% \
5 E1 O! e: c& X' S, ^: B( ^/ `' h2 F, l4 c- */* E" t! V7 {& B Z
- 3 i; g+ @5 e, m" y
+ h, K: L/ _: C' A, B+ O" ?) r- sbit CLK = P3^2;
' C: o* G; }% W* @6 W2 N5 ^& s - sbit LATCH = P3^3;2 I5 |) |9 K6 ]7 I2 G1 O
- sbit DATA = P3^6;
9 g- Y1 q7 I" ^9 S4 { - 0 e7 R5 b0 d: Y: b
- bit isReady = 0;
4 s5 d6 j- b- p; r+ h/ A4 v( G - static unsigned char key = 0;/ ?+ X0 c. L( h* R' P
- static unsigned char buf = 0; // 双缓冲。这个缓冲区保存从P1和P5组合而来的键值
. a6 y- c3 u3 u9 S2 z9 i# P& E - static unsigned char bufReady = 0; // 双缓冲。这个缓冲区保存上面那个缓冲区的备份 s' ]1 o# J3 E; t) F0 m$ r
- static const unsigned char data mask[] = {0x80, 0x40, 0x10, 0x20, 0x01, 0x04, 0x02, 0x08}; // A B SELECT START UP DOWN LEFT RIGHT。为提升速度,这个表放到RAM中4 B! D, W# Y) X3 ~) R6 H2 n/ s& ~
- static unsigned char idx = 0;
% K1 T5 K9 X; v/ L% e5 g8 H! i/ G9 N: @ - : A3 m7 |6 R4 Y
- ( ^+ i; f. z; M! Q! b, B
- static void GPIO_Init(){4 s1 ^: E( j- x. a) \+ g! ]
- // P1口和P5口用于接收并行信号,全部初始化为准双向,依靠内部弱上拉输出高电平. U: Z& @+ N; O0 G5 p+ q* Y
- P1M0 = 0;6 e) E4 ]; \3 r2 J$ T: f
- P1M1 = 0;( j ?/ E5 W! }7 H" T
- P1= 0xFF;
% ^+ a2 c6 p* g6 ~ - P5M0 = 0; ]' l9 N4 J0 j# E
- P5M1 = 0;
0 }8 p( D n4 @5 s- t; l" a - P5= 0xFF;
z$ ^7 }. \. p n5 ]; @# _1 e8 M( M - // P3口初始化为准双向
2 q+ K" A3 g( x% X - P3M0 = 0;0 Y3 k$ u9 k" f
- P3M1 = 0;$ n( j9 ?" o! D, O
- P3 = 0xFF;7 O9 K; q' d. ~; Q6 s2 F
- }% c8 o, k8 a" U" M
- : M! P, F4 E9 S, g! M+ J& R! }
- static void Interrupt_Init(){- l0 T: r% z8 g. X2 A
- // INT0中断(CLK)触发类型为上升沿+下降沿# @- @7 |; I7 U- \
- IT0 = 0;
4 Z- v: W1 U0 D1 C8 ? - // 允许INT0中断
$ A. A7 O3 d& j2 z4 ^ D - EX0 = 1;: t) n Y1 i$ q
- // INT1中断(LATCH)触发类型为上升沿+下降沿
0 Y5 }6 w$ \# B" S3 V( N - IT1 = 0;
5 q& P' i4 Z4 y5 o% f7 Q. A3 W! B( a - // 允许INT1中断
4 B4 x' ?6 D# Q9 s5 o - EX1 = 1;. X1 f, q% r, |0 x) s$ |
- // 开启全局中断
" D9 }% Z: W0 ?5 t2 Y - EA = 1;/ @2 U" I* `) S
- }$ u6 A( v. g1 q% G
( @% W9 Y: V& Y4 f- static void INT0_Isr() interrupt 0{
8 D' P) E' n% b - // 只有已经成功锁存才允许CLK移位" z9 I8 x2 U2 C M( P
- if(isReady == 0)6 l' H" ~$ x9 ^* D& A- C/ `
- return;! c; S( V* Q. H2 x8 C, u
- // 读当前引脚电平,如果是低电平则说明是下降沿,此时直接忽略该中断8 u* h* ]2 _; a+ J+ p
- if(CLK == 0)+ {5 R1 T6 H- n. G$ F
- return;
3 z j: v& p! D+ A - // CLK上升沿到来的时候,取锁存值的下一位输出9 a3 b' L; @) s
- idx++;
) o" I+ B5 y8 q - DATA = key & mask[idx];
) h% {( n t* g1 N4 j - // 如果已经完成7次移位,则一轮读取完成+ d$ J) k1 U$ W) P" E6 }- P$ R: P
- if(idx >= 7)) D t$ G* A/ W7 p* n) D
- isReady = 0;5 j) `. m7 p: U
- }/ M& u& V% `, M/ }
3 Y# V: H! o3 g* d. v" S& K- static void INT1_Isr() interrupt 2{
/ Y3 ]( O0 s* I3 Q3 C- A - // 读当前引脚电平,如果是低电平则说明是下降沿,此时直接忽略该中断/ v7 N% a+ p7 @/ P0 \# @. J, @
- if(LATCH == 0)
/ l( N+ i, Q' \! { - return;
' T1 J5 U; H4 S2 ~% [/ _. H! ] - // 当LATCH上升沿到来的时候,锁存所有按键状态,同时把键值A输出到DATA
; [- s3 \) T, y; B5 {4 @ - key = bufReady;; `5 C) m6 v% y: x4 l5 p" A
- DATA = key & 0x80;//mask[0]; // 为了加速运算,直接取表中的值而不是读表
6 S) X2 ~4 r0 L! g - idx = 0;
3 x. n5 O3 a9 } - // 允许CLK进行移位* F K3 D4 Y2 c8 j( ^" Q% I8 v1 d
- isReady = 1;
& c" |+ b' x5 v1 n$ H - }
, L2 p' y; w2 ^. x5 q# \1 w - 1 I% R6 Q0 H; d/ B
- void main(){7 I0 u* U% f9 N; N: k
- GPIO_Init();
: M" Q* F( J) k& ]0 c; C2 S - Interrupt_Init();% x) V* f% Z- X/ E H
-
( Y5 j6 l, W/ @. u! l. | - while(1){
; K Q9 R1 W2 h. a - //PCON |= 0x01; // 进入省电模式
$ {4 C' N9 l2 }- d9 ^ - //_nop_();, h0 _* f" z7 N: _: N2 X
- //_nop_();4 ^( K% J+ ^) X/ D! v& Z. ?
- //_nop_();! s J' |8 b. C6 Z; q
- //_nop_();
% Z6 {$ Z4 |% i9 P# ~+ v - buf = ~((P1 & 0x3F) | ((P5 << 2) & 0xC0));
3 ~8 m8 v$ @9 U- ^ - bufReady = buf;# f) R$ Y7 } ^/ Q3 c/ Q0 Y7 i
- }
6 I. l# M5 s! b3 w$ ?9 G1 u4 ?9 J - }
. ~! |9 B! O0 t6 ]8 u, y
复制代码 ' d6 K F/ U" B2 N, ]" t; G
硬件参数配置无特殊要求,晶振频率选择12M即可。8 v6 _+ d, R7 {! I$ t3 d" H0 f
2 H) O, g6 l- \& o
这是编译好的固件。 |