From e4faf316805afaa23d5e1e6322692137eed01ebf Mon Sep 17 00:00:00 2001 From: chenjh Date: Wed, 23 Jun 2021 18:55:04 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[=E5=A2=9E=E5=8A=A0=E6=96=87=E6=A1=A3]=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=B2=E5=8F=A3v2=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E6=96=87=E6=A1=A3=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- other/novice-guide/README.md | 4 +- .../rt-thread-standard/_sidebar.md | 3 +- .../uart/{ => uart_v1}/figures/uart-dma | 0 .../uart/{ => uart_v1}/figures/uart-dma.png | Bin .../uart/{ => uart_v1}/figures/uart-int | 0 .../uart/{ => uart_v1}/figures/uart-int.png | Bin .../uart/{ => uart_v1}/figures/uart.vsdx | Bin .../uart/{ => uart_v1}/figures/uart1.png | Bin .../device/uart/{ => uart_v1}/uart.md | 0 .../device/uart/uart_v2/figures/mcfg_dma.jpg | Bin 0 -> 15246 bytes .../device/uart/uart_v2/figures/mcfg_int.jpg | Bin 0 -> 14767 bytes .../uart/uart_v2/figures/mcfg_txdma_intrx.jpg | Bin 0 -> 14885 bytes .../uart_v2/figures/mcfg_txpoll_rxint.jpg | Bin 0 -> 14433 bytes .../device/uart/uart_v2/figures/uart-dma | 24 + .../device/uart/uart_v2/figures/uart-dma.png | Bin 0 -> 34889 bytes .../device/uart/uart_v2/figures/uart.vsdx | Bin 0 -> 69674 bytes .../device/uart/uart_v2/figures/uart1.png | Bin 0 -> 4242 bytes .../device/uart/uart_v2/uart.md | 695 ++++++++++++++++++ 18 files changed, 724 insertions(+), 2 deletions(-) rename rt-thread-version/rt-thread-standard/programming-manual/device/uart/{ => uart_v1}/figures/uart-dma (100%) rename rt-thread-version/rt-thread-standard/programming-manual/device/uart/{ => uart_v1}/figures/uart-dma.png (100%) rename rt-thread-version/rt-thread-standard/programming-manual/device/uart/{ => uart_v1}/figures/uart-int (100%) rename rt-thread-version/rt-thread-standard/programming-manual/device/uart/{ => uart_v1}/figures/uart-int.png (100%) rename rt-thread-version/rt-thread-standard/programming-manual/device/uart/{ => uart_v1}/figures/uart.vsdx (100%) rename rt-thread-version/rt-thread-standard/programming-manual/device/uart/{ => uart_v1}/figures/uart1.png (100%) rename rt-thread-version/rt-thread-standard/programming-manual/device/uart/{ => uart_v1}/uart.md (100%) create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/mcfg_dma.jpg create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/mcfg_int.jpg create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/mcfg_txdma_intrx.jpg create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/mcfg_txpoll_rxint.jpg create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart-dma create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart-dma.png create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart.vsdx create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart1.png create mode 100644 rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md diff --git a/other/novice-guide/README.md b/other/novice-guide/README.md index c910085..93b72e1 100644 --- a/other/novice-guide/README.md +++ b/other/novice-guide/README.md @@ -133,7 +133,9 @@ RT-Thread Studio :可以在 Studio 中下载源码包并创建 rt-thread 工 [PIN 设备](/rt-thread-version/rt-thread-standard/programming-manual/device/pin/pin.md) -[UART 设备](/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart.md) +[UART 设备](/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart.md) + +[UART 设备V2版本](/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md) [CAN 设备](/rt-thread-version/rt-thread-standard/programming-manual/device/can/can.md) diff --git a/rt-thread-version/rt-thread-standard/_sidebar.md b/rt-thread-version/rt-thread-standard/_sidebar.md index 1ebcd68..bb457a9 100644 --- a/rt-thread-version/rt-thread-standard/_sidebar.md +++ b/rt-thread-version/rt-thread-standard/_sidebar.md @@ -32,7 +32,8 @@ - 设备和驱动 - [I/O设备模型](/rt-thread-version/rt-thread-standard/programming-manual/device/device.md) - - [UART设备](/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart.md) + - [UART设备](/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart.md) + - [UART设备V2版本](/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md) - [PIN设备](/rt-thread-version/rt-thread-standard/programming-manual/device/pin/pin.md) - [ADC设备](/rt-thread-version/rt-thread-standard/programming-manual/device/adc/adc.md) - [DAC设备](/rt-thread-version/rt-thread-standard/programming-manual/device/dac/dac.md) diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart-dma b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart-dma similarity index 100% rename from rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart-dma rename to rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart-dma diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart-dma.png b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart-dma.png similarity index 100% rename from rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart-dma.png rename to rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart-dma.png diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart-int b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart-int similarity index 100% rename from rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart-int rename to rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart-int diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart-int.png b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart-int.png similarity index 100% rename from rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart-int.png rename to rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart-int.png diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart.vsdx b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart.vsdx similarity index 100% rename from rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart.vsdx rename to rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart.vsdx diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart1.png b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart1.png similarity index 100% rename from rt-thread-version/rt-thread-standard/programming-manual/device/uart/figures/uart1.png rename to rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/figures/uart1.png diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart.md b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart.md similarity index 100% rename from rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart.md rename to rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart.md diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/mcfg_dma.jpg b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/mcfg_dma.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0776e193f1363771971808d8f0b66332b18a779f GIT binary patch literal 15246 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 akRg6%oQ1nkH}z%@+yDFFJ=9$x*Zv39+H0`@ literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/mcfg_int.jpg b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/mcfg_int.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18ce4565bc5d126d6958aa2983ab3d29c9520d38 GIT binary patch literal 14767 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 literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart-dma b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart-dma new file mode 100644 index 0000000..56b46e9 --- /dev/null +++ b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart-dma @@ -0,0 +1,24 @@ +@startuml + +actor û + +participant Ӧó +participant ISR +participant DMA +participant û + +Ӧó->Ӧó: ʼϢ +Ӧó->Ӧó: ýջص +Ӧó->Ӧó: ݴ߳ + +Ӧó->Ӧó: ݴ߳ȴϢ + +û->DMA: ûһַ + +DMA->ISR: DMAһַ뻺ж + +ISR->Ӧó: ýջصϢм߳ + +Ӧó->Ӧó: ݴ̻߳ȡϢбӻȡһַ + +@enduml \ No newline at end of file diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart-dma.png b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart-dma.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc008ef9285c57d6e2f6b2017dc44b884b60ea1 GIT binary patch literal 34889 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 literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart.vsdx b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart.vsdx new file mode 100644 index 0000000000000000000000000000000000000000..e98d48e2c0773249bca850e55ef40231500996c5 GIT binary patch literal 69674 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�JY{#)lgzF~g@G2ONwRIcfhYNx7hG8R4p-$+$;oO=84WJm~S+;}~efH_6nrn=eJ(#%dhsarDcgWQ7a&Mm0xI z>VnF1R?dLSdCN;n4UD!_YKSw9a|0)q2NX__)hg0<6-Hwm*5OjJ8iy5mzgln#)-beb zu$b4t`7#on@olTBt1{=dU37IEbAa3aJL6D#EBLTg{g<*y4RRHm)n)ZY1>cifGUj`V z<-ze(xmBjFX*J(7b5QHUJD;#H2=3GeS=9_od!_9I+5k*Bll;z1yK!qDw^pmI>;*g1 z13>L7+SSarRGNR|t|yIVNl(Hk1ywTi3qd=TQ1!j!xH~=c zOzoXEYFF>u7j|Jazg>>VQaC%KX1cO*$=tN!q#EA^qL=s+un)ksuV_-S&2v(8uwR=$ zV4%$O`g^QCxuh#P;{IZf<63iF;ozQ&Xk3ufT%-5-I^(11M_Xsib&sd44T++!)+KXH z{kG#)tKaD-U31bbce^rk;W<8;v+S0&M>)30<_p=h(KNFOhHhn0+~14ZHI4IH$o_eE zT-3)o>iWw!LZoqR-(%@VAr2nzl9RY_W;Wwyr_*8C+L$-9Ged&8mDtz|aIQNs(;W1~ zP6{z{Qjy5nsZ@Cyr_-RWjW&&GxuaitHaBwH;8mE8HP0LoZ-JTS$R=S{u;+C%mZ~~J zi3{w=C+u-7&uQK3o@=!13*IFteb^*tJ`iv=Eu73-{nNhYYLSGZbdtEm)9{`F-&CNR zX-E#FI*h(Vn7m61w@7pXao**gv(__VZgy?oV_P9iT+QVj>0s4>7B1m{RZ)8kov>`@ z{pTP$4(_?Pu(_hX!M1`#+~j*IoP$U$Nh2#eRsls{6_C|!`slq<>9s`E^)*h>d{sbh zy`}b&7vA6fzyJN8|Mx%t_2)l*TX>K6fG$kIJ5*M^$Gh~x6s`LE?ly1XdD@FhpbpD- zvcJ4b!&Hm+l)D_Zg4C-qDQIE0Cl@!<+1rIV`osRD8&CS?CT?}Uklcxd+*iJzNFz&K z8$BY1tI^S`U4KNfV8A$lm(!m#fSy9p_y!hhSOjr1Q~4qRjVA!iw0ZGY#F* z&Ej&<&v_pQjC`qUc-5|RbHWDBP|?ZnH)*Ph2{ z_rT@rMZH0{1*^D$NqVSb!&!hyQIPgt%k#n6NA?VAoJ#xa*E*3}h*aoILb|*ci8=Qk zv{M__Z|fppT4NN9T_tl&FqW7PRjh5sm>@)GaoD1_uNH=_MJKXR#h%KJ#}qy2kE=q~ z<*6?3?@o6MI?A%gT#ajpYrjUyqYhe`fw2H&Rm3ok>qklq+r>jFL&o?(WzhQTGB$D^H#- zUaFJpekB(z2kk+p#xpNqOY(=Ud_kwWP&{X;3zvmMvP9|GXE=uivb^A32lLNbcc~1v zN%FXTa^zbG=hiH-P>^UvrL>;o;mj!xoSiFFZw2wKT6tC2=)c>Y0o|@k~~wOi30V`!jx~z?HS*Hg2`5ihRy1=)aM)!dW|_2!K}o`OUhv zVoDZV<@nV*`}y2c5W67bR^651V_bjS#mJrrjjzf?Rk38uAP}~NV4ZfW74@RNy=B&| zUNqje5G?-Gg?eem_yKtUM}Mfx6S(k-#Wd_B#XZV~3pJ8}8cQ5KSS*EaH_!$=>C zwd_ni#O?vTel>1p$W@-bR6Uk0o;gU|Kf|W^3UQNOu7C2*lP5}}`H*2FWGQG(I5ssH!1d+d zv#3riz{>u9KZa{E^*O!fL=~_~;VhZPDI4Z7B@o)j`y{iUcLkTFwNU@^G#jTlRl-y) zsW9P5f6wV3^tboH(Qv*<;oR@Z0-`7L@BSYE0RR6308mQ<1QY-U00;m803iUxkNb<$ zB>(`n=>Py40001XX>)0BFKuCSbY*gLFKuCSbY*feFfMp)Z0tSRavM34?-McqAluO+ z%cf~ok;P-W)f2jGDMGS6lH4slZO~Fl;xt8SD9YVEKd`^Bj~n}O8?k?}i3AeJtU{rx zNXbW!-4kPz#F0qkh0H|ahrj)HJzn{k&TdE3$@*&4Y^|=Ole6jhXmYu}dN;p#(O+Hp z+mC<#(+>y3+j%-6pr|t5@^+&0k->ygj>0uZOqI>(SY4dON+CH_xWm zFQ*q5qqFqo#}N$vGHylj%j@B2va0+3b(ZTry-6o9?!|O=J)GY*r?X2l#P;;;?i!|r zL0a9HvvfS11Gu+WqnleC?XR~t!?SdK^=6jdrn8Uf>W@DhT@7#2Tl4qI-uC)xvbu8o z`wg^uJ)7R$tgh^jCh5`q_c46aUR`-L8jszljdVXRT(! z*P(msrL>xZekV?%0nJIXsool@Z1;`H|L8rCZ*x~Q{Rx=n!#HiwFSfh+ru)c#vnCM+ zg#2ncOD`wqI1|v1MQ?5=&G0GuzvDJ8zD6PL6-xd-GHf&;IcDbas$le@KZ;*=ULgUeAW-BN%jNG6d?> z6c%RSzu&>!h(JrQ8WXLUFV{6w(>O+nikiXhoKJtP(C`(YsX{Xa-NA4^8~s)eUX^w` z7Z>T-{I*I{1z~Z!-E@3&JiQs6AzZ+%|MBkdFj1YLrvOTS=j&$haGQMj1oO>s{J{FMS!kV+D{25(5#2kU)87U z+mFZ~Tf=#JIh~EtTlkF>EwrA6u zx083n%k=1M2zrmPPucn$1X`DQ(J4ek^%0d60&exL374?>_U-;+z`mL80=_|wb>X^n6x2AWKxfkH5vlx~S(|_KLX6bnew+UHL9q66k&c=7= zrK4|8-%LT2B1134W4kG6kI7{K>$R}Mhbu;TWsK8sBd{TTB%$>j*idMtDfzceUGNyu zYP1>$Z@1s?zdtHy@*-+T~UBO3f>=qG+{{SZ7mptQ&1(e0HwD6K~TOC(f#g_$;h zi~Uo{rOT<>jkwXOJk{axei3p(CDai^uO?uno`Fq0na|*C>K)Y@q%ii@+x@qPXqp1b zHa3r*?!Q0S-g^cAK79T3@z&$D2L9s&{CfDaj91t7pyeBfd5d?I@-O@ zl}1G?ZTFH!l!O=B18me?XxqQgbfErwxP^9#*4gcLdkxsQ;EpPfK;4CQ3Kpt1^rGTI zflif($B;DC=l?8Q|id?6wGLKqC*v0_xr$GbZRJMRwPzI*yu zba`A3@=J426(`oMtKn>T2JRx5Qyp9PPQb^<=2r)AJf$9uu8;1(f#UO&sk0NgV%E_? zX^E{}k>YTsC*U7aE~15|!eQiG_?4VY0i;i#+ErcPC9AS797axP zN0*Zxf%g>`2xnvvtL#q?sS;eM3oTiVD*;g7=()9vz`OJBVB;@m!<(yuo!_0#{-w=b zg(FRU+6Aq|uJOhOFr>zB+CeOU^6OG4!FHW!|B3CLew*xYI@=$Z;=&1*)TQ-wO}J_Go729}h~nWvIc6nsuWZe<*}-15zU-ZpKk3>2?QTkG9+W#7iQ* zKQ4)IOOr5C5La_dBS@bJBtTd;;3X0HWikynNteOM0wKUJ6CnvR1eQZcXAnnm;v%D5 z99tTZ^7zX{N!Npt1?31>IAB5>okU2;C=rcyp%p&2YU$-Lu&8SJN)gb{A)vLex$%{v zV30=vCuU<{aauOkQ1cHX2qJz;A~t0V9l(JTgP4@UF-KxR=9he#q7d?K+(Ekz27>a! zV&IFi7}yCamo)|XLHC$76)>jsp(}Yr=NDm{Li!T%Sb)B02#aMg1`doz)WQ@iWeUTz)hNB}E7Nzo7n4lxFtDZl7kEOww%DOv{WT-b#&tyrFrMiU-M(XFFT*GD_Y z8^?z`CWgkE?@byIuzH^V-K6Hg@ATWwPaFGBRaeT|Q61sf&c1^9mvn44yuL8-^J4@E z0aT+tR%4(`1;Rm|Z(|i3l8z7615=f7!8YIoloVVxc7a9R)#sJQ$XmV84A2( zNFGQOLn4$pqMgv9O1c}_foKvtr!V?!>1UTY{IA^w6gW_vjMMdh?Z zRxXqF`zn`7McM5*lI;}mTuc;h6l*9}f2fuLc`$z7SFwHCYHDdkppiU%<8d|_!_=$~ zi5MAJ1L>#Az5NQ3?l2!-`Cf-Q7^0;S?1YAbvXYhLqFmwQ!}mK4jD?7W9i?M%XWM*M zak5_`wUqHdeomJ-Dv7Evan!1K%^Lsq`K2~V6!Bp{Jy6PMX%?p-8XhDNQ2|Im)vUly zX)fs$lJ}G_Aud8*$9yf5yk@ddxl|0zgrM8mq2C* z`y;7lmNnv?9g3Y!+IjV65Q)(m4Xmf#}R0% z#^e3Vx2>7yPd( z$LKBR?rKL^5P%Mx%~e{Qbul!Yr=XGKv$rdQ!;Jbpe*$IBMqm_a*gA7Ef}@b&K%FEL zXDtCZLFuEdZfrQorrb3aJL0NY_Kr~RZa-y)(Br%r28S?da)gAALX$WPnzbly<#dv}@`FOrWr0!|zSVlOnNU z+nLR*yhKGmYACe1y|6qPbcYvb*(5n@igOQ5RcWCnb;hAj89j+EI=vnoL1fyON=L%e zhwWV<6Up32*4v{l1z@cX=~az?)MNBlI^@wIA&CgycxpkuV_NOpmUnzZNv@ za*ROB$?(QE8J;kC#8`9s+L@=}Um(&C@pMbGAkYINiZ~Q$2d2cxpwfFG8k`ID$2p)eZ zq$X}eX+K*qJQAd)PPL6%9_W0SUa(OR$UXtt3R2VZKzc&yoK6hiaT%nUZTXo?BG@Ex zqvnZ-O?i0TH9f_qmE|}Whn3{GkndJ#Ys-XAU0TFboTIBw7Ud@%eE?%eG(4fukQ8Rn zt?-lt;wIBa9Z~o`ea*TeZuSyaT%skfup&*q(CQRV)j~yj=z|VW3Oho??7&^LoB0SX z!EVgXNOR?tLQvKiq0cdIKnNc3iooAM{T(;^gQVr6$UtFEwdL3U>}m7@GGJOgd7Exi z8wyP*>(Nbmoqnqwbq4A-HXn@xQZUYzF*pqXt9opjpm7Tk4$2!|sRP4$I*q6rP6Buf&9CNkKZsMYUu zDV=rEU7$ATA$}5a~@_I>aTv>EeX^#8Xf?tGy@+crq zJOMc$a279kfU2fp>M6)_;_`^-Ak&k~ZdaGtZ6mWKE!~%*TYj7x)|B&gsk?nY{&03< z+)rT0-mrha)IT5P5+lJN(20@w)3W8{l89T8ZBDw{vEOxxkGNA+z9GqaZzg=qQ#mHGjxn7BS7-#7940-9wr0z-CcBSJd$y{7$DBz*r}BVOQX4~w z`Wk)jh*zF<$UEv5nQjz0(1}4VPTqZ_2BlwFCzkGovw?WC!SyarrsKP=I?-4z#f^aD zzp|OwVzX&z)HBy4(;b%_>dYFju567(opVh@cb3WKMH2tr*D;^yMk_}7q9&&%#oevF zCicfnZ8F;ACed#!J1qqMTi(tG2TMuAao}|AgM~L^!zdfFLY^66hBeO&qQgsnnA|eH zU}7q^VoLw=?413HHCJfcvY`&XKlDqsu}Y9DVhil!8t|?vzs#kT30I@aJu51UxJZIx zsBYo646*W}hEOt~xB{Wg2}1(2pT77EF-ZBs)KZiN{`??mJ%uX};#j7vqc@~mc`)tA z_Kxv~NnPWTKcA+?wNNNwL}zPxF~!XgIl)(#rKXnxQ7g3UZH5|rQSMQ4fsAh%X$2X1 zHug=yo)Vlbl9A?)W4`rnExia|bI5e@%$0BHHRLM% zv|)g}H+Zo?b7k+kaL+1Er;v9({3ezRByeHhmP^w{E59y5MoA>y$}V|b8)9vn;f_9L9Z$D?<;PgIRj-Wj!7~Xu z)(;+JV7mfm59&L|Y(;QoLVI5l*)MEoxlyI{BEtdx%U}BeR2cW~@ z!{LsGR9uw-RmuY|&Y*W8+KQOcIA};g;O0Srdv@c^qfel2Mc;8L2h^Sr5vO0-t#})0 zaM3<_j|;J5E@{AZzk>sJzy7gWISueQqsuK;vJr^l;iIUb>SfTr$PuJq3|(1gu}0jH zCs@84E}j63vB^m=xZ6`EV7s?`c^8hfj$M$J66n_MSo?$SzeJ75*Dz~MsKxms$ibyy zmrt>_UM@nG9t$9r_U8~G({cI z+Nkkt*|#_!XT#4N=R;GzD3SmM7o0Hg#pZOJvEk) ze>EOn-a>f^Sx;Um5%~=?L8nUQTU8(=s}@6`k?G}y4AiGOhwdYQn{VGkO$%xd)4+dV z$rV*qkeWFJg1DCIg#+RV21VNZ(Wh?p&=p*7g;TLH#^w1~l)nIPy!+K3Ej2g4%!wWf zQ^5EIr9rZe0Sy(_1))hI z3DnZ_@|NatQ>`1IrEM~2ijHOr^C=OZ25SvgcTmf-s^=K!PLkAv_CsSCpW` zPWZURBz&}ELa&Ksot4Z6#RT^X-ewd?IQsjcd0_}=c=j}YhO@&b3owJAx}e*&o(}&` zz^yU+^tXO!l>0cMrl(F#WhF}U4uUcz)j7KHjzdodV}h zWx~)7Ctof_+-%crOLSg|WO)guD+6PnYQgujY%3DUQ02t>+Kj`CaD^m|KW2Uanvdh)~~n-1|OCzK^2EYYlKT6gaM~3QsDox;A=Mx? z0+?R`E!j$lik5mwfBeg6xamA~=^Va-LRhy`=ySfhdh!S({ISF9iSkf{RgWu~7pr`t2PrIE=gJ zV43q0cqp?Wa(z9cbktOvzg$kv_a>IB%$`9pK^zcko~d>iVgQYrDT_zl7b`B9@z;mU zCI+h)DLD_W6(p*styXO7xbZbnQ?_>Xs;D0U@Vux()<}UJh5`t;-s(IfFYm zATKB%`vI=OkO2-kiz>;L5f=F;v@|23SoKy6-Yl(DbhgYp3J?aX!6L}q$*ll~5Da~v z&UGp<`e*gGouD4HJM{2UY@Rjy>Q)6x!MJfx+S~@K z3xc_)K1r8QXs=0e0!0jwyGZzKu|ewBp3Glt3Sx(^o+H-KMAMs->s)-QOQBTY z@e7g))yOlsZ&0|0oj?f)C@1)sw7hSaxF@>;Ol+t6_YI1;ro22XXd(*2&(VojhIk%# z4eCvX5^(~mAkc`}NPq;00aQh?00AEo3C?sBs(^PZ*j3};`rlrsDi+kVI#=`oVkUb~z^^44R0RrU{Aibj7SouVO8Fy{sY=H(E#i0*lT8M~S;c|PYl!>o zgTToxj1N+kTCE#|Fk!biMu^w^^^b!WdP7DBS9APC?@}%cEumfmR!jR}PX+*=v@z=+ z@x9wr)2Lw@o-eTy@o`kE7cIjWFqG-tSvqk&I6bik7X-8EEiGrZ@Ddq9+I*u;Z4Fv_ z5fJq$fIB;DnsyFWuj9|7li&#FI-Mpj!aEL@jc>=xMI3dO<#hZP1J=U|Sq;C}D}BaTJ(hFlLxga9OE(=bRm zMx~DE7qKH*Agy*M8L&re`keCQ0@zR-H8mL9@V2EOKZLZP`~XS6>PU_LBtjt*kK`>2oZTFIvBEKFmlXULWIj{x|(1d z_uG(w=G@C=h^q!BqaFb<5n?+U^z79**gXz`2K)tSpiXmBWV|d#f%ka!sAxP&QBZly z%IWXn4fP-`*fU9hiSEfxuZrnqsE(0a!dYfHa;s@yYvw9COqDp83lGW4Y#`0AMT=BZ z<)r2_s{=NS!=*Qlf~JUTqZ8$Fq|)y7Iw;rS$u%J#f>c?}c3w_VI?xxEOcjh?t}B_* zn+d)s!_DNJ`HfzkL2g}Pg-NuT60{Ft^@a~bn)d0EJ8ZK4f^Ke8@F;(!*50_=#XIq; zeojGcfxw{lCk=qS3v2Gh;&n9*Rmn_3=LJPR%nN&?03);<=6iHl*XAp{2fb{~hJ8HHo>xs>6D{iVWjlf@v9|3wh zQGQ(e6KyK?c}}trF52@i*idGB{WDhIToM$Cc$e8@7w3;HLEO4=PlTf}NNKLqX+9zR zVEWN!V{^fy&rtfBvPp_Xr06GuNoLc$ov7XJC;hl<3h0*6gOy5wkZ6u9w6X3Yq-@)0 zo7o0y{&JjSFYe30tGezUCjY#(FR(6rup~m$+#T*%-k2wqGjaLD~vO7Zzv>scJ z4^XbFhH4&BVytZVq#}~DTd91%Y-e1FRn2!)Fi!90TCS9W@*%SBnacOJUaRSjWD+Jg zTZWvGRMizqSU`Oc^thJiWN^9fHCXlsJ|zf!xZP+Ph;d%naWcQ^kM?IS7KtfJH;Gq& z(BnOW(nuBXW;&9MsjA|ZFjM~MA_&wAiQ1v7Cm=QGU%4jRo|!uqNS zPMEiSCUyWEx6Bi7MtMbfgM9^xxV-VEmIr_;#u1wQmPf3hX?+tkR)*=~iKSd>k*F1z z6DZ#VjXPAS3+sjNkN@v~|L6bx&wu^-Pd^mCLq4GQUhoN+W#1t$eeXq!_`Z9MTv(X) z-4)0%^F2(UZ}JjZnDqLdGK<67j%GEg12yT!`*tkow9m zbeU_%S7|zL(t>58g$73-X+6mfDnkE$<8WJ*CPk3#g7MSl^jAGV4{KD(H9mvG4p%4q z8HC_tOj@pGo;Af|8jbM6iF&-6ke4+9`M~|ux4+F=V&Lv6-ags@38h?SX06YxM@*Hk{T5CU&AqzcVkA!XRCamo?s5BU?utx6*$4 zTvf#dONGiHeS64wl@1f$nlRcRH;H9LeJEpXH%0{^OpCgh-nmQ}YB7uKRdFiJ{PIo_ zyo)F%)?-wi5ObjmW(-)$az;H!)hR0%U6+&SZWSkSdepnNaI(9cm!(#6;S!=4UGR_} z5?Q&!W~-INt$y46(ecaeW0aXRxe}DFfO6HDt;JKY>~5#i9)Q$L`n^Hi6@gQlSSx+) z>u_k)UMsUO=7FpV7&>zOK#64|hw8=^x4PnU;QdE>Xmlr(LhVd(Rt1Xd6IhD!gYKQE z8aJ+LB&nNhQK7{QgxqKg>GBy=(oQFH1(GNa1GoRt9pH}7YBg1A@uaFql3&9IjHZWP zO`>*HE{3N9<)&ZCcFT=+uUq5Umo~46L!|cw)#D+D&O#M*gw?Y^#@pwvpc4#TYq_I> z;wJdxE*g?4B8*|gi`irZS;rjhFhWCWad|4u@3MC^30kF+KOFHd#tJmt= zM|IsT8V$G2Ka0Nd{4=rs3WWG9qdY-adWnyl=Oi@)86HlGbM6enySqEVAvgqgcXxMphv2~>xVwLIt+n@Fd*$TZU-$mH-<;3W-BarA zs?pWeRbz}A^+Wm-S~8vZ5u(pwpHOGY#U4FHgeP(t5CSez=NR@%-|k9!Znwiv-I>Pc zZKZi%B!AyBT!^n`btn9)W8gH%=vo_`f&|Q$;aP-g+p2?upCRBhHbIPGm%OvK+4*-d z?;))BtfaZ+muHP}cuKMn$DOWBO;u&70)M8f3cH`S$}#|az_yDa5p{lEZ@9lUV|N>g zeBMmV9#OXwrKL&fGX^iAPBB35iy6p4?APKP4tQ|Zfr|UM)rmB!&vm%VCK6sF(+=iL zSGvz=AD648^cc~^?)DAFEJldbjk-9G^AlT0_rzWo^~&J@`y+a$>HI*}wQcC5F8nN` zF`qm+-^bMyL}6flM<;vFoyUo-(4;x1bu#n=WgS?!@3R|CH;7NG&wngJpD9fBFoK)T z(jz-GWb_ja2Ace?xyRJF&VX4V{hF?@7ES55Dgg6at>4`Wb z9cvP<%hqJKZ}D6;$00bDwOc`R9#{z-?eT#-#Afw~yKULFWb`7^Hw@ZCXO{?-pqsXqiB)>4b8UkX`4Dk&4Dwgs?sMEz0cu72|&p-5%K0 z-WbGR6*(+emL---pBoYnG%D@!hD?*TA&!KVPzMmgl{Ha)$x5&l3)V&p8ZEB)7GPFM z&5}y7Xrn&uBm*g2w1>2sWbMqU)R1~1O#LGsN*8=_IacDMyoR;#nnUU?NTXF&?xstM z{jm~6>X*5O9P8%FPcOL71;R+ z8=*EI;~^k8GJjgL@cBsw42p8E-Q``?g2b}P*wp`&K~z+e418#;~T?I*i8miT`%j8b9SG$ z=)axEp-}Fn&0e^oNs1Y(O)DR6lMX_U!O6!X`0;#}MxQLU6oi+HmJ1at5rh@;|JYj( z`|^!GdPp;)9Ybr2UH3n>i+3ojC{HD!snUXV;gX4&N=~^&Iav*Rvh@56|Iw zt|9Je!M~G$(%w0=yiVNWbt;U#w!6x~d@rwvg6^RJ_MKJj}vhfSk5 zeeaf%?+=0bH&ciLudiG8)HT?_&*W!$>EO6ep9cdCWVq5kpR^Og!>MviB+fHi4b50f zeKm%k;Z{3wl#HK}@ypOQ3`W~u3B33Jr1*8DG#?^qz5!xolDm(hI6HC)m}a^*maBKv z_vX&|Kv|-2{$p(KhjP-a*&6<-{NaPwU6aWwbfp9~v1F+7QUeFABE3s4KheqYf+RQo z6a_9OjucL!9Z&|F)@2kQcUvN_j`EUOQ2G(85$iZ_vBDK~es)-^EO(LH1xwU;`Az|c zVd!3(c(VH=6*4S+?mQdUSmZ)baeOQ`9o9|cOxjDH!!Nr7wa)D1wYE<=6qn&7x@Zqpg^A;1^+XPvACd$uEUZ7B z?D_$%IpHocP?p!bCh zqW%DkII3d(3x><61n*O>S9X*e7ea=m?}}ArLRH^;(5^|dXhY?)w7wi;+7X-`5{$*a zI_Mm3#<;g7QVWMw9LLozEZ@lrqahEv+s^iY>ei!wbhTVNXsIWyxwbX^$U)mQkG8hU zGS6Wkll@UCa(!)Iq0WK>`}u(+&+GC%Q00AN??CsrO=GOfA-x@-X|zQ6e`p$+|7aS= zRsYj8R% zOk=3!EB zuIsybv8^^E%kFYC6FBLkf|wF8(Okj+Vk&Q|x85&@f%k+wct7rLPMKdidCd=XB9d!! zl5K(ba}AXkHl+d9%hG6Fw`jsf;&t9~gKG%8tX)VZb1-_5)|rj0UQobN=18r8py`fz z#3MhJq0V!}S!2e=(`=fMEgF3B`yz70&8#zm7tt!eYhRdG_$79nk0;{WgMD3pf8l_6 zvq$1$jt_&@Gbc|vw##lDWx!_vtwfKKu_#WWu5Bi-lF*yEM7OSxFPAXk8PfAjo&v6h z#KR;JR`Vg(TP^*{Vy!lKo?!K#gKG+4GupP?IM4ag+iCDNGLDC>q%%IVo!Jc~^E@n{ zKhsKtf*@Y#bEk9m1zvj!aFuXEc~25&4TF^RoK+KWu@YxOu~Li-9qt%}w#!`fMK#)_ zSkE`h<#}l#6}W*=tW#~CLJhjN`SVATV8a?A0r82tZY2XPD=>sWX6i?A;M;=JgE8Hz z7xB%?dHQ*Iu`U^|)6~{h)wUR=<@`)3PJHq11#`~fBcBB$MqB26`NhxrkH1)a57$B?aD->d6P!a zno><1u6T4YpN7tGF4{&gM3L!FD%4;Y4N#QD5FpKp8QV`rc>yrsUDoR37} zwBe^k8A;*aZANHor`!?tS(If-FE3?W?G^eMI7UWH)F;X)U0WG_wqSO3bZ4S&YRYAJ zuN|Q)1eV?5tzek-b-dVbvGC7(N#GfXvxZUE-aCb$w5q)QnT9)$tfsfQYE2&#h zN{UYu;AfX$m}#CoAu>!I#?rP!dc3sr!-}j z*`9Y(;xqDfyu=GK#;k9nVTl&Sp*0Cpv{y+uZX{Grzo(=gs}jN`{g(Q0iplL zo8L~~)Yy^XkL{nmx08%D8=N8Zp>x<9Jg9wtmzc_*9xndFetC$izId21r-hVXdPZr& ztB29WS0w14S-t#pZUSL$n4UK9CLJi_f>}`Xhv2}Mg2?EnCXdoLUZzr5`fR(Njh*J7 zw`rF$xV#5u2`J8gZMO9W- zl`*Z~=VnGg)R`;Dtxs-jH}m@l_^Y==vp~ijSuplZ$T9>k&fTqbrsyC}mi4{e=BKK} zAu7LbHJK&_99wX|H{IW0k{sWAV@8y!2EXRr$3X`@l)Vq?zx%wuE&9A)PkEp3RV}*3 z4aGgZI(OZBGG-_@524t)C~0fodUKw1VSe*Dy4NANb5@|vt7nqsq&GHy;%h&@-hW*` z)PFyGsP(CKn$cYiSDI;8O6pY`i%d*yK49qMs2jVZo($I;(3RA>&ByNSNN-3=5HS^% z7@@VFuX}n?0li+_i#pu}^-dUy!$!o4iXE6b+TG6O&dOk0SK`C#D)Bbg&9#0>t#h3} zdATYtU9T6Y4{CcDD(WjMoBN{Jf%lx{<2>Wt(3O%TC!3kY>wSALwDT;$|Mu1im}>Nx z1&L_WIdp%{-rlzyCpJWJPvWR6;Bou%aCmt5x-fn$Hg&dP>HS4XcRtPou~X+#+x{H5 z(?-La7pom>8#yBa^1V4Vs@6-=)Q$b(c@R~%XKE{1U_pT69Y;o>-NygKOcCCs*2L5*PL|y*ZtvxYdueO;t zs?Mgthx!oPJrO=UcA|rTg6s?YUNrHZX zUZQ=8)HZz+i%S z9%!QTx-R9Xg-ZW8+WgG|lUa$eWM?H#7pK}lLq#sgWGs9n!4rXoIMO%-fg;udZ`1r*a1g~usm}mE^;hh zkxfCa6L7z;c@T|FLH4L7asgu?RtX&`no(LU=???(P+^|Ql@%4kIMxp=Fzad#nigio zvqIF01#Nt}{D`^Cyyi4tM;nv2>n+Xg)6mXkAq4O;k))3=cU8uUYgtz)O{1$?X34iC z(1p3q@`DJsQ8dEzR)j^3L-s=CHX|HTaV7)h$>z`&4EWc$$51iQz7q9;&q_+FoL%0y zU;H7+o_`54^AAC8L8GVMx^3IPa+L~E1#H@)M^g4+gRo_IZU=t$1z&)Q6lSHN4*B4T z5{RnED*7@@3}a#$S41YL4~_C=jMKCQs32r45jcUr))+W2P>zy*x26E1;ht;Vwn{v6 zM^aNrsZ&U+X2!Z{yqE{`#VG=W21;}QmL4xp{@rwRxsmg$u)79T7<#XyP3ml`OEE$y zD>4~OdppetjYxqUaz3U~d<;A)SMc{8qm>3}D)RJ(oCh*W%E9$@}$|9<-q~>Y`X-A6}s?YKMWkJft z^|s>O222I$-=h~=>5Ps)$%ZzT>N1zH(vZoWrEOn$P0lz4a|@Z3hOj+SeL-AhkDeRRdpWblsdYzGHq0~&DPIT+EJ^YCp@|Z^@y#%V@A?~FzwyC~Rsa0%5|$U7 zrd4{hX$TXz-MFo`BAh3vuIRjv$uEl;U=htglJKp&2gR#gA4NS|2#d;C z?do$_>zMJ29>(T3{X%bo$@#4PP(Z~0YU z=&px2X%how*ovi)Ia`Z4UU_g*R0G767c^R=w>dt}_gMN`f@bk@r!vPk+B7uHb z#x;a~h#~b}xUny)Vs(BPF?ZG3ggh<8KDL(5oq@Le9OSRkPoO|KQ_pjx$V@RaD=|&@ z6VXPo-dcH`GPDg-pcp87OTw}n)7k!o8rs9-=>*ElA$_2aVn~M9!{KEEa1dlFH_0iy zZ0hJnmMs=@puSu%QSHu-0yQWPEjfg*&REj&sWj*(Dd_2^ulxRdZuB09*JM_Wk&?|_ zX{pzdg4qdII!~-^Iccb1+wfMnCxpyZ32Td7yx%TJFm7MQu>j6Hft;A_m8}K!RDKdZh|;P!3rlc9N0u~A@?_PyW(Ofk>wPC9 z@H~r%@WpcVN9U7F1CB|h64Oo1`Wt2DNC(iV+MuNqYPjKKKSRsPP(|vaN6*OeBFbc&GA3YRrcRDT}XAzQL zy)e9(cm0FqR4A^_U7qh{>mnpM4*3`E9|t@V*%jY-8%vV(=W; zH=iO`W0~*joS%fOk2oYnn;UaV4%g342_dlkgd@?pF@hf`%Zw+K0zwiL1Tr)Ba8zdv z{$aRU_%29v^$-Fj2r;i3j?w;8xE>N&Is~{sU8rc&b3Sb}HSr-}mIDEfnR8WGFPw_3 zCh;+^#yIitkspEDJj{_UJ!3X~Akt8nwl$-=C%$!p&&wrspnPsQpn|v=LoFc{>w9vDX|3thWHm*fHi#E9F4;5%9|VXu za|GCn5gZwinPYSXX!M4jUz8af4;{uvh=BRk);sX;W=7L5ox0M(00Aj${eCRdqpq&CyDey)0DHJYi~~%j3=RYX0REr2)G|v9{TwS#^+=evzNpnf@kXK;~li~ zJG<>DOcAf)TuQLQ(erZtDM>p zjZnTun=c2M%U3jUOyA|1w|!bx$wv*~tUOhewi>IArlGF+FlpjpkCHA{Bogjz_e2Xd zDIVi|wSHiCb1^eHaxuB}@H+A~vnv~Oy!smarcSl59wwf(iz`Cbg6)g#GTg8qJK zOs`ugsJ_2Kp-WIcpRq4_MvQ5qN1VoLnGQ$R|K7sr`BFi6 z#4EZ^C7B3mL4y*c;w*P+Hf$Mvqu|5snY`)`jeKd60(8{Ep$5j~(s-D>i0ZT(1IK|^ zNgh2ZlkY}HWSNMtSfx`9`6U=T7kSxQpId=f;jZf%@K1J!;yf!7_)t|Y7(@1j65IV{ zI%k_Du@HMHllzTp&0vgM`yxqcLNa2%pc(tyl*3vToP3}EQmtO1lE((EV}f}09B%RT z3GwZcJBt)Y*F{^?kVXV$jX9`h!Eao zo&ox+Gh9A%s1UHKAk8=P=&}=4Q{l$esf)XyukloFe34|IkGT#Mb4A2A?k`K)(21at zVr>XXAuDVXqN5Zy%{*(0^;gLA4Je=2yKTPhc?g*XxhU}392*d7(|RL+)RYSC`CM_| zRH;@EJeC+${~=dKjl6srRy~R=f7#1Wp|Ry72zi*O0=e0<0-Dm(iURv5<{&>Z#S~An zJ_jkp*@cty#AepPHI(M`#^i3@0&7Kw=Shwf}XtzkuRgkCya=!qPBW%4jg+8Jaq7;x!kW6l} zHBZS>U)7}&;?+;;ZYRO`L7&qr#xrpMnS!X{_}<&cyqN;BDWpNM$#!K8%L_xXaM6Ou zb&-R>-%Vt^1z%rD@ERXjMBBcN+WH6Yz)o$j8S8=;_=2zk^#c2`5i&C)%UmN7 zbSQPWr?K_|?IJNL=R03=gR1Hh!#0fDAMYQ|@k9y0h-bhJ-&l$MN(G)-(#KUOQElFm zD6w@E_6HqA$38__Tf?s{?4`nNlHOdW0~v3ygk<9UAf}KCG?N4fKi?Tdhh(F%yUyto zoj;z1VwjZ$6|5Ydd1d7V4Xm8H8~rgvzOQO?GgPG)C2UmF1ufQvV37vKztY`x*I8NU zNrqUe4ZFl^`u}lC2Pw6k`%>Q`Uy3U+EB7UMYpjcI!)$W=;}Tgycf6a#%%chE^nq)9;$T#t)tlPB`c3n}SIvTR+l^K~)e zOiR5hg@q*==&4Uk?%7A1KtgCEHSnDT^!|e89TS@%gitCQ#FAU3t#+y1)NVG6UhVqtY zPG48MQq@}4Ld0*iG^#@K)}F(iKD4m2Z^gsN25zE8X7}}$sNtYmf%%32uAzKYg<9^z!NJ|Yb9-xF>ZhvT1hkEq-7D;{oBM*gv4w19y{AB7Az zM^>2Nv*ZuT9gIFTu}D7YOb~=nR@j?vhp^IaY5SwfQLW^R5R|?ZX{lQ#Oq&r?x39P| zz6MV=vUiLA0|OnwGckgpzS~dxUKO9chsrktU4cd;su|#jD>){tPB&XVQ66k&^=SJfzDU3YStBD35$spEUNZgaf z{t{Dv_Gp07j{6J^WRp@QZ#Kdsg%j`WC1%gRbE-lx(1H>=n>6FrqU?kgMPf@d`o04z zf2F^jQH8Jal@r<|_;Qcgt!Q&E5YO2}-O&n^%Kh`==gjNHGs?iV$T4eC!UFNwhQNXh zy*ldET7|IXZwJ(PN$43G3tP7gZw{}AS%C}s63iiWYo>Vt0uKzoRn_aj#r^CC{DKYW zd=dioe+Az8OI5GyU~KhY3VZrLK59)(g!Kx-0d2NbpEK@u#bA}bGV7Q_wB=L}KM zJ=Vr-`YPJAu9Hn|iF6y~HnfYaJz$|#lgQk3g_02cu}|~93+E_ZJ1S#=zFxs)QBOXA zvi;BH=Rj$6RdxWs1OOJN``=6dXBYd=($~jMNrEyV1)uw$BmJ~7aZMnewXzkiQY0WW zDgr141dN1hY|o+4wPU_eX7(Bl-%r>Mf4RmmanA4M7XhuX5maz8zp!V$X!Ypy02`Pe z?3tvB^+RQ{dRk4pg`H>|CCT(OA&Vb|DAc${C2kA-O9&^Q0YXq09bdpZ5np1PfEjaz zxPdKPL4X)_X@+dzF=l$#gFKhquCH1t@D*bK23uj5q8!Cc2xGLuD#4z9@*LQ&n`b84 zJij{2+AEW~y5n|FWb@g3E2bCqYM#8i&up72Z+_r@<@v3E_#^Uj8v()*fdT>o_~ZPm zdbpa~7}>fy{^^6GG-k8Ph}8b!K;U5TPM*(9y%A0#(6GqH7lH}kT?h;cOftu=5Q--L z6w`ICSj8!$u^avIC?F?ejf|^LT{J67#OAa_N%{iQy)m42l%>YN6E!bG#|NAE*zxL3 z+o|tC5;vZ01Z(dpsNx3W=p!6F+f734gvyZF5@HN^nFD%W#lqgOy;5TVxPnU$GgZ8r zB@b#K$%18~g6Wi=Eo2+M3rw%u98auVtB3?wc^gJ8p~kYXO)6O-@hZ97nhY5i&?AO4+l=p*vuuuw4x+o& zevVd%TG7lx&3L4{c6M+1V#`A`m>f&uW{6g$h1JQCAmXtXRf?y{1EL9W8)BY*zhe)f zR~*7IQi|@RQ358Ilgwj85228nbHk-KqGuM-PQ06dX`HV%1ka#w<8u|9v@Tpf+_ps~ zC6tU!VkvW?6R_aVEzzsT=^3kf8q*HreqL_pJ38EOzH7DukZ(_IvHOVJ*Qu3EYrrW5|;#P$3EDLnRuq7L(*K> zJ&T!>%-JlnDfUe!Y(g{p$txrVR|7OYR#}~}S07b6ouT`2)F5D0A;-QgB+){hoW}V8 z3K~^+?H|oBXMi~s((^;Z78FFHaWf9|1ER6LPrbf1w_BWW{PYZ~(Djw2hnfIA*Vxl4 zY~nnv29_G?NkhM0>fSPENAeGy6_0{%gW0vI-q#qIdHz`z8Z1;U#@j8~PgEC_*56q& zd8int>$ZVYOe#xDJau@d23{M_CZIWVXe(`I7e6C($+zf~4R=}H7bfuFY{*XO&Ny~_ zpkCzr{$A%$H}G=HYl=V9C2M*8vt*a!x0Rgo%#CyqFvLz10s_MLPbGIUGqyHn_;dT0 zy;5t{=0`JDC&RQW(odb5Nl21OVX@WFQ%ruN7^yF!EO`wGpb|U%ba$rQf|8Nj+iG=EC~rFdJ1!< zRUB=d{#usUBM5ZV_ymz!j#inY8M$-s_qHaprW6WyVxjlkbrFv|_c>Y@SC=EEAELKu z4l!sKRvIc?7TEyDZgTV|5T|P^vCn9h6k_H~u`uzV%RcY7a_^6;8)E0&wF(gR;e~@7 zgX+%TLdkhu94ZVxX-`!8m&e-3H*zQr+ty#7og%DQ1FQG#7+hJ})9E=>*x$hQvC>u* zi2(t=B<86lE(08z@j_5N)UZuCwIhuA9u)XCmZ_(%%$f+^DDJztfQT>!-#~|K!y{Bt z=@>aNGZTI>cW@KAotVbG_$Y{GYyU9JXgz_s32l~HFu)cJv2dFm*BC54b|MJnDnruP zkjNP>*~u>E95B+CP+vaVF+;$nIm5TMxF;X3v^@P$)dg)Xv0@nBnncl{@4_3e!^30l z1Vv63p>JWp7JG8&+DR+Hnag@TV$8EBU3SjC)-g_))-Skh1tAnEgkZZvp=SJEv~aEA zo&oWrUPxd+eYb4DLi4NDZ{HpbC&8*^`k<3%8mg8rjW3x+0EZNd?eH zDB)BHeznWXbWk5&V=9L5TA~!00u@MUc@yISNV*0Hz&x4xtz-;>R_S6yd+Bh*O*8b1 zkGONKED^z+g#(Z*akN2zeK2br2w-pQ_|{A6Ph=C!z6d9`ePOSHdQ4D07BQtMQ;yor z)ZtdfWbPDVsL?*(p9+RM7v7X=3f_rd?m@DdtONM&2@-csN{=mv1LRCd1qZG-I0=8p z=NM$ol(GiQrE+qG8FX)(y5k*>lgI&yA)JwYUqk!o`+Md!EN=C%`$+ z$FJ4XAqynPyYW7~EjMk_BeZ|S_z*u&Dl#i^B_hb$%8BVKXQL1V#woy!1$A8_soy~k zbf()$VCT+Xl^7|WM1b%OvKxsmd@es3*36p|nolJc5W5F8%FAVBdlIP?86K~kOQK$@ zdxZf#1`Z(?IH?GW8k920tjtCwr_ z?(N)Gzw9hBbwG&o{7Mlo{!B0Y>Sth~Z%C=H4+qywQm>$;sW%#*u7{r=Vnl-WoEgO) zg}?F%@N((Z1m8NVn}~DM;UK>}>@W&`8#91#5gZV8^x=+x_}M9boj<5gosqyr4W{Gl z-YlSJzNegYXw_K`rhS(e1^Uj{HBm@O)K8Rzc;%3Zu}az@GaCT3L4Md+dk7n09cwaH zVI6xWxv?&k$uCjoj#X-B(}lcn5O&I09d!obX9bqS;8BP-8fJ_og!|=N;S+;Lmwj`2 zH&#d`X^6vh9;kqb9!3rc9Z&@BgsTh#4Ftn?_m-=tC}^J$hgCmRA=mbF=Z zFOj4mIm$Qc`?nr4BR?yCY-N}TFse}V>q|Hy>kxOa~@E$*|FP8_PwuEeb zxoTPy2*PvF@XIQ=oWPL#Yeu@)p38T{1X)*hycBBa;7Use$5QA`Rerfu2KJz^2#@Lr z=@;QzkmWewwI7~p$~oDGEspFOYj{M5c*esMJt}lo^MU4O;j|%_l~;qV)BMhQL&X@m ztxBm=_aW>mi&OvofP3g$E1=%s+nqq{=Q z!SHT46LF(WL7ZQ1jdEyfva`|Dv#!;GZkPptA3c7hrOpy}*AnvnjwqFd;EhF@Nk|xGH9D*YXVsPs`8?mpb z;>KkaQfd@RtDiT`uKmGyU<$e&8Nz-A;G6)S#a=yHuwT;j@+SToTii0m@m&6b?S+vm zhKaY^&3j(=U5w+IR@;s*Ys|)=Nvgq;sL}WXMU$WN6120ItL zNeBD@P-Rr)w9+mmIhU|11%XPM?&660>p>+fV3>c|} zTO?g$TZ=o@Sn64|Y<2qiTt-rIj<_i8V|M%6_9gnfisf}H^$@Y5vumAx?ePr}lVBAc zYC38GQ`EPoY&PgVxGm5_rdJ;C-8N#;0yhEW=o4SIwSW$KkPB zTE2aJ7{l(^z)zmC2LaAlgzn=70~rr#1ZFW1Wd+vg;s5_^XD`b?D_Iblo=e4*PVwan zt4vPQ-4x~Iq?x0m;~8s=xb&oq>^5%H&^|e8Q3`icb#-+|hnK?iWUraE^~CwT7;(&J zuPMoX78aH*J5EeE9Vn{QnI@8%#l@!DTH-bic6Ot0{VJ7JRhnWkt6!`NtXoS<9iFbP z99Xdv3fO8!jo#1B&U9<=d!T5sajHblH|p?}mA_3+PU^6fmX)QYrA?GBp1MGS0IM&| z&$F?yjm+*}yLafQ8$f}m8xR+c)fN415j5`1iyJ6jM z_UWfzxAWeysXDO`R=CLC4@s0>v2iFnbJ4!g7$fd1++)goQ`oY{j0#@Qn*uc@wDz7$ zm_@rX(>ir{Nn|4Q83LH7T!KmBK~!k<-pJ& z8*^?82w{pNZVRIUPsJ6inQVr+Jy0N2iBXxka||P<6O{0xdlSA0)5V;2tJP$TPZ#FM zW-fQEdHXMzTVnFobZ>aC@|%c74V5Kaq(DN)#TE4kSS>PoG}hs5S`A{Vf^r`N&duI$ zZqNi(@t;N$s;+#hx+4yr$0CxEWqehtqyAsry+zER`?i+$3A;_-y!?Jx45>-I7zj{BV5oq=p6yv8s73GcfRm8 zKKD&MJa}SGpG|5%w?+k`__)^jVpNPJ2Qd2yc`O4#SAI)}d!yGStO4`-sai*=8nCRp zwN{g%?!D_?5IS_hTl7NF!u9z2ESV0ycR|K-E%I z^6iv7Z)PO(8C`hAZ%KJJWt2PiG2|^mW3zmX)k03dOXmIIhL%iyRdBylZ!%tfQNC8C z6Rtn3f^TsstcMs9Wa(JqGqq$x|8VQb9BzjhG+#Z*KI}8m<@NMH7Nvphx{?60VAFtN zRvqjzrkiymIYb~Jv=y%dLR}1n;$>AKu^!3aG|@8Gn5Bp7`8|}If!Ja`T8S0-kU;iF zI9Q2C$^}1maQ13pDTlFk(nOn=GhHQhO=XwqZcE6?zO_uH;0M;O?(Resis@AH?em5vXLzfR@L0)=)M$A&=pUAl$>k(^u*l6ki=Q3MZCkom5t!5 zJ4c=U*wJg9OxtJ3-#z7w7E9*C07^_3a3CP0|E|dTc6R@_9{+vsrYlX!p$egOracH) z-Q`2Ju0i0;N+$_I_k040=`}}Xu_-$3UrU)7Z>GwWl;+L$3!ljz%))#D#|0CSe>7d9 zd->3LI@*{p@ag_${dwK{y5s&QJhruaB?b}^m8tRC_?~klWAGxSW&G{q(e89er9_}Q zd|P@LQJY_QNu}r~BtiE`W1TU>45R2fEmYbR%4K_s8V#!DH zX2(?$X{7A?ng8@kG@?Ps(;kHIA4j*}rG5+_P8lJeX3&$INKU(>ml+sO z2QSwkXIAdG^!5ilis?)-SbX?aEL{;?de2V}wx%YBPA3;knmglCu=u=7j6sHYaJJSJ z$|mn9E9Tt@lA`?KtFp-rW2-Ys8n!~ntWE~M?Swh zr^ANJZ6U|VhlrY_T8GW1QX|{~8R4}0?0F3F`aL0m+yq{cr+^c--?A&3H!o3rd~fU6 z=Ghz$s{?ZG32=x0&t58y@n;-+z*EKs@E}6{@B7!#+0n_?`v2a-f8WC8aWc04jJSj6 zQg?Xb=i*e`Ux7ryQRB?V2YF8nkiyt==*+{@)bG|*^|9+t>fMju$)?WTQ`s>)=0-X7 zh@ef0sy&b}llR&Qtv>iCIhi2%5h)Lbm2blZZ-$Uzirl;QNM2yWid3`KgT)ao(I`JB zl3nu^rkory&BevSrc!B#WekkP?sEQg|H$+i!{1JCFH$Kz^;QJI>C2nYt8(q;<4A^9 z(U8V!q`&QDo`RxC7?NlI8S6LggH+1P!b14d&_k~E0O(+(TxFV)un@$UW8DG$mq~^5bi)C%JaVK{;$i^sykDnq-)CDlI3w z*(j@rP43Ld=v9sBjP6$C&UaXTs$s-0y1MDdoE$}MrcYY*)hMLr#I{^j#AMh%Kvs`T z{2)z@Bq=*(HDY0C*20nM`A}ELkBX)*V~+EBEG>6y?X3s7`3BDNKK(sG6BvXJ2n`4V z2w))tA_7Wqg7mBf)KwgSJpuLa>+-K7&5yP=PR2G)x=QYL#*W&5)LeO~e*%isdK<_9 z03ASOhy4fO81T(sCfPr2k-sKXeY*yE1WcG;ZUq8D`A0$_z*F%ryDp#$=WGo)|L;!R z{ruuqf&>KQ<_ZLa^^f!x#Q#qJ&jnfjGywjZ4LH>iFJZtO)j|O3kGWreza&}yjrn^f z*l!W#QPDCW01D#>4h`0w)kRw!!ucqL!})H9%AA^ivHh4bI2 ze;4X6z<_n$%+ z1{h@jD(b)U_t*YUThy;YFUCyR-vksf8F1nMiIElfJ?2lF_OBQv?C4W2z_m*ORJ?y; zj75HrVfkH6;+bf_X+{GAT3Y)RGcWOb4D0VObHF>LD1h8J18${%=B8ig_ZYU{VUSUK z!HWSR_5@5w{3iz9@b?(@-(lh;h-owcCU8vUUoj^pzsGR=4%3FcsbmBw6d~NN7%#Wq zV>o|@S)A_Eo*@GQdN}wMgX#5q4A<{4zb?D&e`n0Ie#}ozs<_8e%F5^xHtbN;?~w0s{Jvw&5SD$X^-%)KUCR00OFi`!B}7H5R`n|L4f?zmt0b1OJ_ce~lA= nP5sY)>3^r@1OKnofA>=5rNANn_!~apO$X>N>_Y+`B0&EK=#OQ4 literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart1.png b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/figures/uart1.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1404b7522001a78fe2c051712daa7896707496 GIT binary patch literal 4242 zcmcgvc{r3|yMLu!wrrKOQHru;AIXwvvVJH_W=f$fLm1JZQAF7#A^REzGZbSRN+kO_ z4aQO&%Zz1+u?^#UT-W*Moa_4jIOqD#`D5mu=big`-uwPN_w##x_ghnAeeT024nq*c z4Zo#p20?q8!0(8I`@#2n&i;5{4n4hP?FB(Rjk_O?cxfI{@Q@#U(+X|w?uhoW^K^jB z-JG7Y)wb|WnIFME5oMlkUb6gh@!$>R#q{F#o}7jkTk^W0=#dLj zC@m|o{2~?(i*ng9J3!TBd1V!|404mq3D}=z&05Oa*|gK=TvSYtU94V+K5rM{Ek$RW zst67)u=J}~$X){sTy|r4a@k+Y>Z7eEqYL4=);fLN$3QJ=;vfi+FmNM}3s}fdT#yrj zzG8wOf`L`E=@DRN`NKFM=z)fgJQx(|Uj*3(G7s)%PB@i$447a4wn^SftOg4yAqO$A zs+Rr9W~V2cc{fTW5cSIxXXI!PhEnY0>mUJ_il+~(dV5kOh7!Mt!I)WJD zfYfJHD{%%q!Azw-71v89Ea^#=aNl2c>F7ehBzE5-f7mg9j zIx8=8J<1%YCycNtjIDClmx_OJ-&Y#;LJ(8Q^9%9rEvDwe=$huKo6)%}By+Sc^>MGl zt#>Zb?@Ip&u%VNJAwer8_a*`^Zm$L9;nq&Ed40S6e&mXdxnnRk1r~+l%9@(@<&COr zSJT=YKZi)6ItK;@%2vtA%1&j2t~aSyliJIit|l2iq}*p#bJ^&#SB*?eMDxqk*o=6; zqE*kTT36W4v;utAJr`xry{SZE4+p&P-k;B0 zyWLe0|Pxn}UFiJ9Nuf`rubT$OPGlEyzhPO3$T!@Ywnhu_~mpWEkz zXM0xJ^3Q!9EXvEvtL<7?TzvZQmA;8d^wiXpqN?glIb(&^_i_wRqd5s3-p6@IS+>2x zp)bz}N!?EGkx<2~6{lTZ`G!zsNqbknqKT#Ijd7YIC6)uZ7-Q>3*M)pL2u$i0SM zGUk8XoiM(`MMrQ8$lzYn>~TW1xG|Nv^&v-R-oo>4gV`fWO(^SQhnmV?9JkOEnfiW* z;oWiMKcXJVdhq$^2W+i-zzx(V3@>DFv(^l34kuOFcG|zijW6Vzq+O$FC@UxcsO$-a zGnMMj*hSLwaKI>D`0c~ed|MgI zrR-u`85dt))g=^ewBlCpk4RDOyMo1R_6q>G?7FduiOYirTHD*(?>^KeD<~*jFtClM zquPKQsRG_x6dgFH)IOY5#})+D1lm!|M9xC*DGh8Ky_aDQRZD3iZ)F z2Gau}EF+%jn|t3ia?9o*OIm!U?frYm)&PsGzn%N8b+SwbS(`6{^vxXKppVAn&}L^1 z?D0>nYJ3>KDEF~foG$5}(!hKf-!Mv6KAtZHu6c8r+%GhdBO5m{va!bpvD$XN+e02>vq33YXK ziSE2KcTX3)AlmO&pHc6!6gs2l=N~k62N8t5?$Lg#d`Rpj9#u^F;cdO%v_KbND#Bs{ za%Igwwb@@qGETmmTwj`y5)RL6dz0d4r2-Ef`<|GX*xld%9)rOcCiEWtWRm`CZmtN7 z6g4&Rps2muVV4uyKBlIUffLvvMGcMO*x1;pEjB2hbIPRO|uWt5|a5(ZegTbKu{{5i2ND~h8UCbb|xAYZZ@G9G=k?4wxKVp=r=5xl> z_G^XdE{gh%N`8sQ#zct@{NV!gC#+}K9@jc}s`7Jt(q=02%QK~g!|4kPZeB_~hpTVj zkSsv@xSffjcH*qddB{`C&r{XB@;b=6_?nt~k2_O(N*^`X-eA1e(XM$mPk+`wI?}D7sB`? zX=M)Do>eK&<_69>6`yndRl>R{N`O=g;Fu zD=No*3%-((lV63J{;)AsSwi3B3I?-<#=l&SNO?m1XnK#4U@NH9L~d*hjuKP903WUQ z^6~=w35XTYC8NyLLoM@M1YlF0Ow-aoCD&t{Q}t|Mb}neNMO<7Qs`#^YlHre<4|oa2 z$GQ?*8RFbg%*4b5s<_m8(sR%yftqbaavSc-lTPmvC0(`<9~NlK*&(|7`}+@)b+-D1 z4!>^nziv5Hv9h-2VsD?5MO1}r8Uh$<8N2x9WRBq);I!n0W}JJmjvd2p!`mjT1e%x))>h$oKRrJ=5#vNFaat$ zoT>VdL?Ttc*si8s1=-`=>o)YdGIQ*RRq7R;|Gca5^R);r=T<`g9tt2T+mspN4(A@8wGZ>COI(6~|0Os;o4L z+~<4K!+)^p$_kssm?f=^_Qi?=`h*pN>*=G+At><9#@{yCa_`x@+Z)sA)fi^s>fGR? zYKb#PgU5wMPn_sA(cI1{DUm@@D~!_p|GuTY1NaQ^YHnqKYnfh59PL$S)MiI(vaMVw zB}xckzT-L`qSrQOvNwMR@hSqOxI|>~0iU|pZ&$F_CwTjEIUrLCxKlvLpTMC6HzdLm zk0jRxunZIS=|&06AE^W=8mGc?3kohpMn%zq8XBrVCDY0vC`Mv?Z4BEwy$tiFzXx~W zr=FgFh{4c5(bif9{9)WSwzd{B34M>#1MJzFIB^fliMP%?#hyh%Vn0A?!bv0=iY#{HS9 zb^sMi{umKqVKi$M1y*nvEG7~u=qe~sm^GPj{|kYT0XB*@RPHjmjosO%P)}ECCvNXC z70s;V+ydy@SXo&;V}VjAxBI>yH9*iF85tSfrq`dwypdk!&>FtxyQoEUANw^v{;;W@ z9If&9r}$9q^UuoeqeWNlRrs#e)YKTMaNH8q@i+h~EKOKMghU0EvS(*M)Y!MloCV8< ze8rBiwho-oQvA;zt-0gh*SZRq zjRQ)JG(Gb5O@@{Yj#3F*|Ana?MB2TQg#rcUp<@%g4$WKo;*KF+Yd~{D7f}qti zf}C>ao(u$uMvP3`@EZnA89@6XIsZL@{Lfyci5P?^t35u|Gy6mo?QK_xbz1J4{dK;h@QE-ZD*wwdK zMMiB7j^6tiB8UP;JT}SOs4dxAPL~p7($AjZ3=EjLwEuywDT9Em)a_P^_|A@g78yK~ y;e4(Fq`k&Nbw&JeH$1ixvlTcY#e)jt7R@Bdu@ literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md new file mode 100644 index 0000000..6b152ba --- /dev/null +++ b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md @@ -0,0 +1,695 @@ +# UART 设备v2版本 + +> [!NOTE] +> 注:目前只有 github 的 master 分支上的 stm32l475-pandora 的 BSP 进行了串口V2版本的适配。 +## UART 简介 + +UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 + +UART 串口的特点是将数据一位一位地顺序传送,只要 2 根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。UART 串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对于两个使用 UART 串口通信的端口,这些参数必须匹配,否则通信将无法正常完成。UART 串口传输的数据格式如下图所示: + +![串口传输数据格式](figures/uart1.png) + +* 起始位:表示数据传输的开始,电平逻辑为 “0” 。 + +* 数据位:可能值有 5、6、7、8、9,表示传输这几个 bit 位数据。一般取值为 8,因为一个 ASCII 字符值为 8 位。 + +* 奇偶校验位:用于接收方对接收到的数据进行校验,校验 “1” 的位数为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。 + +* 停止位: 表示一帧数据的结束。电平逻辑为 “1”。 + +* 波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为每秒比特数 bit/s(bps)。常见的波特率值有 4800、9600、14400、38400、115200等,数值越大数据传输的越快,波特率为 115200 表示每秒钟传输 115200 位数据。 + +## 访问串口设备 + +应用程序通过 RT-Thread提供的 I/O 设备管理接口来访问串口硬件,相关接口如下所示: + +| **函数** | **描述** | +| --------------------------- | -------------------------- | +| rt_device_find() | 查找设备 | +| rt_device_open() | 打开设备 | +| rt_device_read() | 读取数据 | +| rt_device_write() |写入数据| +| rt_device_control() | 控制设备 | +| rt_device_set_rx_indicate() | 设置接收回调函数 | +| rt_device_set_tx_complete() | 设置发送完成回调函数 | +| rt_device_close() | 关闭设备| + +### 查找串口设备 + +应用程序根据串口设备名称获取设备句柄,进而可以操作串口设备,查找设备函数如下所示, + +```c +rt_device_t rt_device_find(const char* name); +``` + +| **参数** | **描述** | +| -------- | ---------------------------------- | +| name | 设备名称 | +| **返回** | —— | +| 设备句柄 | 查找到对应设备将返回相应的设备句柄 | +| RT_NULL | 没有找到相应的设备对象 | + +一般情况下,注册到系统的串口设备名称为 uart0,uart1等,使用示例如下所示: + +```c +#define SAMPLE_UART_NAME "uart2" /* 串口设备名称 */ +static rt_device_t serial; /* 串口设备句柄 */ +/* 查找串口设备 */ +serial = rt_device_find(SAMPLE_UART_NAME); +``` + +### 打开串口设备 + +通过设备句柄,应用程序可以打开和关闭设备,打开设备时,会检测设备是否已经初始化,没有初始化则会默认调用初始化接口初始化设备。通过如下函数打开设备: + +```c +rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags); +``` + +| **参数** | **描述** | +| ---------- | ------------------------------- | +| dev | 设备句柄 | +| oflags | 设备模式标志 | +| **返回** | —— | +| RT_EOK | 设备打开成功 | +| -RT_EBUSY | 如果设备注册时指定的参数中包括 RT_DEVICE_FLAG_STANDALONE 参数,此设备将不允许重复打开 | +| 其他错误码 | 设备打开失败 | + +oflags 参数支持下列取值 (可以采用或的方式支持多种取值): + +```c +/* 接收模式参数 */ +#define RT_DEVICE_FLAG_RX_BLOCKING 0x1000 /* 接收阻塞模式*/ +#define RT_DEVICE_FLAG_RX_NON_BLOCKING 0x2000 /* 接收非阻塞模式*/ + +/* 发送模式参数 */ +#define RT_DEVICE_FLAG_TX_BLOCKING 0x4000 /* 发送阻塞模式*/ +#define RT_DEVICE_FLAG_TX_NON_BLOCKING 0x8000 /* 发送非阻塞模式*/ + +#define RT_DEVICE_FLAG_STREAM 0x040 /* 流模式 */ +``` + +用户使用串口时,不再根据硬件工作模式(轮询、中断、DMA)选择,而是根据具体的操作方式去配置,一般情况下,我们会选择使用 发送阻塞模式 以及 接收非阻塞模式 来进行开发。如下例子: + +```c +rt_device_open(dev, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); // 串口设备使用模式为(发送阻塞 接收非阻塞)模式 +``` + +> [!NOTE] +> 注:为了避免 阻塞/非阻塞模式 和 轮询/中断/DMA模式 在文中描述上可能存在的误解,故本文以 应用层操作模式 指代 阻塞/非阻塞模式,以 硬件工作模式 指代 轮询/中断/DMA模式。 + +而对于流模式 `RT_DEVICE_FLAG_STREAM`,主要是当串口外设作为控制台时才会使用,该模式用来解决用户回车换行的问题,在正常的串口外设通信场景中,该模式一般不会使用。 + +> [!NOTE] +> 注:`RT_DEVICE_FLAG_STREAM`流模式用于向串口终端输出字符串:当输出的字符是 `"\n"` (对应 16 进制值为 0x0A)时,自动在前面输出一个 `"\r"`(对应 16 进制值为 0x0D) 做分行。 + +流模式 RT_DEVICE_FLAG_STREAM 可以和接收发送模式参数使用或 “|” 运算符一起使用。 + +#### 硬件工作模式选择 + +由于用户层使用串口时,只关心应用层操作模式,不再关心硬件工作模式,使得应用层开发变得更加便捷,也增加了应用程序的可移植性。倘若用户开发时比较关心硬件具体的工作模式,那么应该对其工作模式如何选择? + +串口外设的遵循如下规则: + +1. 模式优先级为:DMA模式 > 中断模式 > 轮询模式。即当有DMA配置时,默认使用DMA模式,以此类推。且非必要条件,不选择使用轮询模式。 +2. 串口默认配置接收和发送缓冲区 +3. 默认使用阻塞发送、非阻塞接收模式 + +> [!NOTE] +> 注:由于串口控制台的工作场景的独特性,其硬件工作模式为中断接收和轮询发送,用户使用时不建议参照串口控制台的模式进行配置,建议参照串口设备使用示例进行使用。 + +为了更加直观的表示应用层操作模式与硬件工作模式的对应关系,下面以图表和示例的方式进行说明。 + +**发送端的模式对应关系如下表所示:** + +| 编号 | 配置发送缓冲区(有/无)说明 | 硬件工作模式(TX) | 应用层操作模式(TX) | +| ---- | --------------------------------------- | ------------------ | -------------------- | +| (1) | **不使用缓存区,且设置缓存区长度为0** | 轮询 | 阻塞 | +| (2) | 不支持该模式 | 轮询 | 非阻塞 | +| (3) | 使用缓存区 | 中断 | 阻塞 | +| (4) | 使用缓存区 | 中断 | 非阻塞 | +| (5) | **不使用缓存区,但需要设置缓冲区长度大于0** | DMA | 阻塞 | +| (6) | 使用缓存区 | DMA | 非阻塞 | + +对于编号(1) 模式,如果必须使用轮询模式时,一定要将缓冲区大小配置为0,因为如果缓冲区大小不为0,在应用层使用发送阻塞模式时,将会使用中断模式(如果开DMA,则使用DMA模式)。 + +对于编号(2)模式,当用户设置为DMA阻塞模式时,虽然设置了缓冲区不为0,但是该缓冲区并不会进行初始化,而是直接进行DMA数据搬运。从而省去了内存搬运造成的性能下降的问题。需要注意的是,当使用DMA阻塞模式时,虽然不用缓冲区,但是也要将缓冲区长度设置为大于0的值,因为当缓冲区长度为0时,将会错误地使用轮询模式。 + +**接收端的模式对应关系如下表所示:** + +| 编号 | 配置接收缓冲区(有/无)说明 | 硬件工作模式(RX) | 应用层操作模式(RX) | +| ---- | ------------------------------------- | ------------------ | -------------------- | +| (1) | **不使用缓存区,且设置缓存区长度为0** | 轮询 | 阻塞 | +| (2) | 不支持该模式 | 轮询 | 非阻塞 | +| (3) | 使用缓存区 | 中断 | 阻塞 | +| (4) | 使用缓存区 | 中断 | 非阻塞 | +| (5) | 使用缓存区 | DMA | 阻塞 | +| (6) | 使用缓存区 | DMA | 非阻塞 | + +对于编号(1) 模式,如果必须使用轮询模式时,一定要将缓冲区大小配置为0,因为如果缓冲区大小不为0,在应用层使用接收阻塞模式时,将会使用中断模式(如果开DMA,则使用DMA模式)。 + +下面举例说明如何配置硬件工作模式: + +##### 配置发送接收为DMA模式 + +在menuconfig中配置效果如下: + +![menuconfig](figures/mcfg_dma.jpg) + +上图所示,对于 UART1 的配置为开启DMA RX 和 DMA TX,且发送和接收缓存区大小设置为1024字节。 + +由此用户在应用层对串口的接收和发送的操作模式进行配置时,无论配置阻塞或者非阻塞,均使用的是DMA模式。 + +##### 配置发送接收为中断模式 + +在menuconfig中配置效果如下: + +![menuconfig](figures/mcfg_int.jpg) + +上图所示,对于 UART1 的配置为关闭DMA RX 和 DMA TX,且发送和接收缓存区大小设置为1024字节。 + +由此用户在应用层对串口的接收和发送的操作模式进行配置时,无论配置阻塞或者非阻塞,均使用的是中断模式。 + +##### 配置发送DMA模式、接收中断模式 + +在menuconfig中配置效果如下: + +![menuconfig](figures/mcfg_txdma_intrx.jpg) + +上图所示,对于 UART1 的配置为关闭DMA RX 和开启 DMA TX,且发送和接收缓存区大小设置为1024字节。 + +由此用户在应用层对串口的接收和发送的操作模式进行配置时,无论配置阻塞或者非阻塞,均使用的是DMA发送模式和中断接收模式。 + +##### 配置发送轮询模式、接收中断模式(串口控制台默认模式) + +在menuconfig中配置效果如下: + +![menuconfig](figures/mcfg_txpoll_rxint.jpg) + +上图所示,对于 UART1 的配置为关闭DMA RX 和 DMA TX,且发送和接收缓存区大小设置为1024字节。并且设置 `UART1 TX buffer size`为0。 + +由此用户在应用层对串口的接收和发送的操作模式进行配置时,发送只能使用阻塞模式,接收可以使用阻塞和非阻塞模式。串口控制台默认使用这样的配置模式,且操作模式为阻塞发送和非阻塞接收。 + +串口数据接收和发送数据的模式分为 3 种:中断模式、轮询模式、DMA 模式。在使用的时候,这 3 种模式只能**选其一**,若串口的打开参数 oflags 没有指定使用中断模式或者 DMA 模式,则默认使用轮询模式。 + +### 控制串口设备 + +通过控制接口,应用程序可以对串口设备进行配置,如波特率、数据位、校验位、接收缓冲区大小、停止位等参数的修改。控制函数如下所示: + +```c +rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg); +``` + +| **参数** | **描述** | +| ---------- | ---------------------------------------------- | +| dev | 设备句柄 | +| cmd | 命令控制字,可取值:RT_DEVICE_CTRL_CONFIG | +| arg | 控制的参数,可取类型: struct serial_configure | +| **返回** | —— | +| RT_EOK | 函数执行成功 | +| -RT_ENOSYS | 执行失败,dev 为空 | +| 其他错误码 | 执行失败 | + +控制参数结构体 struct serial_configure 原型如下: + +```c +struct serial_configure +{ + rt_uint32_t baud_rate; /* 波特率 */ + rt_uint32_t data_bits :4; /* 数据位 */ + rt_uint32_t stop_bits :2; /* 停止位 */ + rt_uint32_t parity :2; /* 奇偶校验位 */ + rt_uint32_t bit_order :1; /* 高位在前或者低位在前 */ + rt_uint32_t invert :1; /* 模式 */ + rt_uint32_t rx_bufsz :16; /* 接收数据缓冲区大小 */ + rt_uint32_t tx_bufsz :16; /* 发送数据缓冲区大小 */ + rt_uint32_t reserved :4; /* 保留位 */ +}; +``` + +RT-Thread 提供的配置参数可取值为如下宏定义: + +```c +/* 波特率可取值 */ +#define BAUD_RATE_2400 2400 +#define BAUD_RATE_4800 4800 +#define BAUD_RATE_9600 9600 +#define BAUD_RATE_19200 19200 +#define BAUD_RATE_38400 38400 +#define BAUD_RATE_57600 57600 +#define BAUD_RATE_115200 115200 +#define BAUD_RATE_230400 230400 +#define BAUD_RATE_460800 460800 +#define BAUD_RATE_921600 921600 +#define BAUD_RATE_2000000 2000000 +#define BAUD_RATE_3000000 3000000 +/* 数据位可取值 */ +#define DATA_BITS_5 5 +#define DATA_BITS_6 6 +#define DATA_BITS_7 7 +#define DATA_BITS_8 8 +#define DATA_BITS_9 9 +/* 停止位可取值 */ +#define STOP_BITS_1 0 +#define STOP_BITS_2 1 +#define STOP_BITS_3 2 +#define STOP_BITS_4 3 +/* 极性位可取值 */ +#define PARITY_NONE 0 +#define PARITY_ODD 1 +#define PARITY_EVEN 2 +/* 高低位顺序可取值 */ +#define BIT_ORDER_LSB 0 +#define BIT_ORDER_MSB 1 +/* 模式可取值 */ +#define NRZ_NORMAL 0 /* normal mode */ +#define NRZ_INVERTED 1 /* inverted mode */ + +#define RT_SERIAL_RX_MINBUFSZ 64 /* 限制接收缓冲区最小长度 */ +#define RT_SERIAL_TX_MINBUFSZ 64 /* 限制发送缓冲区最小长度 */ +``` + +RT-Thread 提供的默认串口配置如下,即 RT-Thread 系统中默认每个串口设备都使用如下配置: + +```c +/* Default config for serial_configure structure */ +#define RT_SERIAL_CONFIG_DEFAULT \ +{ \ + BAUD_RATE_115200, /* 115200 bits/s */ \ + DATA_BITS_8, /* 8 databits */ \ + STOP_BITS_1, /* 1 stopbit */ \ + PARITY_NONE, /* No parity */ \ + BIT_ORDER_LSB, /* LSB first sent */ \ + NRZ_NORMAL, /* Normal mode */ \ + RT_SERIAL_RX_MINBUFSZ, /* rxBuf size */ \ + RT_SERIAL_TX_MINBUFSZ, /* txBuf size */ \ + 0 \ +} +``` + +> [!NOTE] +> 注:虽然默认串口配置设置了rx_bufsz和tx_bufsz的大小,但是其缓冲区具体长度会在底层驱动初始化时再次配置,这里无需关心其值。 + +若实际使用串口的配置参数与默认配置参数不符,则用户可以通过应用代码进行修改。修改串口配置参数,如波特率、数据位、校验位、缓冲区接收 buffsize、停止位等的示例程序如下: + +```c +#define SAMPLE_UART_NAME "uart2" /* 串口设备名称 */ +static rt_device_t serial; /* 串口设备句柄 */ +struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */ + +/* step1:查找串口设备 */ +serial = rt_device_find(SAMPLE_UART_NAME); + +/* step2:修改串口配置参数 */ +config.baud_rate = BAUD_RATE_9600; //修改波特率为 9600 +config.data_bits = DATA_BITS_8; //数据位 8 +config.stop_bits = STOP_BITS_1; //停止位 1 +config.rx_bufsz = 128; //修改缓冲区 rx buff size 为 128 +config.parity = PARITY_NONE; //无奇偶校验位 + +/* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */ +rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); + +/* step4:打开串口设备。以非阻塞接收和阻塞发送模式打开串口设备 */ +rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); +``` + +### 发送数据 + +向串口中写入数据,可以通过如下函数完成: + +```c +rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size); +``` + +| **参数** | **描述** | +| ---------- | ------------------------------------------ | +| dev | 设备句柄 | +| pos | 写入数据偏移量,此参数串口设备未使用 | +| buffer | 内存缓冲区指针,放置要写入的数据 | +| size | 写入数据的大小 | +| **返回** | —— | +| 写入数据的实际大小 | 如果是字符设备,返回大小以字节为单位; | +| 0 | 需要读取当前线程的 errno 来判断错误状态 | + +调用这个函数,会把缓冲区 buffer 中的数据写入到设备 dev 中,写入数据的大小是 size。 + +向串口写入数据示例程序如下所示: + +```c +#define SAMPLE_UART_NAME "uart2" /* 串口设备名称 */ +static rt_device_t serial; /* 串口设备句柄 */ +char str[] = "hello RT-Thread!\r\n"; +struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 配置参数 */ +/* 查找串口设备 */ +serial = rt_device_find(SAMPLE_UART_NAME); + +/* 以非阻塞接收和阻塞发送模式打开串口设备 */ +rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); +/* 发送字符串 */ +rt_device_write(serial, 0, str, (sizeof(str) - 1)); +``` + +### 设置发送完成回调函数 + +在应用程序调用 `rt_device_write()` 写入数据时,如果底层硬件能够支持自动发送,那么上层应用可以设置一个回调函数。这个回调函数会在底层硬件数据发送完成后 (例如 DMA 传送完成或 FIFO 已经写入完毕产生完成中断时) 调用。可以通过如下函数设置设备发送完成指示 : + +```c +rt_err_t rt_device_set_tx_complete(rt_device_t dev, rt_err_t (*tx_done)(rt_device_t dev,void *buffer)); +``` + +| **参数** | **描述** | +| -------- | ------------ | +| dev | 设备句柄 | +| tx_done | 回调函数指针 | +| **返回** | —— | +| RT_EOK | 设置成功 | + +调用这个函数时,回调函数由调用者提供,当硬件设备发送完数据时,由设备驱动程序回调这个函数并把发送完成的数据块地址 buffer 作为参数传递给上层应用。上层应用(线程)在收到指示时会根据发送 buffer 的情况,释放 buffer 内存块或将其作为下一个写数据的缓存。 + +### 设置接收回调函数 + +可以通过如下函数来设置数据接收指示,当串口收到数据时,通知上层应用线程有数据到达 : + +```c +rt_err_t rt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device_t dev,rt_size_t size)); +``` + +| **参数** | **描述** | +| -------- | ------------ | +| dev | 设备句柄 | +| rx_ind | 回调函数指针 | +| dev | 设备句柄(回调函数参数)| +| size | 缓冲区数据大小(回调函数参数)| +| **返回** | —— | +| RT_EOK | 设置成功 | + +该函数的回调函数由调用者提供。若串口以中断接收模式打开,当串口接收到一个数据产生中断时,就会调用回调函数,并且会把此时缓冲区的数据大小放在 size 参数里,把串口设备句柄放在 dev 参数里供调用者获取。 + +若串口以 DMA 接收模式打开,当 DMA 完成一批数据的接收后会调用此回调函数。 + +一般情况下接收回调函数可以发送一个信号量或者事件通知串口数据处理线程有数据到达。使用示例如下所示: + +```c +#define SAMPLE_UART_NAME "uart2" /* 串口设备名称 */ +static rt_device_t serial; /* 串口设备句柄 */ +static struct rt_semaphore rx_sem; /* 用于接收消息的信号量 */ + +/* 接收数据回调函数 */ +static rt_err_t uart_input(rt_device_t dev, rt_size_t size) +{ + /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ + rt_sem_release(&rx_sem); + + return RT_EOK; +} + +static int uart_sample(int argc, char *argv[]) +{ + serial = rt_device_find(SAMPLE_UART_NAME); + + /* 以非阻塞接收和阻塞发送模式打开串口设备 */ + rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + + /* 初始化信号量 */ + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + + /* 设置接收回调函数 */ + rt_device_set_rx_indicate(serial, uart_input); +} + +``` + +### 接收数据 + +可调用如下函数读取串口接收到的数据: + +```c +rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size); +``` + +| **参数** | **描述** | +| ------------------ | ---------------------------------------------- | +| dev | 设备句柄 | +| pos | 读取数据偏移量,此参数串口设备未使用 | +| buffer | 缓冲区指针,读取的数据将会被保存在缓冲区中 | +| size | 读取数据的大小 | +| **返回** | —— | +| 读到数据的实际大小 | 如果是字符设备,返回大小以字节为单位 | +| 0 | 需要读取当前线程的 errno 来判断错误状态 | + +读取数据偏移量 pos 针对字符设备无效,此参数主要用于块设备中。 + +串口使用中断接收模式并配合接收回调函数的使用示例如下所示: + +```c +static rt_device_t serial; /* 串口设备句柄 */ +static struct rt_semaphore rx_sem; /* 用于接收消息的信号量 */ + +/* 接收数据的线程 */ +static void serial_thread_entry(void *parameter) +{ + char ch; + + while (1) + { + /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ + while (rt_device_read(serial, -1, &ch, 1) != 1) + { + /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ + rt_sem_take(&rx_sem, RT_WAITING_FOREVER); + } + /* 读取到的数据通过串口错位输出 */ + ch = ch + 1; + rt_device_write(serial, 0, &ch, 1); + } +} +``` + +### 关闭串口设备 + +当应用程序完成串口操作后,可以关闭串口设备,通过如下函数完成: + +```c +rt_err_t rt_device_close(rt_device_t dev); +``` + +| **参数** | **描述** | +| ---------- | ---------------------------------- | +| dev | 设备句柄 | +| **返回** | —— | +| RT_EOK | 关闭设备成功 | +| -RT_ERROR | 设备已经完全关闭,不能重复关闭设备 | +| 其他错误码 | 关闭设备失败 | + +关闭设备接口和打开设备接口需配对使用,打开一次设备对应要关闭一次设备,这样设备才会被完全关闭,否则设备仍处于未关闭状态。 + +## 新旧版本串口使用区别 + +* 使用 `rt_devide_open()`的入参 `oflags` 区别: + + ```c + // 旧版本 oflags 的参数取值 + RT_DEVICE_FLAG_INT_RX + RT_DEVICE_FLAG_INT_TX + RT_DEVICE_FLAG_DMA_RX + RT_DEVICE_FLAG_DMA_TX + + // 新版本 oflags 的参数取值 + RT_DEVICE_FLAG_RX_NON_BLOCKING + RT_DEVICE_FLAG_RX_BLOCKING + RT_DEVICE_FLAG_TX_NON_BLOCKING + RT_DEVICE_FLAG_TX_BLOCKING + ``` + + **为了兼容旧版本的框架,使用新版本串口框架时旧版本的应用代码可直接使用,只需注意一点,旧版本的 oflags 参数不再起作用,默认使用新版本的操作模式: 接收非阻塞发送阻塞模式。** + +* 缓冲区宏定义区别 + + 旧版本接收缓冲区统一为 `RT_SERIAL_RB_BUFSZ` ,旧版本没有发送缓冲区的设置。 + + 新版本缓冲区进行了分离接收和发送,并且也可以对各个串口进行单独设置,例如: + + ```c + // 设置 串口2 的发送缓冲区为256字节,接收缓冲区为1024字节,见rtconfig.h + #define BSP_UART2_RX_BUFSIZE 256 + #define BSP_UART2_TX_BUFSIZE 1024 + ``` + + **当从新版本往旧版本进行迁移时,如果使用了`RT_SERIAL_RB_BUFSZ`,那么需要将本参数更改为对应的串口的具体的宏定义** + + +* 串口配置`serial_configure` 成员变量 ` bufsz` 的区别: + + 旧版本的`bufsz`指代串口接收缓冲区的大小,新版本由于需要分别设置发送和接收缓冲区,因此成员变量调整为 `rx_bufsz` 和 `tx_bufsz`。 + + ```c + // 旧版本 + struct serial_configure + { + rt_uint32_t baud_rate; + + rt_uint32_t data_bits :4; + rt_uint32_t stop_bits :2; + rt_uint32_t parity :2; + rt_uint32_t bit_order :1; + rt_uint32_t invert :1; + rt_uint32_t bufsz :16; + rt_uint32_t reserved :6; + }; + + // 新版本 + struct serial_configure + { + rt_uint32_t baud_rate; + + rt_uint32_t data_bits :4; + rt_uint32_t stop_bits :2; + rt_uint32_t parity :2; + rt_uint32_t bit_order :1; + rt_uint32_t invert :1; + rt_uint32_t rx_bufsz :16; + rt_uint32_t tx_bufsz :16; + rt_uint32_t reserved :6; + }; + ``` + + + + +## 串口设备使用示例 + +### 非阻塞接收和阻塞发送模式 + +当串口接收到一批数据后会调用接收回调函数,接收回调函数会把此时缓冲区的数据大小通过消息队列发送给等待的数据处理线程。线程获取到消息后被激活,并读取数据。 + +此例程以开启了DMA发送和接收模式为例,一般情况下 DMA 接收模式会结合 DMA 接收半完成中断、完成中断和串口空闲中断完成数据接收。 + +* 此示例代码不局限于特定的 BSP,根据 BSP 注册的串口设备,修改示例代码宏定义 SAMPLE_UART_NAME 对应的串口设备名称即可运行。 + +运行序列图如下图所示: + +![串口DMA接收及轮询发送序列图](figures/uart-dma.png) + +```c +/* + * 程序清单:这是一个串口设备 开启DMA模式后使用例程 + * 例程导出了 uart_dma_sample 命令到控制终端 + * 命令调用格式:uart_dma_sample uart1 + * 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备 + * 程序功能:通过串口输出字符串"hello RT-Thread!",并通过串口输出接收到的数据,然后打印接收到的数据。 +*/ + +#include + +#define SAMPLE_UART_NAME "uart1" /* 串口设备名称 */ + +/* 串口接收消息结构*/ +struct rx_msg +{ + rt_device_t dev; + rt_size_t size; +}; +/* 串口设备句柄 */ +static rt_device_t serial; +/* 消息队列控制块 */ +static struct rt_messagequeue rx_mq; + +/* 接收数据回调函数 */ +static rt_err_t uart_input(rt_device_t dev, rt_size_t size) +{ + struct rx_msg msg; + rt_err_t result; + msg.dev = dev; + msg.size = size; + + result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); + if ( result == -RT_EFULL) + { + /* 消息队列满 */ + rt_kprintf("message queue full!\n"); + } + return result; +} + +static void serial_thread_entry(void *parameter) +{ + struct rx_msg msg; + rt_err_t result; + rt_uint32_t rx_length; + static char rx_buffer[BSP_UART1_RX_BUFSIZE + 1]; + + while (1) + { + rt_memset(&msg, 0, sizeof(msg)); + /* 从消息队列中读取消息*/ + result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); + if (result == RT_EOK) + { + /* 从串口读取数据*/ + rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); + rx_buffer[rx_length] = '\0'; + /* 通过串口设备 serial 输出读取到的消息 */ + rt_device_write(serial, 0, rx_buffer, rx_length); + /* 打印数据 */ + rt_kprintf("%s\n",rx_buffer); + } + } +} + +static int uart_dma_sample(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + char uart_name[RT_NAME_MAX]; + static char msg_pool[256]; + char str[] = "hello RT-Thread!\r\n"; + + if (argc == 2) + { + rt_strncpy(uart_name, argv[1], RT_NAME_MAX); + } + else + { + rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); + } + + /* 查找串口设备 */ + serial = rt_device_find(uart_name); + if (!serial) + { + rt_kprintf("find %s failed!\n", uart_name); + return RT_ERROR; + } + + /* 初始化消息队列 */ + rt_mq_init(&rx_mq, "rx_mq", + msg_pool, /* 存放消息的缓冲区 */ + sizeof(struct rx_msg), /* 一条消息的最大长度 */ + sizeof(msg_pool), /* 存放消息的缓冲区大小 */ + RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ + + /* 以 DMA 接收及轮询发送方式打开串口设备 */ + rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + /* 设置接收回调函数 */ + rt_device_set_rx_indicate(serial, uart_input); + /* 发送字符串 */ + rt_device_write(serial, 0, str, (sizeof(str) - 1)); + + /* 创建 serial 线程 */ + rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); + /* 创建成功则启动线程 */ + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + ret = RT_ERROR; + } + + return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(uart_dma_sample, uart device dma sample); +``` -- Gitee From 8f56a02901c0e831337c3234d626dfa3e373b6a7 Mon Sep 17 00:00:00 2001 From: chenjh Date: Thu, 24 Jun 2021 15:22:59 +0800 Subject: [PATCH 2/3] =?UTF-8?q?[=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3]=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=B2=E5=8F=A3v2=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E6=96=87=E6=A1=A3=E6=8F=90=E9=86=92=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/uart/uart_v2/uart.md | 128 +++++++++--------- 1 file changed, 65 insertions(+), 63 deletions(-) diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md index 6b152ba..e8e8b35 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md @@ -1,7 +1,11 @@ -# UART 设备v2版本 +# UART 设备 v2 版本 > [!NOTE] -> 注:目前只有 github 的 master 分支上的 stm32l475-pandora 的 BSP 进行了串口V2版本的适配。 +> 注:目前只有 github 的 master 分支上的 stm32l475-pandora 的 BSP 进行了串口 V2 版本的适配。 + +> [!NOTE] +> 注:如果用户已经清楚了解[旧版本的串口框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart),那么可直接跳过该文档的前部分关于串口介绍的内容,从[访问串口设备](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart?id=%e8%ae%bf%e9%97%ae%e4%b8%b2%e5%8f%a3%e8%ae%be%e5%a4%87)章节开始查阅即可。 + ## UART 简介 UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 @@ -14,26 +18,26 @@ UART 串口的特点是将数据一位一位地顺序传送,只要 2 根传输 * 数据位:可能值有 5、6、7、8、9,表示传输这几个 bit 位数据。一般取值为 8,因为一个 ASCII 字符值为 8 位。 -* 奇偶校验位:用于接收方对接收到的数据进行校验,校验 “1” 的位数为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。 +* 奇偶校验位:用于接收方对接收到的数据进行校验,校验 “1” 的位数为偶数 (偶校验) 或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。 * 停止位: 表示一帧数据的结束。电平逻辑为 “1”。 -* 波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为每秒比特数 bit/s(bps)。常见的波特率值有 4800、9600、14400、38400、115200等,数值越大数据传输的越快,波特率为 115200 表示每秒钟传输 115200 位数据。 +* 波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效位 (bit) 数来表示,其单位为每秒比特数 bit/s(bps)。常见的波特率值有 4800、9600、14400、38400、115200 等,数值越大数据传输的越快,波特率为 115200 表示每秒钟传输 115200 位数据。 ## 访问串口设备 -应用程序通过 RT-Thread提供的 I/O 设备管理接口来访问串口硬件,相关接口如下所示: +应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问串口硬件,相关接口如下所示: -| **函数** | **描述** | +| **函数** | **描述** | | --------------------------- | -------------------------- | | rt_device_find() | 查找设备 | | rt_device_open() | 打开设备 | | rt_device_read() | 读取数据 | -| rt_device_write() |写入数据| +| rt_device_write() | 写入数据 | | rt_device_control() | 控制设备 | | rt_device_set_rx_indicate() | 设置接收回调函数 | | rt_device_set_tx_complete() | 设置发送完成回调函数 | -| rt_device_close() | 关闭设备| +| rt_device_close() | 关闭设备 | ### 查找串口设备 @@ -43,18 +47,18 @@ UART 串口的特点是将数据一位一位地顺序传送,只要 2 根传输 rt_device_t rt_device_find(const char* name); ``` -| **参数** | **描述** | +| **参数** | **描述** | | -------- | ---------------------------------- | | name | 设备名称 | | **返回** | —— | | 设备句柄 | 查找到对应设备将返回相应的设备句柄 | | RT_NULL | 没有找到相应的设备对象 | -一般情况下,注册到系统的串口设备名称为 uart0,uart1等,使用示例如下所示: +一般情况下,注册到系统的串口设备名称为 uart0,uart1 等,使用示例如下所示: ```c #define SAMPLE_UART_NAME "uart2" /* 串口设备名称 */ -static rt_device_t serial; /* 串口设备句柄 */ +static rt_device_t serial; /* 串口设备句柄 */ /* 查找串口设备 */ serial = rt_device_find(SAMPLE_UART_NAME); ``` @@ -80,12 +84,14 @@ oflags 参数支持下列取值 (可以采用或的方式支持多种取值): ```c /* 接收模式参数 */ -#define RT_DEVICE_FLAG_RX_BLOCKING 0x1000 /* 接收阻塞模式*/ -#define RT_DEVICE_FLAG_RX_NON_BLOCKING 0x2000 /* 接收非阻塞模式*/ +#define RT_DEVICE_FLAG_RX_BLOCKING 0x1000 /* 接收阻塞模式 */ + +#define RT_DEVICE_FLAG_RX_NON_BLOCKING 0x2000 /* 接收非阻塞模式 */ /* 发送模式参数 */ -#define RT_DEVICE_FLAG_TX_BLOCKING 0x4000 /* 发送阻塞模式*/ -#define RT_DEVICE_FLAG_TX_NON_BLOCKING 0x8000 /* 发送非阻塞模式*/ +#define RT_DEVICE_FLAG_TX_BLOCKING 0x4000 /* 发送阻塞模式 */ + +#define RT_DEVICE_FLAG_TX_NON_BLOCKING 0x8000 /* 发送非阻塞模式 */ #define RT_DEVICE_FLAG_STREAM 0x040 /* 流模式 */ ``` @@ -93,16 +99,16 @@ oflags 参数支持下列取值 (可以采用或的方式支持多种取值): 用户使用串口时,不再根据硬件工作模式(轮询、中断、DMA)选择,而是根据具体的操作方式去配置,一般情况下,我们会选择使用 发送阻塞模式 以及 接收非阻塞模式 来进行开发。如下例子: ```c -rt_device_open(dev, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); // 串口设备使用模式为(发送阻塞 接收非阻塞)模式 +rt_device_open(dev, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); // 串口设备使用模式为 (发送阻塞 接收非阻塞) 模式 ``` > [!NOTE] -> 注:为了避免 阻塞/非阻塞模式 和 轮询/中断/DMA模式 在文中描述上可能存在的误解,故本文以 应用层操作模式 指代 阻塞/非阻塞模式,以 硬件工作模式 指代 轮询/中断/DMA模式。 +> 注:为了避免 阻塞 / 非阻塞模式 和 轮询 / 中断 / DMA 模式 在文中描述上可能存在的误解,故本文以 应用层操作模式 指代 阻塞 / 非阻塞模式,以 硬件工作模式 指代 轮询 / 中断 / DMA 模式。 而对于流模式 `RT_DEVICE_FLAG_STREAM`,主要是当串口外设作为控制台时才会使用,该模式用来解决用户回车换行的问题,在正常的串口外设通信场景中,该模式一般不会使用。 > [!NOTE] -> 注:`RT_DEVICE_FLAG_STREAM`流模式用于向串口终端输出字符串:当输出的字符是 `"\n"` (对应 16 进制值为 0x0A)时,自动在前面输出一个 `"\r"`(对应 16 进制值为 0x0D) 做分行。 +> 注:`RT_DEVICE_FLAG_STREAM` 流模式用于向串口终端输出字符串:当输出的字符是 `"\n"` (对应 16 进制值为 0x0A)时,自动在前面输出一个 `"\r"`(对应 16 进制值为 0x0D) 做分行。 流模式 RT_DEVICE_FLAG_STREAM 可以和接收发送模式参数使用或 “|” 运算符一起使用。 @@ -112,7 +118,7 @@ rt_device_open(dev, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING) 串口外设的遵循如下规则: -1. 模式优先级为:DMA模式 > 中断模式 > 轮询模式。即当有DMA配置时,默认使用DMA模式,以此类推。且非必要条件,不选择使用轮询模式。 +1. 模式优先级为:DMA 模式 > 中断模式 > 轮询模式。即当有 DMA 配置时,默认使用 DMA 模式,以此类推。且非必要条件,不选择使用轮询模式。 2. 串口默认配置接收和发送缓冲区 3. 默认使用阻塞发送、非阻塞接收模式 @@ -123,7 +129,7 @@ rt_device_open(dev, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING) **发送端的模式对应关系如下表所示:** -| 编号 | 配置发送缓冲区(有/无)说明 | 硬件工作模式(TX) | 应用层操作模式(TX) | +| 编号 | 配置发送缓冲区(有 / 无)说明 | 硬件工作模式(TX) | 应用层操作模式(TX) | | ---- | --------------------------------------- | ------------------ | -------------------- | | (1) | **不使用缓存区,且设置缓存区长度为0** | 轮询 | 阻塞 | | (2) | 不支持该模式 | 轮询 | 非阻塞 | @@ -132,13 +138,13 @@ rt_device_open(dev, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING) | (5) | **不使用缓存区,但需要设置缓冲区长度大于0** | DMA | 阻塞 | | (6) | 使用缓存区 | DMA | 非阻塞 | -对于编号(1) 模式,如果必须使用轮询模式时,一定要将缓冲区大小配置为0,因为如果缓冲区大小不为0,在应用层使用发送阻塞模式时,将会使用中断模式(如果开DMA,则使用DMA模式)。 +对于编号 (1) 模式,如果必须使用轮询模式时,一定要将缓冲区大小配置为 0,因为如果缓冲区大小不为 0,在应用层使用发送阻塞模式时,将会使用中断模式(如果开 DMA,则使用 DMA 模式)。 -对于编号(2)模式,当用户设置为DMA阻塞模式时,虽然设置了缓冲区不为0,但是该缓冲区并不会进行初始化,而是直接进行DMA数据搬运。从而省去了内存搬运造成的性能下降的问题。需要注意的是,当使用DMA阻塞模式时,虽然不用缓冲区,但是也要将缓冲区长度设置为大于0的值,因为当缓冲区长度为0时,将会错误地使用轮询模式。 +对于编号 (2) 模式,当用户设置为 DMA 阻塞模式时,虽然设置了缓冲区不为 0,但是该缓冲区并不会进行初始化,而是直接进行 DMA 数据搬运。从而省去了内存搬运造成的性能下降的问题。需要注意的是,当使用 DMA 阻塞模式时,虽然不用缓冲区,但是也要将缓冲区长度设置为大于 0 的值,因为当缓冲区长度为 0 时,将会错误地使用轮询模式。 **接收端的模式对应关系如下表所示:** -| 编号 | 配置接收缓冲区(有/无)说明 | 硬件工作模式(RX) | 应用层操作模式(RX) | +| 编号 | 配置接收缓冲区(有 / 无)说明 | 硬件工作模式(RX) | 应用层操作模式(RX) | | ---- | ------------------------------------- | ------------------ | -------------------- | | (1) | **不使用缓存区,且设置缓存区长度为0** | 轮询 | 阻塞 | | (2) | 不支持该模式 | 轮询 | 非阻塞 | @@ -147,47 +153,47 @@ rt_device_open(dev, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING) | (5) | 使用缓存区 | DMA | 阻塞 | | (6) | 使用缓存区 | DMA | 非阻塞 | -对于编号(1) 模式,如果必须使用轮询模式时,一定要将缓冲区大小配置为0,因为如果缓冲区大小不为0,在应用层使用接收阻塞模式时,将会使用中断模式(如果开DMA,则使用DMA模式)。 +对于编号 (1) 模式,如果必须使用轮询模式时,一定要将缓冲区大小配置为 0,因为如果缓冲区大小不为 0,在应用层使用接收阻塞模式时,将会使用中断模式(如果开 DMA,则使用 DMA 模式)。 下面举例说明如何配置硬件工作模式: -##### 配置发送接收为DMA模式 +##### 配置发送接收为 DMA 模式 -在menuconfig中配置效果如下: +在 menuconfig 中配置效果如下: ![menuconfig](figures/mcfg_dma.jpg) -上图所示,对于 UART1 的配置为开启DMA RX 和 DMA TX,且发送和接收缓存区大小设置为1024字节。 +上图所示,对于 UART1 的配置为开启 DMA RX 和 DMA TX,且发送和接收缓存区大小设置为 1024 字节。 -由此用户在应用层对串口的接收和发送的操作模式进行配置时,无论配置阻塞或者非阻塞,均使用的是DMA模式。 +由此用户在应用层对串口的接收和发送的操作模式进行配置时,无论配置阻塞或者非阻塞,均使用的是 DMA 模式。 ##### 配置发送接收为中断模式 -在menuconfig中配置效果如下: +在 menuconfig 中配置效果如下: ![menuconfig](figures/mcfg_int.jpg) -上图所示,对于 UART1 的配置为关闭DMA RX 和 DMA TX,且发送和接收缓存区大小设置为1024字节。 +上图所示,对于 UART1 的配置为关闭 DMA RX 和 DMA TX,且发送和接收缓存区大小设置为 1024 字节。 由此用户在应用层对串口的接收和发送的操作模式进行配置时,无论配置阻塞或者非阻塞,均使用的是中断模式。 -##### 配置发送DMA模式、接收中断模式 +##### 配置发送 DMA 模式、接收中断模式 -在menuconfig中配置效果如下: +在 menuconfig 中配置效果如下: ![menuconfig](figures/mcfg_txdma_intrx.jpg) -上图所示,对于 UART1 的配置为关闭DMA RX 和开启 DMA TX,且发送和接收缓存区大小设置为1024字节。 +上图所示,对于 UART1 的配置为关闭 DMA RX 和开启 DMA TX,且发送和接收缓存区大小设置为 1024 字节。 -由此用户在应用层对串口的接收和发送的操作模式进行配置时,无论配置阻塞或者非阻塞,均使用的是DMA发送模式和中断接收模式。 +由此用户在应用层对串口的接收和发送的操作模式进行配置时,无论配置阻塞或者非阻塞,均使用的是 DMA 发送模式和中断接收模式。 ##### 配置发送轮询模式、接收中断模式(串口控制台默认模式) -在menuconfig中配置效果如下: +在 menuconfig 中配置效果如下: ![menuconfig](figures/mcfg_txpoll_rxint.jpg) -上图所示,对于 UART1 的配置为关闭DMA RX 和 DMA TX,且发送和接收缓存区大小设置为1024字节。并且设置 `UART1 TX buffer size`为0。 +上图所示,对于 UART1 的配置为关闭 DMA RX 和 DMA TX,且发送和接收缓存区大小设置为 1024 字节。并且设置 `UART1 TX buffer size` 为 0。 由此用户在应用层对串口的接收和发送的操作模式进行配置时,发送只能使用阻塞模式,接收可以使用阻塞和非阻塞模式。串口控制台默认使用这样的配置模式,且操作模式为阻塞发送和非阻塞接收。 @@ -289,7 +295,7 @@ RT-Thread 提供的默认串口配置如下,即 RT-Thread 系统中默认每 ``` > [!NOTE] -> 注:虽然默认串口配置设置了rx_bufsz和tx_bufsz的大小,但是其缓冲区具体长度会在底层驱动初始化时再次配置,这里无需关心其值。 +> 注:虽然默认串口配置设置了 rx_bufsz 和 tx_bufsz 的大小,但是其缓冲区具体长度会在底层驱动初始化时再次配置,这里无需关心其值。 若实际使用串口的配置参数与默认配置参数不符,则用户可以通过应用代码进行修改。修改串口配置参数,如波特率、数据位、校验位、缓冲区接收 buffsize、停止位等的示例程序如下: @@ -302,11 +308,11 @@ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置 serial = rt_device_find(SAMPLE_UART_NAME); /* step2:修改串口配置参数 */ -config.baud_rate = BAUD_RATE_9600; //修改波特率为 9600 -config.data_bits = DATA_BITS_8; //数据位 8 -config.stop_bits = STOP_BITS_1; //停止位 1 -config.rx_bufsz = 128; //修改缓冲区 rx buff size 为 128 -config.parity = PARITY_NONE; //无奇偶校验位 +config.baud_rate = BAUD_RATE_9600; // 修改波特率为 9600 +config.data_bits = DATA_BITS_8; // 数据位 8 +config.stop_bits = STOP_BITS_1; // 停止位 1 +config.rx_bufsz = 128; // 修改缓冲区 rx buff size 为 128 +config.parity = PARITY_NONE; // 无奇偶校验位 /* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */ rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); @@ -487,7 +493,7 @@ rt_err_t rt_device_close(rt_device_t dev); ## 新旧版本串口使用区别 -* 使用 `rt_devide_open()`的入参 `oflags` 区别: +* 使用 `rt_devide_open()` 的入参 `oflags` 区别: ```c // 旧版本 oflags 的参数取值 @@ -495,7 +501,7 @@ rt_err_t rt_device_close(rt_device_t dev); RT_DEVICE_FLAG_INT_TX RT_DEVICE_FLAG_DMA_RX RT_DEVICE_FLAG_DMA_TX - + // 新版本 oflags 的参数取值 RT_DEVICE_FLAG_RX_NON_BLOCKING RT_DEVICE_FLAG_RX_BLOCKING @@ -508,21 +514,20 @@ rt_err_t rt_device_close(rt_device_t dev); * 缓冲区宏定义区别 旧版本接收缓冲区统一为 `RT_SERIAL_RB_BUFSZ` ,旧版本没有发送缓冲区的设置。 - + 新版本缓冲区进行了分离接收和发送,并且也可以对各个串口进行单独设置,例如: - + ```c - // 设置 串口2 的发送缓冲区为256字节,接收缓冲区为1024字节,见rtconfig.h + // 设置 串口 2 的发送缓冲区为 256 字节,接收缓冲区为 1024 字节,见 rtconfig.h #define BSP_UART2_RX_BUFSIZE 256 #define BSP_UART2_TX_BUFSIZE 1024 ``` - - **当从新版本往旧版本进行迁移时,如果使用了`RT_SERIAL_RB_BUFSZ`,那么需要将本参数更改为对应的串口的具体的宏定义** + **当从新版本往旧版本进行迁移时,如果使用了`RT_SERIAL_RB_BUFSZ`,那么需要将本参数更改为对应的串口的具体的宏定义** -* 串口配置`serial_configure` 成员变量 ` bufsz` 的区别: +* 串口配置 `serial_configure` 成员变量 `bufsz` 的区别: - 旧版本的`bufsz`指代串口接收缓冲区的大小,新版本由于需要分别设置发送和接收缓冲区,因此成员变量调整为 `rx_bufsz` 和 `tx_bufsz`。 + 旧版本的 `bufsz` 指代串口接收缓冲区的大小,新版本由于需要分别设置发送和接收缓冲区,因此成员变量调整为 `rx_bufsz` 和 `tx_bufsz`。 ```c // 旧版本 @@ -555,37 +560,34 @@ rt_err_t rt_device_close(rt_device_t dev); }; ``` - - - ## 串口设备使用示例 ### 非阻塞接收和阻塞发送模式 当串口接收到一批数据后会调用接收回调函数,接收回调函数会把此时缓冲区的数据大小通过消息队列发送给等待的数据处理线程。线程获取到消息后被激活,并读取数据。 -此例程以开启了DMA发送和接收模式为例,一般情况下 DMA 接收模式会结合 DMA 接收半完成中断、完成中断和串口空闲中断完成数据接收。 +此例程以开启了 DMA 发送和接收模式为例,一般情况下 DMA 接收模式会结合 DMA 接收半完成中断、完成中断和串口空闲中断完成数据接收。 * 此示例代码不局限于特定的 BSP,根据 BSP 注册的串口设备,修改示例代码宏定义 SAMPLE_UART_NAME 对应的串口设备名称即可运行。 运行序列图如下图所示: -![串口DMA接收及轮询发送序列图](figures/uart-dma.png) +![串口 DMA 接收及轮询发送序列图](figures/uart-dma.png) ```c /* - * 程序清单:这是一个串口设备 开启DMA模式后使用例程 + * 程序清单:这是一个串口设备 开启 DMA 模式后使用例程 * 例程导出了 uart_dma_sample 命令到控制终端 * 命令调用格式:uart_dma_sample uart1 * 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备 - * 程序功能:通过串口输出字符串"hello RT-Thread!",并通过串口输出接收到的数据,然后打印接收到的数据。 + * 程序功能:通过串口输出字符串 "hello RT-Thread!",并通过串口输出接收到的数据,然后打印接收到的数据。 */ #include #define SAMPLE_UART_NAME "uart1" /* 串口设备名称 */ -/* 串口接收消息结构*/ +/* 串口接收消息结构 */ struct rx_msg { rt_device_t dev; @@ -605,7 +607,7 @@ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) msg.size = size; result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); - if ( result == -RT_EFULL) + if (result == -RT_EFULL) { /* 消息队列满 */ rt_kprintf("message queue full!\n"); @@ -623,11 +625,11 @@ static void serial_thread_entry(void *parameter) while (1) { rt_memset(&msg, 0, sizeof(msg)); - /* 从消息队列中读取消息*/ + /* 从消息队列中读取消息 */ result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (result == RT_EOK) { - /* 从串口读取数据*/ + /* 从串口读取数据 */ rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); rx_buffer[rx_length] = '\0'; /* 通过串口设备 serial 输出读取到的消息 */ @@ -668,7 +670,7 @@ static int uart_dma_sample(int argc, char *argv[]) sizeof(struct rx_msg), /* 一条消息的最大长度 */ sizeof(msg_pool), /* 存放消息的缓冲区大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ - + /* 以 DMA 接收及轮询发送方式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); /* 设置接收回调函数 */ -- Gitee From 7fb16690b0b7c765b5934bf52af957cb9b4d9b8e Mon Sep 17 00:00:00 2001 From: chenjh Date: Fri, 25 Jun 2021 13:52:20 +0800 Subject: [PATCH 3/3] =?UTF-8?q?[=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3]=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=B2=E5=8F=A3v2=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E5=9C=B0=E5=9D=80=E4=B8=BA=E7=9B=B8=E5=AF=B9?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programming-manual/device/uart/uart_v2/uart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md index e8e8b35..7dce8ba 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart.md @@ -4,7 +4,7 @@ > 注:目前只有 github 的 master 分支上的 stm32l475-pandora 的 BSP 进行了串口 V2 版本的适配。 > [!NOTE] -> 注:如果用户已经清楚了解[旧版本的串口框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart),那么可直接跳过该文档的前部分关于串口介绍的内容,从[访问串口设备](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart?id=%e8%ae%bf%e9%97%ae%e4%b8%b2%e5%8f%a3%e8%ae%be%e5%a4%87)章节开始查阅即可。 +> 注:如果用户已经清楚了解[旧版本的串口框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart),那么可直接跳过该文档的前部分关于串口介绍的内容,从[访问串口设备](uart?id=%e8%ae%bf%e9%97%ae%e4%b8%b2%e5%8f%a3%e8%ae%be%e5%a4%87)章节开始查阅即可。 ## UART 简介 -- Gitee