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

STM32CUBEIDE----USART通过DMA收发

[复制链接]
STMCU小助手 发布时间:2022-9-5 22:15
生成例程% t, {3 b/ y" |% k" v! ?( P% i& X. ?
使用STM32CUBEMX生成例程,这里使用NUCLEO-F103RB开发板
6 C2 z, t, n2 F4 D1 w! ~/ e& Z* Q4 U# _
641406f4ab6d4ba3806608ea088511f0.png
: Z$ d  p0 _/ y2 C
9 ]! J5 l: e/ k  ]0 X: T查看原理图,PA2和PA3设置为开发板的串口。4 H1 m9 X* H; q" f5 x( ]
6 v1 S3 b! Z: w1 H# D! D7 a
6cde275d970445afaa522e74e1b05da0.png
9 _3 d+ r7 Y% J  N3 d% \, d, a0 H0 O" x, T
配置串口。
1 B, p+ X4 D' @# m* m# V
5 d9 E! C& S, ~6 M3 t% m e5a35949ea484fe782de2237f57d2198.png
( F5 Z' }* m4 Y4 L. K% a. N9 u1 W# \0 ?
开启中断。. i' K6 U$ ]  }  D; m/ g3 a  `
4b8d8ee78fdc425485eb47d05a726d28.png
6 c. ]- m1 V0 x$ s& _) Z
/ j) \8 F$ w  p开启DMA读取和接收。8 K  O& }4 b, p' u
其中Word = 32bit,Half word = 16bit,Byte = 8bit8 B4 t3 l& g9 @2 }/ o0 [

- M8 X+ J3 H4 K4 }$ y7 V9 J7 M 18e545d999bb4ee4a5d7c24712ea6450.png
: b' Q3 L( w% ~& z3 e
* f9 ?8 L+ n7 U# v$ w) x  pSTM32CUBEIDE配置+ ]6 ]6 W+ V4 i$ v) x
! |4 ?. ^, E2 _! V8 u3 q
cef307ee88fe48e9927c8672840c37f2.png
; y: ~+ Q% d2 s' A0 ~8 K- `2 ?! F& p, f3 T
若需要打印浮点型,需要勾选下面的选项。
" W) `+ b% \$ D- O/ q$ v, X- v$ i! v. ~8 v7 i) X8 b
0f42e907240242bfbb736c31e9755617.png $ Y3 W* b  n% ~
1 |7 r# e0 i/ d% n8 G$ Q
串口重定向
: ]' @8 ^- l% U" p3 P! b# L在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。* O* N9 D# A  d$ L) s- }/ Z
: Y9 f1 S6 z  \# ]" u6 U! Q) G; r
  1. /* USER CODE BEGIN Includes */
    * u5 j% r' y  Q: c7 V4 Y
  2. #include "stdio.h"
    ' ?3 X4 a5 k  ~3 A2 E; C
  3. /* USER CODE END Includes */
复制代码
, Z6 m4 ]0 R- u6 Z& G+ Q
函数声明和串口重定向:% ^+ e/ D9 ?, J' d
' f6 [1 M. C2 U- h1 _' u! `: \
  1. /* USER CODE BEGIN PFP */
    6 g7 q' Q: I7 H2 j1 H; ~. I  u
  2. #ifdef __GNUC__                                                                        //串口重定向
    5 T, a+ [/ I  o3 A. W
  3. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    . H; P/ l: n4 y7 h" g' M, D
  4. #else1 ]  k: @6 F+ g/ P# Y5 b- o& d1 N
  5. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    . v$ D, A2 W+ n) u( U
  6. #endif
    ( x# d" W1 {5 y) G' i) @1 ]9 q
  7. PUTCHAR_PROTOTYPE
    4 w5 }1 Y6 b  Z3 g' e: z% @2 S8 @7 Y
  8. {) E; [  ?; E$ u" b
  9.     HAL_UART_Transmit(&huart2 , (uint8_t *)&ch, 1, 0xFFFF);# q0 r) _! Q; H0 G- n6 J
  10.     return ch;
    ( V  U/ p# P0 X5 z: f
  11. }
    : J. n3 G% T3 Q3 @
  12. /* USER CODE END PFP */
复制代码

- L5 ~( |$ T+ T" ]串口发送接收函数

' M) S5 h* S7 B. j3 s一般情况下,串口发送接收函数有如下所示。2 c- A& v7 A( Q: u0 `9 K
● HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。5 l* {  I4 p$ c. U) V, v4 G0 a& l
● HAL_UART_Receive();串口轮询模式接收,使用超时管理机制。
" j4 _. k/ g6 f, f  m, _. b● HAL_UART_Transmit_IT();串口中断模式发送
8 X" ^1 d- j6 |3 O2 `● HAL_UART_Receive_IT();串口中断模式接收. a+ K! |: ?* w' n1 O
● HAL_UART_Transmit_DMA();串口DMA模式发送
1 T" s- P+ j! Z2 M% y( {● HAL_UART_Receive_DMA();串口DMA模式接收
( d5 H4 [8 f* }+ C0 u
* j8 L2 Q8 w5 ^: _/ d0 J1 B- P( t7 XHAL_UART_Transmit_DMA()发送
+ A5 c4 R# D; ?; L6 K; ~% t测试代码如下。
/ a: z# a5 L% V/ u2 m& U定义需要发送的数据。' f# P& G1 w4 \/ V
% p  L5 u$ L- n( _. N/ [9 N: ]
  1. /* USER CODE BEGIN PV */8 B% f: ^0 J1 Y/ f
  2. uint8_t TxData[] = "\r\n**** Hello,World!' ***\r\n";! }6 p  ?! ], p/ {, Y' |$ ?3 a9 w
  3. /* USER CODE END PV */
复制代码

8 r" o7 j0 V4 N+ z3 yHAL_UART_Transmit_DMA()发送代码。
  1.   /* USER CODE BEGIN WHILE */
    ; C; [. {4 |7 [5 s  X
  2.   while (1)
    : L: I' T9 N2 I& _, b- J: d$ w
  3.   {, g! v9 P5 W0 p4 S9 T
  4.     /* USER CODE END WHILE */. |" P" J+ R* p. ?6 q6 K/ q
  5. ' A& W& @1 c# K" K
  6.     /* USER CODE BEGIN 3 */
    ) P# ?1 p; p8 e
  7.           HAL_UART_Transmit_DMA(&huart2, (uint8_t *)TxData, sizeof(TxData)-1);
    7 _# h2 {5 }; n* m
  8.              HAL_Delay(1000);
    # Q% a& u2 E7 C  M
  9.   }5 E! Y. ^7 P7 `0 d# B* k# Z  T
  10.   /* USER CODE END 3 */
复制代码
; ^: _$ t" ~) I5 T3 K  f0 |
DMA有normal和circular两种模式。
) J, N- j+ k+ H* K$ }0 q# u: cNormal表单次传输,传输一次后终止传输,所以需要传输几次就需要开启几次,Circular表示循环传输,传输完成后又重新开始继续传输,开启一次后会一直传输。
. m: q6 W' l# n" tnormal传输打印如下所示,传输完成就关闭。
) C* z. {7 ^, S# j$ ]9 ~3 d$ w& ]- ^+ e( O0 ?+ _
931ef447246041108019de81dc19bd24.png
8 A" s% Y$ R8 x( i+ c/ ?. X$ z% h0 j# [* c7 o
circular传输打印如下所示,一直传输,不会停止。# x4 r8 y1 L# `

! S1 S! c. O( _2 ~ 5b00a7e39f264e2f972e8c4ceb1f1e1d.png " V" m  G/ Q1 V$ R% v

. r, k* X! i3 `. SHAL_UART_Receive_DMA()发送
# D& |! X3 M8 x9 \测试代码如下。6 ^7 ?7 V  ~3 o( u9 f/ q8 |: a
定义需要接受存放数组。
& E) f# e9 w& t9 J" z% H
8 J' d; B7 `' c0 Z3 w* Q7 ?
  1. /* USER CODE BEGIN PV */
    9 B2 Y- d# G) N; e9 Q4 H& t
  2. uint8_t RxData[255];; W4 s6 F! y1 i% m
  3. /* USER CODE END PV */
复制代码
$ n4 ^1 |8 w# H6 f% S
开启HAL_UART_Receive_DMA()接受代码。- S9 r; \& r6 B6 D4 m7 l, G# D
. N6 l+ L! Y5 w
  1.   /* USER CODE BEGIN 2 */
    4 E" T/ k% F8 b5 ~' _- c0 o; W
  2.   HAL_UART_Receive_DMA(&huart2, RxData, 10);    // 这里加这个函数,接收数据& c+ S# V, s) B5 j3 M
  3.   /* USER CODE END 2 */
复制代码

* e4 c: C9 O0 w* Q+ \重写读取回调函数,将接受的数据发送出去在开启接收。% C$ w6 g/ g3 Y
* J/ j! B; j3 y4 X3 ^
  1. /* USER CODE BEGIN 4 */0 K6 z; r( [' {% L& n: E8 S* i
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)# c- K5 V8 p  k
  3. {( C+ b4 r7 n7 t* t

  4. 2 h% a: k, Q7 f' J3 u# C. v
  5.         HAL_UART_Transmit(&huart2, (uint8_t *)"text:", 5,0xffff);//轮询发送,不然可能发送不出去
    1 q: k9 |5 A3 e7 J& E: N
  6.         HAL_UART_Transmit_DMA(&huart2, (uint8_t *)RxData, 10);//发送接受的数据
    / y4 D1 Q% i# _
  7.     HAL_UART_Receive_DMA(&huart2, RxData, 10);    // 这里加这个函数,接收数据! V2 z) F5 H+ f. U# ~$ W
  8. }  ~7 f: `+ v' Z* o. ~

  9. 5 j+ t3 l: ?9 j, z% [4 o, }
  10. /* USER CODE END 4 */
复制代码
& i  p  }7 w0 B6 s4 u
DMA有normal和circular两种模式。
4 |) P  z* P4 a. N  G3 I/ g  [Normal表单次接收,接收一次后终止接收,所以需要接收几次就需要开启几次,Circular表示循环接收,接收完成后又重新头开始继续接收,开启一次后会一直接收。/ ?  Z7 n6 A! {9 s4 ]# V6 f
normal传输打印如下所示,传输完成就关闭。- N  |8 ]( E4 C2 N1 g( `
演示效果如下所示。9 V. h6 ]$ x! \* @2 Y3 X* I; Y! A

* ~3 [. E8 m' F' s1 H+ p b107c63d5513418da8ac946300be7612.png
: ?! T$ s! ^: W$ }" b# P
0 d+ c3 |& O3 n8 C7 V$ }$ E% X" Qcircular接收打印如下所示,当发送数据大于接收长度时候,会进行循环接收。- @7 B% r9 T, f+ p; H0 K0 v

' K$ Z# }' u  A3 m  ~- j 25ebedc04f9d452fb9ae50e54a094b0e.png : q6 I' B3 w+ {. a  ^

3 _/ p( c6 f( m: f" V4 H7 R————————————————
# t0 F: G3 O. S" P版权声明:记帖$ M$ J' C0 `, `9 U' J8 X  j; z: Q

- P" `$ Z1 \/ @. [# P! \0 r/ U+ C& v9 j* T: N2 u4 V2 I
赞 收藏 评论0 发布时间:2022-9-5 22:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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