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

STM32CUBEMX开发GD32F303----USART收发配置

[复制链接]
STMCU小助手 发布时间:2022-9-5 22:31
硬件准备
4 E8 N! `+ q! s' q& O这里准备了GD32303C_START开发板进行验证。
- k/ s! ~+ p3 v7 _( W3 {3 l# W( Y0 L2 N5 m3 B" `
a15305ac91d945bda69c446903f697d6.png
: h" t0 s# ^. f9 U/ _2 K" w& z0 _, |6 B- A$ l6 J3 D6 L
STM32CUBEMX配置# V8 W8 K& N* P* S# m6 @

* @! a$ \/ i# R. C) s& R% [ c4fe16c2aaea45119a5daa062b968954.png
: h/ u6 U# k- l$ _5 J1 Y0 m- q5 B+ ^8 {; k: m; A- L
勾选中断。
: S' x1 n1 O# c' J7 f
  Q" q2 q% A4 C6 H 66c760617d39456885a04b819ec756e5.png
+ ?6 `8 I6 ?: g5 w% X* _ 56358fb491734df498392b9e93ba9366.png $ L( X. j. a( C8 B4 J4 y; C
/ P. _; x2 N+ n$ v
6 w! M( o* K5 V' A3 \6 p
keil配置6 Y- Z3 ~$ O6 Z# [7 r
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。
  o7 f1 a; i: q) _( d' X- p1 T$ X6 `) X
04d2a6fc929b48698acad08f27bf4dcb.png
- V: b% M7 _( ~) N) M; [* g/ e7 V4 @
( q/ ?& s! z* U& u串口接收发送函数' A' v1 F! S" X
一般情况下,串口接收发送函数有如下所示。
* e; ]% u+ V* ]5 U) Z+ T● HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。
# h; C1 H( i" _0 k# i1 N/ h● HAL_UART_Receive();串口轮询模式发送,使用超时管理机制。
4 m% G! Y8 Z5 h8 u# |8 g● HAL_UART_Transmit_IT();串口中断模式发送' m1 c% b2 ]' x  Z
● HAL_UART_Receive_IT();串口中断模式接收
: B" B8 I2 b" a4 e: X: w/ s: C9 H8 r7 A- @● HAL_UART_Transmit_DMA();串口DMA模式发送
. k8 J4 i& _. D, P$ p● HAL_UART_Receive_DMA();串口DMA模式接收
- X4 O# D% M3 t; o# B& ]3 z1 F
  u, @! l7 \- h( RHAL_UART_Transmit()发送  t. f8 ^% K$ o  x: a
通过轮询,将数据发送出去。
  1. 4 k. Z1 ~' }! s6 Y: F( e$ \
  2.           uint8_t buffer1[10]="0123456789";
    7 n& A+ H: Q! X( ]
  3.           HAL_UART_Transmit(&huart1, buffer1, 10,0xFFFF);//把buffer1的内容通过uart1发送出去,长度为10,timeout的时间是0xffff
复制代码
# n" F: O& Z) N3 G, I. l+ {- ~
演示结果如下所示。
, N4 o+ ?; W$ H; K5 Y8 b# o3 j2 ?! U5 q8 r$ E. L
6d71f17a5b7347618b749d8e07054e4c.png
0 y2 z8 ~1 S8 M- z! e3 Y! [' e2 \9 f( T
HAL_UART_Transmit_IT()发送3 T" F7 B. Z4 B  x
通过中断模式发送,这个模式下需要开启串口中断,否则无法发出数据。: [( d( S2 G$ \

/ l, L- |# L+ W
  1.           /***********方法1********************/
    2 g7 M# ?$ v( q; J* `" h
  2.           uint8_t buffer2[10]="9876543210";. x# c% Z0 q, d6 R) [/ i% g" c, Y
  3.           HAL_UART_Transmit_IT(&huart1, buffer2, 10);//把buffer1的内容通过uart2发送出去,长度为10,% ?( ]- [0 I: H+ P2 @, \( C$ ^5 L
  4.           while(huart1.gState != HAL_UART_STATE_READY);
    & C6 l' J$ T- w% Y6 d7 m

  5. " r3 }9 k6 a$ j7 G. c$ _

  6. * v: K# B( N5 A% O% z
  7.           /***********方法2********************/
    . a5 N6 E- Y9 Q, q. T2 s
  8. //          uint8_t buffer2[10]="9876543210";5 D  o0 R+ D6 E+ `( t% W  c6 S
  9. //          HAL_UART_Transmit_IT(&huart1, buffer1, 10);//把buffer1的内容通过uart2发送出去,长度为10,
    3 S( M0 P8 a$ l6 U
  10. //          while(HAL_UART_Transmit_IT(&huart1, buffer2, 10) != HAL_OK);
复制代码
5 h, \' s7 F; E3 M! ?7 e
上述代码中,可以不使用while进行等待也可以发送,但是需要注意不能未发送完毕又重新发送。
0 P' X, i5 x3 b) ^! z. L5 c7 T. v演示结果如下所示。6 E4 I, W& t( m' J# _
2 x6 v! h2 j& ^& X5 z6 A# b' W
4708a3c748c24853bfb3ce5019f2df75.png / M; F) O$ K& Q7 v- M$ H
' c5 o& m2 n! M/ M4 B+ t6 ?
HAL_UART_Transmit()和HAL_UART_Transmit_IT()对比! v4 y8 h2 j& L
若HAL_UART_Transmit_IT()不使用while进行等待,他的波形图如下所示。# ?9 F% C* e3 c2 k6 M, X/ A
黄色线为波形,红色线为发送后的电平翻转。, ]( j8 ?# e- E  V' E3 M8 y# S5 w% s

) W& b, W9 x9 J2 G4 b6 \+ F$ _ 05bbfeabf4c344c590d39396f6af01f2.png * X( T  _) ?9 A9 F% I- V! `% v2 T
, V; P6 b/ K; D
HAL_UART_Transmit()发送如下所示。
9 m" M- E( m, w: H3 h9 ~
" T. c# t6 c2 S8 A fecc89c14c6148839f2ca8ad22693ddb.png
' H* Z) Z$ U0 k+ s+ i7 `* g; y* E' V0 Z$ G3 U. j
可以看到,HAL_UART_Transmit()发送必须要等待发送完毕才可以接着往下执行。
0 E+ {: D8 l! m" q  z6 S# CHAL_UART_Transmit_IT()为中断发送,可以在发送数据时候执行其他指令。- V2 q0 b0 T5 J

) U+ g5 ^/ \. V! p- Y) F( p% {' ?HAL_UART_Receive()接收7 K; H4 R0 r( _
串口轮询模式接收,使用超时管理机制。' y: s& p! J$ ]
例如接收一个10个数据。& a( V# }0 s6 w: p) d$ v6 g% u" `7 L& z
, B+ v* k. Y6 A4 K: N
  1.           uint8_t rxdata1[10]={0,0,0,0,0,0,0,0,0,0};
    & e: t4 w0 ~" M+ U# b1 i2 e
  2.       /* 判断是否接收成功 */
    4 [, F9 M% P" U, k4 Y. Z
  3.       if(HAL_UART_Receive(&huart1, rxdata1, 10, 10000) == HAL_OK)2 M( {, h1 b' L# ?3 }# T" p
  4.       {
    ; ]" z; D4 g# u! s+ p
  5.           /* 将接收成功的数据通过串口发出来 */
    9 c. ~0 Q: d/ \
  6.           HAL_UART_Transmit(&huart1,rxdata1, 10, 0xffff);, O2 ?6 p/ `, p
  7.       }
复制代码
3 @9 l* R( Y9 g6 ?# q- ]
测试结果如下所示。
4 @1 h5 H; }9 C% @0 K
" [6 I+ W7 d1 u1 \' q+ w$ t4 ^ 9d1ca632d474421ea0884170e5697943.png / _8 ?0 ^) i$ S* k

) R: `3 C* q; ^3 H+ Y4 Q) VHAL_UART_Receive_IT()接收" ^7 t% ]+ C+ b' P6 g
串口中断模式接收,这样就可以不需要等待,单片机在没有数据接收时候可以进行其他工作。
1 x. a! p4 |4 j& v例如接收一个10个数据。
* k! R# n! _1 o定义接收数组。+ v. C' y3 O/ q9 |4 v

% i# J5 ^7 F" [$ \: C$ z5 @
  1. /* USER CODE BEGIN PV */& [! l% c# Z# ?% r
  2.   uint8_t Rx_Data[10]={0,0,0,0,0,0,0,0,0,0};/ u) b9 y. Y' K2 i
  3. /* USER CODE END PV */
复制代码

3 p, ^9 |; |& ?; Y1 a7 J0 i+ g开启接收中断。) L6 {" r- a% P5 X0 I
. {( H& ]* B+ U& [+ W6 P( V# d& H; k
  1.   /* USER CODE BEGIN 2 */8 f# U4 I' s7 Z: l+ k: W. M( v
  2.   HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_Data, 10); //开启接收中断,接收10个数据到Rx_Data
    5 j6 n! v6 f! t' Y5 r4 y
  3.   /* USER CODE END 2 */
复制代码
2 k& L* W/ X  ]: ~' F. O+ P
读取回调函数。
% ]; a$ j% J, g0 S: ]* ?6 K. u4 O  d' o+ q8 A3 D& g$ H3 j# n
  1. /* USER CODE BEGIN 4 */
    9 b; x6 C  r( N3 F. M! @# D" j6 E
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart). I( G7 G& W9 N5 w# ~/ D6 r
  3. {9 [' P- e: g5 v9 J* Q% p3 M
  4.         /* 将接收成功的数据通过串口发出*/
    , u' A' b& \0 a. D4 t# l: q. h
  5.         HAL_UART_Transmit(&huart1,Rx_Data, 10, 0xffff);
    . ?' l5 k* _' X# S) U% m
  6.         HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_Data, 10); //重新开启,接收10个数据到Rx_Data
    " r3 a- t: M# j
  7. 4 H3 [( K5 \3 R' t' j% c5 o
  8. }
    7 ]2 @/ u9 ~% e2 V) B, Q) c+ G
  9. /* USER CODE END 4 */
复制代码

6 T/ L3 v- P4 Q5 }0 [测试结果如下。
+ g  s6 t' v( R" V# }6 {; c& y! w. ?0 f! d4 B3 G
2f61adf7d6114399959fe3a04cf62aa3.png
, S' D3 h4 G& [: n6 h* I; N
9 v# j; j# S2 b9 q5 E, T) JHAL_UART_Receive_IT和HAL_UART_Receive的区别就是:中断接收是有数据到了才去读;直接接收是直接读取,如果超时就返回% G. B3 m! m2 y9 y! q# }( g
————————————————; E- x) {( A% b8 D9 A6 Q
版权声明:记帖
* c2 E5 F, ]5 G( `2 I! A- {4 v0 a- L1 K( I" L( q) ?

$ l) x& m4 O2 \' [0 [
赞 收藏 评论0 发布时间:2022-9-5 22:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版