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

STM32CUBEMX开发GD32F303(9)----USART通过DMA收发

[复制链接]
STMCU小助手 发布时间:2022-8-18 16:36
硬件准备& V, J. W6 x8 O
这里准备了GD32303C_START开发板进行验证。; |4 e$ S" j7 B7 p* U* I
3 I8 n9 K" |. @  c. X+ C
a15305ac91d945bda69c446903f697d6.png
1 y) l: O7 p" H" ]$ p
8 }% C4 q. S  y6 f& o' \STM32CUBEMX配置
5 s$ b: k6 Z, \2 J) H8 `
" X, d* ]$ i1 ^: `- w' V: s. o
c4fe16c2aaea45119a5daa062b968954.png
' S7 w- d" T) O* Q$ o# h' B2 J, a% E$ ~. E9 o2 v& y
勾选中断。2 \8 n3 \% H# S3 B/ r- }  X
66c760617d39456885a04b819ec756e5.png
; A4 N' L: Q( ^1 Y# ]" ^% r' `
: ]! G1 o1 c; v6 a, U1 }开启DMA读取和接收。, |6 r1 }* r/ B/ ^
其中Word = 32bit,Half word = 16bit,Byte = 8bit
& n: y3 `9 g/ W. t4 I% u7 ]$ L% f( E7 B4 c! A3 [& X, ~
864b494047f44d9c99056600e8a4ccfa.png
' E! {- J( ]3 R. n' s/ G0 C1 r0 S4 u- c
56358fb491734df498392b9e93ba9366.png
4 `. }( b! Z7 T% M7 n5 z( e+ b3 R1 S, E
keil配置5 {4 g4 B% D3 ~4 f
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。
' h2 t9 |% H6 I+ C6 G" f& K1 l( h) t8 P3 w
04d2a6fc929b48698acad08f27bf4dcb.png % {& b: _9 Y( ^

4 F9 Y; m! M& a) X) V2 ~) F- x$ z. Q串口重定向1 d) A7 ~6 @! ]; M3 c
在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。/ _. ?* H+ U" d9 G2 \# E$ Z, U1 e& h

# y8 @% d+ j# q) }. B
  1. /* USER CODE BEGIN Includes */, R. r' p( w5 K4 w# y
  2. #include "stdio.h"
    : {" _$ F% d; h) E
  3. /* USER CODE END Includes */
复制代码

, s+ y7 H/ A, J  c函数声明和串口重定向:
2 g2 u% ]7 Y2 |. P5 |7 [& @
; c5 c6 q  \# i& ], w5 w$ S. Y  `* P
  1. /* USER CODE BEGIN PFP */' K/ U/ d: w' x" C- Z
  2. #ifdef __GNUC__                                                                        //串口重定向4 g+ Y+ w4 u6 ^) g( o" I6 M/ L
  3. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch): C3 {9 e8 @$ p) W% ]
  4. #else+ a5 o5 f% J( _6 ]( @9 J/ f7 }
  5. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f): O. F: Z) e6 i8 n
  6. #endif & s9 I+ }& a: m) B' c
  7. PUTCHAR_PROTOTYPE( T7 x! b) H; p3 `4 _* K
  8. {
    & z# n2 V! V. K  E# [# L$ [
  9.     HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    4 J0 E: Y! w& \' N& j$ P
  10.     return ch;: Q% O5 O2 h! `5 N
  11. }
    1 u1 y) C) V" X
  12. /* USER CODE END PFP */
复制代码
- s5 {4 _2 v. |
串口接收发送函数
! ^( z3 G$ C. A; q一般情况下,串口接收发送函数有如下所示。
  ^' s% A8 L7 a4 b6 E; z' `" m● HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。
: k) ?$ v( b5 N● HAL_UART_Receive();串口轮询模式发送,使用超时管理机制。% T  D: k2 Y) Q/ U1 W+ G, Y
● HAL_UART_Transmit_IT();串口中断模式发送
+ [7 z0 I. Q" B+ Y3 I, H/ x● HAL_UART_Receive_IT();串口中断模式接收( u5 t' f- k$ V0 W5 T
● HAL_UART_Transmit_DMA();串口DMA模式发送3 T6 c* L9 A( @: C( I  d; o
● HAL_UART_Receive_DMA();串口DMA模式接收
: F/ z6 Z/ Z+ D. X5 h
" w# Z* P4 U* ^! {$ {HAL_UART_Transmit_DMA()发送
/ r$ K5 }6 d& u测试代码如下。  L) V' J- k$ L' ^( N8 G5 H
定义需要发送的数据。
, Q" _# ^& e8 Q$ S" t) A4 @
) z; t7 @% d; T" N% \( G+ C) H
  1. /* USER CODE BEGIN PV */
    . b( S7 V) |) z# B! [
  2. uint8_t TxData[] = "\r\n**** Hello,World!' ***\r\n";; I- ^5 U" I0 }) A. \1 x6 O
  3. /* USER CODE END PV */
复制代码
# e5 C' _, E- B5 B' ]% f
HAL_UART_Transmit_DMA()发送代码。, [  j, I8 I8 q5 C0 q
& t2 }" s5 e  B, P1 c" N. x& m7 l8 N2 C
  1. /* USER CODE BEGIN WHILE */
    ! D# P! a" u- V& c) [1 r
  2.   while (1)
    ! t7 {" }; ]1 {3 C
  3.   {
    3 u( b. a" t, h$ t. I) N
  4.     /* USER CODE END WHILE */
    ! z; O) P+ r) t+ Q0 I

  5. + C. [( a% P3 j9 ]  r3 o& N3 Q4 n
  6.     /* USER CODE BEGIN 3 */
    5 E" z5 y  R, x$ N# X& |
  7.           HAL_UART_Transmit_DMA(&huart1, (uint8_t *)TxData, sizeof(TxData)-1);
    + b: r; ?% ~$ R+ H
  8.              HAL_Delay(1000);0 I$ k* _' V* i; t) M8 E' V4 ~
  9.   }' N0 W7 n# R( x, S) [! H* ?4 Q+ S+ m7 T
  10.   /* USER CODE END 3 */
复制代码
7 [' H9 N9 U: J
DMA有normal和circular两种模式。; I9 q6 @1 n7 x# ~# E! c2 F
Normal表单次传输,传输一次后终止传输,所以需要传输几次就需要开启几次,Circular表示循环传输,传输完成后又重新开始继续传输,开启一次后会一直传输。
& o& }0 S- @3 E3 W  D( G3 ^- ~normal传输打印如下所示,传输完成就关闭。
, t& o, ]. N, {% h( u% E& s7 x( D7 j$ [! W- e0 v  s+ d  U
fb228f6ecba64d6f90617c07efe2872d.png
! x* e; A& F4 w8 r% V/ k. r
: Z. h9 @" t0 }! e1 Hcircular传输打印如下所示,一直传输,不会停止。* p1 a5 D6 W' S8 R( O& P! o" e- G
; p' B. }2 ^1 l
80dbd493fcd94618a4da7d5cf3682092.png
+ g! C+ t) o9 W( D
; o' [+ E) I% L; h7 n- D3 |/ ^* oHAL_UART_Receive_DMA()发送, z" A5 l+ C7 {8 T: e
测试代码如下。
3 Q. i! Y- P+ c6 r定义需要接受存放数组。6 V2 ?0 j6 X+ T7 Y' d& ^! w
- v" m$ L6 g) a3 `2 ?9 ]
  1. /* USER CODE BEGIN PV */' F! d: y8 w% A+ f* R: N
  2. uint8_t RxData[255];
    % K5 T1 W/ `2 O6 @3 x. q4 {
  3. /* USER CODE END PV */
复制代码
3 r6 E" }4 H. A
开启HAL_UART_Receive_DMA()接受代码。6 j9 a9 Y9 ^, K
# m, h* z2 [! K% [9 v
  1.   /* USER CODE BEGIN 2 */# G- {% }$ A; y1 E5 P! i
  2.   HAL_UART_Receive_DMA(&huart1, RxData, 10);    // 这里加这个函数,接收数据
    & e' B6 M- j# {" g
  3.   /* USER CODE END 2 */
复制代码
  j1 y( {/ b, x& s
重写读取回调函数,将接受的数据发送出去在开启接收。( t* w3 a6 l# r; @
! S4 l  h" J! w# G9 G6 O7 Y
  1. /* USER CODE BEGIN 4 */6 d8 Q% _, C( U
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart). g5 U" y% ~$ d. w' P: c. P
  3. {+ E! U' h% _- k) D$ Q1 s

  4. 5 i1 ?0 T9 a3 r& X# Z1 y
  5.         HAL_UART_Transmit(&huart1, (uint8_t *)"text:", 5,0xffff);//轮询发送,不然可能发送不出去
    9 ^. i% Z8 i: W; `
  6.         HAL_UART_Transmit_DMA(&huart1, (uint8_t *)RxData, 10);//发送接受的数据% r9 S& A7 d' A7 |' ?
  7.     HAL_UART_Receive_DMA(&huart1, RxData, 10);    // 这里加这个函数,接收数据
    8 ~+ `- g, H: y! o
  8. }
    ' Y$ f( [. t8 }1 H! {* D
  9. % r: C$ m1 D8 F7 n
  10. /* USER CODE END 4 */
复制代码
. T" w" f6 C$ {0 U1 c# t
DMA有normal和circular两种模式。
% ?  ^9 @' {% Y. W/ U' GNormal表单次接收,接收一次后终止接收,所以需要接收几次就需要开启几次,Circular表示循环接收,接收完成后又重新头开始继续接收,开启一次后会一直接收。
) X' J) O& t$ Q# Y& Nnormal传输打印如下所示,传输完成就关闭。  K( T& H' X& f" ^( Q
演示效果如下所示。
3 R0 F1 v+ K% c, B( {8 {& x( Z0 m$ Y- t+ \
49419994c7704c11b33e5c0417b2105e.png
: e1 d( K8 ^8 k% [' e8 J& X
2 x+ K4 A! A  V6 R+ ^circular接收打印如下所示,当发送数据大于接收长度时候,会进行循环接收。
4 y+ U. A, \3 t# i, ]6 \6 T" @
2 D3 \. X  U. a, x6 C3 d- t9 O1 o2 J 6224d58f09e74706b743b505d8d7d193.png
- J: U) G5 f1 _( F" q  S% }9 z, x0 j7 }! L

- x. m' e9 [$ H7 Z- x- ~
赞 收藏 评论0 发布时间:2022-8-18 16:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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