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

STM32CUBEMX开发GD32F303(8)----USART收发配置

[复制链接]
STMCU小助手 发布时间:2022-8-18 16:56
硬件准备- a7 {/ ]3 e) }, L# K  p
这里准备了GD32303C_START开发板进行验证。
  j% V1 ^' }+ c3 w4 j' F6 B" J* \2 ~2 H* h( z# R
a15305ac91d945bda69c446903f697d6.png
7 h" t$ d+ ]% A! i0 q+ n% h3 l3 U* K& ~
STM32CUBEMX配置6 w# W& c' \" s' ?
, B( R- q% w2 J8 e+ N4 q
c4fe16c2aaea45119a5daa062b968954.png 0 Y! n( u- O9 G2 z! {

# V, z4 n7 N: e勾选中断。+ a% G+ `, ?  _8 ?
/ n3 u6 e: I! x) c$ X% i
66c760617d39456885a04b819ec756e5.png
, v9 l: ?/ I5 f5 D) g) ]
% U" ^+ o' n( U' C. w 56358fb491734df498392b9e93ba9366.png
: c& ?! L. Y" ^4 L9 B4 \. n
! p, J7 f! W8 _+ |; X2 K, lkeil配置$ M- B5 t5 i. r. g* C) K+ i1 d
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。
8 z8 L" Z; t* H$ d( K* x# N8 @
2 v3 l7 h- p0 M. I0 S8 j 04d2a6fc929b48698acad08f27bf4dcb.png
( ?# H  `. r) f9 S
5 H" q+ o" }- b: L. A串口接收发送函数
& V6 p$ F$ I9 a& f一般情况下,串口接收发送函数有如下所示。
8 J; G% H: R0 ?9 G  C: \8 S& F● HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。
) y5 X3 P2 X% T2 v% `● HAL_UART_Receive();串口轮询模式发送,使用超时管理机制。
6 k5 [- ^. @, ?! d4 \● HAL_UART_Transmit_IT();串口中断模式发送0 i) F, {" J+ K' L1 W" J
● HAL_UART_Receive_IT();串口中断模式接收
( t- G- B( ~! S3 \" E9 D  N$ e% R● HAL_UART_Transmit_DMA();串口DMA模式发送
4 c/ e5 x! K1 F5 Q0 G4 v4 G( G● HAL_UART_Receive_DMA();串口DMA模式接收$ S6 @. a8 S6 d5 K7 d' E" u
% F9 J: K7 f' a  k
HAL_UART_Transmit()发送$ Z- s0 r- i6 s+ q, b. s$ ~, `
通过轮询,将数据发送出去。

  1. ' J8 [: W- {8 p1 m' \0 ?1 ?0 [
  2.           uint8_t buffer1[10]="0123456789";
    , k8 H; w  a" Y, L2 U
  3.           HAL_UART_Transmit(&huart1, buffer1, 10,0xFFFF);//把buffer1的内容通过uart1发送出去,长度为10,timeout的时间是0xffff
复制代码

; u! V$ N" N* |% ~, w+ c* B4 S演示结果如下所示。
0 r$ h4 K1 b+ e  _
2 Y" L2 W0 A5 c/ z4 p 6d71f17a5b7347618b749d8e07054e4c.png 1 j0 |8 u! H9 H" t0 {+ t+ z
9 o- a9 X& u% c  c
HAL_UART_Transmit_IT()发送

# `) a. s* p6 x  X) m( C通过中断模式发送,这个模式下需要开启串口中断,否则无法发出数据。  Z0 V" v; _& O% ]: O

1 j; H! |* X) V
  1.           /***********方法1********************// M- j' q3 K& d4 P+ V$ H
  2.           uint8_t buffer2[10]="9876543210";
    6 s+ r1 U/ F6 p' B
  3.           HAL_UART_Transmit_IT(&huart1, buffer2, 10);//把buffer1的内容通过uart2发送出去,长度为10,
      l& o6 Y# Z& S, ?; m# d* n
  4.           while(huart1.gState != HAL_UART_STATE_READY);  r+ N( d, ], U3 [" _; J

  5. 2 {7 p9 h+ Y' x! Y+ J4 Q

  6. ! v& ~5 @: [: r; `4 Z
  7.           /***********方法2********************/# }, T  h. j$ S# Q& s: n+ Y2 n7 r
  8. //          uint8_t buffer2[10]="9876543210";
    / {$ _! D) @! j# l1 x' k2 O& _
  9. //          HAL_UART_Transmit_IT(&huart1, buffer1, 10);//把buffer1的内容通过uart2发送出去,长度为10,! ?: |8 G" _  f) v
  10. //          while(HAL_UART_Transmit_IT(&huart1, buffer2, 10) != HAL_OK);
复制代码
! N  Z2 V% x: @; L! E' W
上述代码中,可以不使用while进行等待也可以发送,但是需要注意不能未发送完毕又重新发送。
) A4 J  }% v5 C2 i" b. A演示结果如下所示。
7 u- C! R1 t4 a4 S* u
6 z# M# f6 M: f# E& O/ S 4708a3c748c24853bfb3ce5019f2df75.png
: ?& Z* H0 j# g8 V4 S1 O2 {6 Q6 D, R) T
HAL_UART_Transmit()和HAL_UART_Transmit_IT()对比
: o& I% A" w2 V2 f0 A  m/ |: t8 l1 h若HAL_UART_Transmit_IT()不使用while进行等待,他的波形图如下所示。
: f7 w. O8 Y* _: T) b黄色线为波形,红色线为发送后的电平翻转。' Q7 @- n- V" n) @
05bbfeabf4c344c590d39396f6af01f2.png 7 d* }# S& t+ G! ~; `# Z0 |# Z" i

* f0 Z) W% [2 B8 v* C( pHAL_UART_Transmit()发送如下所示。
' J" N. D' d# _8 E  |
$ U2 R- M3 i# s+ y3 q fecc89c14c6148839f2ca8ad22693ddb.png 4 v) |8 B) f, `

/ \4 L  O) u8 |6 s7 B; k可以看到,HAL_UART_Transmit()发送必须要等待发送完毕才可以接着往下执行。, I9 i" ]5 }. Q! q7 j
HAL_UART_Transmit_IT()为中断发送,可以在发送数据时候执行其他指令。  A) x) y) o; Q' A0 B' f% G
' v% B: p& B; s" E/ Z
HAL_UART_Receive()接收! B8 U  Q3 @# i$ G
串口轮询模式接收,使用超时管理机制。( a" ?$ K- [) K
例如接收一个10个数据。7 n( T3 j; {8 s

; {2 v$ m4 e* A
  1.           uint8_t rxdata1[10]={0,0,0,0,0,0,0,0,0,0};8 o4 v1 c) y% Z6 L
  2.       /* 判断是否接收成功 */" @$ _9 ~* _4 e' `7 Z. ?* q
  3.       if(HAL_UART_Receive(&huart1, rxdata1, 10, 10000) == HAL_OK). D$ ^6 C5 a5 d
  4.       {
    9 Y" G# u: b# p! p
  5.           /* 将接收成功的数据通过串口发出来 */2 L) T$ N& u8 `+ {& l: I
  6.           HAL_UART_Transmit(&huart1,rxdata1, 10, 0xffff);
    ; j# I/ ^6 B: y- i
  7.       }
复制代码

6 K$ U7 V( o. B2 \! J6 P3 E测试结果如下所示。  o+ a, [$ w+ U
" b/ {& u9 O- |: |) V4 Y2 L& j
2f61adf7d6114399959fe3a04cf62aa3.png
6 U7 {' Y) g) n# C  j, Q. j
( f7 T# M! q3 z, Y' u2 T( k- q2 g! jHAL_UART_Receive_IT()接收4 ]8 N# G; |  d+ y* W2 f8 o8 S1 [: j3 t
串口中断模式接收,这样就可以不需要等待,单片机在没有数据接收时候可以进行其他工作。
) {( F7 k- k* \' h: t& s例如接收一个10个数据。( b3 [4 E% w* |! _' n, W
定义接收数组。  J; f1 c8 O, B* h2 d

) t9 {3 [5 P* C  b$ y; p/ x. D
  1. /* USER CODE BEGIN PV */% T: t. r: n% J& q0 `6 }( U. o7 f
  2.   uint8_t Rx_Data[10]={0,0,0,0,0,0,0,0,0,0};
    1 A  h/ \& P# T- ?6 K1 k" I( c
  3. /* USER CODE END PV */
复制代码

1 p5 b5 y+ P4 l9 W  n开启接收中断。$ ^$ ?) @9 ]# O; \

% X. v7 P7 i, t1 H; |& a1 {$ L
  1.   /* USER CODE BEGIN 2 */
      R) _! y; j4 D. R3 b
  2.   HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_Data, 10); //开启接收中断,接收10个数据到Rx_Data! P3 K1 L' x9 z6 j) v8 v. F
  3.   /* USER CODE END 2 */
复制代码
' L8 D5 S* z& c" e: \3 E
读取回调函数。
% l# x3 R" b+ ]% B" ~7 o' {' `5 b# {7 N/ ?6 U: K
  1. /* USER CODE BEGIN 4 */2 u  s4 b+ b& y& A
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    & i% K! z, E( H# J
  3. {3 o1 L+ F0 L1 }
  4.         /* 将接收成功的数据通过串口发出*/# o* U1 t# I1 b2 Y& L4 E# `
  5.         HAL_UART_Transmit(&huart1,Rx_Data, 10, 0xffff);6 F# f& D- Z5 }
  6.         HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_Data, 10); //重新开启,接收10个数据到Rx_Data
    % q2 J$ x! i7 `. L. y; f* V
  7.   o: |: Q# d5 I" |  Y: P
  8. }! k4 Q2 \9 P6 P8 b. E# ?+ ^  r; ^& q4 M
  9. /* USER CODE END 4 */
复制代码

# ?8 }: }. |8 ^  U% A$ N测试结果如下。1 m" {1 y, y# d$ X3 a1 z4 \% _6 ?

/ G2 P- O( a/ s8 a 9d1ca632d474421ea0884170e5697943.png
1 o( M( I! @  |* {8 G/ o% |6 p, D2 b
% \1 ^9 j- P" |3 F: J8 E, G0 V* P  sHAL_UART_Receive_IT和HAL_UART_Receive的区别就是:中断接收是有数据到了才去读;直接接收是直接读取,如果超时就返回
; m1 e9 v- E- D- d& _' s. V: Y1 F5 Q  b; F5 v! G# m) K( K

" p3 V/ L$ I. k, q. O6 ~3 b
8 ]9 m1 S$ D, [& |! a
赞 收藏 评论0 发布时间:2022-8-18 16:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

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