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

STM32CUBEMX开发GD32F303----USART通过DMA收发

[复制链接]
STMCU小助手 发布时间:2022-9-5 21:50
概述( T3 i$ z5 m( c2 |) M
本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。# h# d8 {; ^3 u/ @
本章主要配置串口进行DMA收发。
) [& ]' L! O: ?0 P/ X/ w需要GD样片的可以加Q_QUN申请:6_15061293。
  t0 V% i, @) u5 f3 t3 s
+ C7 d: t( g8 t3 O5 c" G. i查阅手册可以得知,PA9、PA10为串口0的输出和输入口。* @0 \9 j$ ]+ i* M, U1 I

3 H! a& w  w5 h# _9 b* i% s: ^ e30816bae98d41718bf56a6434cd0b7e.png
* d3 x8 @$ ^) l8 o' J7 G6 M
* K- z* T5 x1 z( S! V6 O8 l硬件准备
" C5 ~0 P' S0 y
这里准备了GD32303C_START开发板进行验证。
$ [0 J; ^" o6 I4 ~. H- S
6 K. Q6 b; I1 p- s1 ] a15305ac91d945bda69c446903f697d6.png
, E& I2 r- U/ n+ a' G8 J5 z% m% Y! ^9 _' b" x1 h
STM32CUBEMX配置
' x  ^, `$ {% a5 H0 ~; \% ?1 R- a$ O% E! e, ^5 x
c4fe16c2aaea45119a5daa062b968954.png 9 d& a0 Q4 [: E" G& [9 H

9 @; m- m8 \& G6 j$ n& u勾选中断。# [4 n& x; T) X+ f
66c760617d39456885a04b819ec756e5.png
* ?) ?" [5 b( u  O6 Y, b6 E6 X. C/ q" J/ N1 v, h9 H5 \+ O% w5 _
开启DMA读取和接收。
3 Y4 E6 ]7 x5 v5 {% u, N0 t) [  F) }其中Word = 32bit,Half word = 16bit,Byte = 8bit: Y: V* d/ H- g1 D
+ N: d& j2 ?" K4 H* H# K5 s
864b494047f44d9c99056600e8a4ccfa.png 5 b  R) F7 H- d: Y. I6 \6 X8 u
& U3 n0 _- q  T/ e) c) W" b* A
56358fb491734df498392b9e93ba9366.png + t; W6 |7 W4 p  W& ]* ?$ [

, G: X7 Q/ e* [8 K2 j
. D$ O3 j& x; d: b8 t0 E) x) M7 ]keil配置
) X5 v& g& [( R# _! e& v" N5 q3 `# y
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。2 y8 i0 |1 I' f2 R. @
0 c9 M8 a+ O- l7 c6 f, a
04d2a6fc929b48698acad08f27bf4dcb.png ) ^# T) f4 }3 B/ L; I! g* D9 ~8 a

) e8 O" O" m2 ]0 s2 Z( Z串口重定向

2 P/ d2 O& a1 N+ V/ x3 i, d在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。
8 c/ J3 V! r" r# s9 p, J5 {* n" T( s; A( L" W$ U' I' V# _$ ?& s3 J
  1. /* USER CODE BEGIN Includes */& x1 ~% Y- r. A5 y
  2. #include "stdio.h"
    " N4 A! N1 {- z* I3 Y$ _6 C
  3. /* USER CODE END Includes */
复制代码
6 ]! g1 [! m& r. ?
函数声明和串口重定向:
$ b1 u2 P1 ?+ p. `3 C5 ]$ g& L
* }  ^$ c1 S9 w9 Y
  1. /* USER CODE BEGIN PFP */( u8 b6 s$ U5 ^- q
  2. #ifdef __GNUC__                                                                        //串口重定向3 T/ J" [8 [$ M( b; u
  3. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    , ^+ q7 ~3 {) ?* m
  4. #else; I+ q$ A$ |& N' p% o. s( q( s( C
  5. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
      t/ ?% p9 U3 M& k* T' C
  6. #endif
    # g! I7 y! d9 |2 B0 ~6 F& v
  7. PUTCHAR_PROTOTYPE8 K0 V8 J1 B, Z, ~, g
  8. {% t' R9 G; y: R, n1 u" }) d
  9.     HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);! z, `0 h0 l- A. A, c6 m8 [( H+ m- [
  10.     return ch;! o/ E0 ^+ }4 ?( C$ e
  11. }
    . `- W$ \; O% \: |4 H6 A" m
  12. /* USER CODE END PFP */
复制代码

7 v; Q% b! A: ?2 n. r6 q串口接收发送函数
0 K* h& v0 G. y! F8 \一般情况下,串口接收发送函数有如下所示。9 K$ i* H: R, S5 Y" @7 X
● HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。3 R5 P5 B6 D" Z% d; T0 P
● HAL_UART_Receive();串口轮询模式发送,使用超时管理机制。. V5 C! H- x, ]$ G/ \3 x0 s* v
● HAL_UART_Transmit_IT();串口中断模式发送
3 O5 u. B$ A6 u& j) d" S: M● HAL_UART_Receive_IT();串口中断模式接收9 {% r, n! `8 ^; z0 F- ~
● HAL_UART_Transmit_DMA();串口DMA模式发送9 C# i0 z3 ]( x
● HAL_UART_Receive_DMA();串口DMA模式接收- m+ ]/ V" g. f% |! k9 _1 e

6 O# j  s: }4 s0 D0 PHAL_UART_Transmit_DMA()发送
% E" P1 H/ j& h1 h测试代码如下。1 m& `" k3 w* v* ~
定义需要发送的数据。+ o1 N# [1 h* T, z# }: t; ]
- X: [6 n8 l+ N. l
  1. /* USER CODE BEGIN PV */2 V' l& j: x3 [$ w2 [( ~% E
  2. uint8_t TxData[] = "\r\n**** Hello,World!' ***\r\n";9 |4 y: ?# w% R$ K: g
  3. /* USER CODE END PV */
复制代码

2 Z6 G9 |) L3 fHAL_UART_Transmit_DMA()发送代码。1 L2 \. W6 Z. N
. B8 j2 p9 }  C, J3 B2 w3 M
  1. /* USER CODE BEGIN WHILE */
    / Q2 W# D- w( i+ y+ L1 K6 h2 Q
  2.   while (1). T, N" ^, L- F/ B! L; h
  3.   {
    9 o& [1 _* m! F9 |9 o% Z  g
  4.     /* USER CODE END WHILE */
    6 k8 n  q1 c% Y% F) |0 }

  5. * H( N3 [% \6 H! _4 V+ I/ j
  6.     /* USER CODE BEGIN 3 */
    * s# H+ k/ }& ?3 s, Q
  7.           HAL_UART_Transmit_DMA(&huart1, (uint8_t *)TxData, sizeof(TxData)-1);" }3 |" r6 F: J( y0 s! n! p
  8.              HAL_Delay(1000);+ A4 W1 \& G5 C; z2 U
  9.   }
    ; S2 M- f4 x$ Q$ p+ {
  10.   /* USER CODE END 3 */
复制代码
6 z# B4 y* \6 t$ s" s; N
DMA有normal和circular两种模式。/ s0 I3 ?- O6 F& h( Q" E
Normal表单次传输,传输一次后终止传输,所以需要传输几次就需要开启几次,Circular表示循环传输,传输完成后又重新开始继续传输,开启一次后会一直传输。  L9 H7 h% j' @8 a9 G# X& k, F
normal传输打印如下所示,传输完成就关闭。7 }4 U- f+ z8 \* x

# F( z5 F3 X: ~& Z fb228f6ecba64d6f90617c07efe2872d.png ) O4 |: x; x6 E6 u  R  z

) O* z* U4 \. A( i+ v( P5 Z& _circular传输打印如下所示,一直传输,不会停止。
3 B( G+ z3 W% d2 f2 X: B' T6 u6 D6 z% w) A% z0 h& n; Q* ^0 Z. H6 z
80dbd493fcd94618a4da7d5cf3682092.png
  ?3 E9 _% @- u3 A: |3 a8 }# p. F8 a* e. f5 w0 n  k
HAL_UART_Receive_DMA()发送
0 b& X) i8 j! \+ h5 `0 h: U1 v6 p测试代码如下。. v; V2 n( _& j% v. x/ |, H; b& ?
定义需要接受存放数组。
% I7 j3 @+ b+ }
1 q1 A8 r: i6 E
  1. /* USER CODE BEGIN PV */) o3 v9 |/ O& h6 g9 p6 l1 _% W
  2. uint8_t RxData[255];
    ( \! ?5 F+ `7 O. J/ h
  3. /* USER CODE END PV */
    ) ~2 T% Q/ e; A# ~8 D
复制代码

% Z3 B$ L; G1 z4 P5 f2 p6 e; h开启HAL_UART_Receive_DMA()接受代码。  O7 [/ b5 C# Z

% h4 V+ w1 D! y6 c( d4 z' W' O
  1.   /* USER CODE BEGIN 2 */" A5 L: |" C/ ?0 F" S  s
  2.   HAL_UART_Receive_DMA(&huart1, RxData, 10);    // 这里加这个函数,接收数据: K# K2 D! h% e9 L& g, g5 c3 x
  3.   /* USER CODE END 2 */
复制代码

0 A+ k5 r9 q; N1 y! t  r, C重写读取回调函数,将接受的数据发送出去在开启接收。
! M1 E, K; m, R# Z& \8 l4 d+ ~5 C# g# _- u8 O
  1. /* USER CODE BEGIN 4 *// e- C) N' t; z
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)2 H& Q' O$ V9 y. f5 \8 V- i; m
  3. {, t* E" A6 I5 L! I, _
  4. ! B/ Y# N3 `6 t
  5.         HAL_UART_Transmit(&huart1, (uint8_t *)"text:", 5,0xffff);//轮询发送,不然可能发送不出去1 |, e: M7 x- [! e; U6 G
  6.         HAL_UART_Transmit_DMA(&huart1, (uint8_t *)RxData, 10);//发送接受的数据
    . T. v; M3 w, E4 |! J
  7.     HAL_UART_Receive_DMA(&huart1, RxData, 10);    // 这里加这个函数,接收数据
    " Q5 ?: w6 t, d/ n% X/ e; I
  8. }
    - O9 V  i* N! F
  9. + X8 V3 P2 \/ @1 }0 p
  10. /* USER CODE END 4 */
复制代码
1 k6 m: F( N% l  i; L" c
DMA有normal和circular两种模式。
5 E/ Q# A* ]& p' `" ?Normal表单次接收,接收一次后终止接收,所以需要接收几次就需要开启几次,Circular表示循环接收,接收完成后又重新头开始继续接收,开启一次后会一直接收。" T0 [$ M% i: e$ M  N4 @
normal传输打印如下所示,传输完成就关闭。
9 g% z8 \. j) @+ H演示效果如下所示。
1 H0 e0 M# @% e- b: g1 W( n, }
2 h7 V  W* U, o 49419994c7704c11b33e5c0417b2105e.png
8 r- ?' `* |8 G6 O* ^: v- r
0 w6 F/ k$ `( |( Q( L, l  @. mcircular接收打印如下所示,当发送数据大于接收长度时候,会进行循环接收。
- C. b! _3 n: F' I0 t. }6 t* v9 x) r' F# ?+ u' y' i
6224d58f09e74706b743b505d8d7d193.png ; B9 F- W% G- A+ B$ k5 k
————————————————
/ E6 D  J7 l: [/ F! k6 z3 ?版权声明:记帖
" `+ F" ~: E1 @( O3 ~0 Y9 _
; F- }# F- `  d, f7 l1 r# _# a& t. f! E1 H# [
赞 收藏 评论0 发布时间:2022-9-5 21:50

举报

0个回答

所属标签

相似技术帖

官网相关资源

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