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

STM32CUBEIDE(8)----USART通过DMA收发

[复制链接]
STMCU小助手 发布时间:2022-8-18 16:44
生成例程
' z$ d: `2 V0 }# O% [/ G* Y0 h使用STM32CUBEMX生成例程,这里使用NUCLEO-F103RB开发板; G# b  }( ?) u5 ^# J
. h5 r8 X) {4 I1 B, }! e
641406f4ab6d4ba3806608ea088511f0.png . e. U3 z+ f" G/ x+ ?0 _, e2 m/ _/ U

' y: A% i1 d9 F# e; G" ]' y8 X查看原理图,PA2和PA3设置为开发板的串口。
- _- |2 V' u. P" C0 K  |) ^! J$ k 6cde275d970445afaa522e74e1b05da0.png # @6 H0 A8 ?4 b3 Z
. [3 `* M9 K! S4 T
配置串口。; k0 R/ h% k1 H+ o/ P; _: N! F

- N/ M. Q: @- l8 w% J+ E  ? e5a35949ea484fe782de2237f57d2198.png
# p% x: J3 p6 X  o# d/ c  a2 h+ ~: n  f
开启中断。' o" @* b# P% b4 t2 M

( A1 ^7 ?. }6 h6 L4 c' U# n. A& ?. H 4b8d8ee78fdc425485eb47d05a726d28.png
& \; s6 Y; E0 g" h& ]' g5 `
3 S6 E* s* ^& d; v8 G, n! K% u开启DMA读取和接收。
" l# E1 T& v0 J! `: m0 P* Y, B! d其中Word = 32bit,Half word = 16bit,Byte = 8bit& ]  W+ H0 q2 r$ |9 F

" ^& f, ?% b' l& | 18e545d999bb4ee4a5d7c24712ea6450.png
% b7 Y! A$ J5 [) p4 `4 v% _! [+ z9 i- `( [$ N
STM32CUBEIDE配置1 b$ A0 X/ i/ B

& W0 A2 G# @# L5 P& d7 Q cef307ee88fe48e9927c8672840c37f2.png : w( Q* }0 q  k3 N* p6 n
$ R$ b! b2 f  [- t/ c- g
若需要打印浮点型,需要勾选下面的选项。6 E$ Y8 J( U* d' r3 d5 s! ^/ F

# j9 u9 e4 V. d 0f42e907240242bfbb736c31e9755617.png
5 O- y4 X% |8 d% C4 v2 ~; F0 O
; J) a9 v5 ?8 k7 R( w" }! o/ f5 G3 t串口重定向
* R' t' M" f6 A% Q在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。2 m# U" M/ W8 R, u1 G, u6 d
" x+ F! a# W& [. f* y
  1. /* USER CODE BEGIN Includes */3 M% k7 w9 F/ x+ g  B5 F% Q
  2. #include "stdio.h"& U( E6 Q( y3 _% X8 R: J, I
  3. /* USER CODE END Includes */
复制代码

4 A% {: p% P% I8 j: |4 Q! H0 p% P函数声明和串口重定向:; @! D9 K( l$ `& R" _, c0 D
$ s4 W* e. a/ M) [2 e% G& I
  1. /* USER CODE BEGIN PFP */4 E) I, ~: z$ P# W8 K0 p
  2. #ifdef __GNUC__                                                                        //串口重定向
    1 |! _  k9 t. K2 b) y+ q
  3. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    ; E% Q( ?9 E: E6 h; i1 a+ \
  4. #else
    ) Z% H& ~  R  p1 O; y' |, f- a
  5. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    1 H* X$ w+ A% ?8 J4 y: F
  6. #endif
    / p5 p2 p, U: h% w
  7. PUTCHAR_PROTOTYPE# R- w. n& E# y* }8 y
  8. {/ O% ^" s- n: \7 d: D! z/ W- a- a! r
  9.     HAL_UART_Transmit(&huart2 , (uint8_t *)&ch, 1, 0xFFFF);& `% f7 N! F. T( N
  10.     return ch;
    + h( T3 t6 l2 d- o
  11. }+ j9 `+ ]" a8 \4 A9 L
  12. /* USER CODE END PFP */
复制代码
* C2 l! T5 g/ m
串口发送接收函数, ^" k: K# n/ F! z4 D9 }
一般情况下,串口发送接收函数有如下所示。
; S$ ?( j+ W2 }6 f& C' ]: ~● HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。1 u1 U+ e9 ^: G3 K
● HAL_UART_Receive();串口轮询模式接收,使用超时管理机制。" V' J, M! k8 B9 K/ y9 v& s
● HAL_UART_Transmit_IT();串口中断模式发送7 N5 D1 }+ y9 D$ Y7 I) D# i4 p. h; q
● HAL_UART_Receive_IT();串口中断模式接收! O( P% c6 C( ^# B- O  S
● HAL_UART_Transmit_DMA();串口DMA模式发送1 v  x/ B' g; ]# M
● HAL_UART_Receive_DMA();串口DMA模式接收
5 h; F& ~  ]/ c4 y+ Q$ p- w# E
' ^+ k* Q: v4 e8 Y2 AHAL_UART_Transmit_DMA()发送
* M$ ^! v( P9 b5 P测试代码如下。
/ M3 p( l! a0 j0 X7 ]( k3 Q2 Y" z6 p定义需要发送的数据。& O" c9 x  }8 g& e

( |* N1 L' {: B- o+ ~3 x
  1. /* USER CODE BEGIN PV */& h% A& v" T  U$ Z/ n' F' K
  2. uint8_t TxData[] = "\r\n**** Hello,World!' ***\r\n";
    9 P! g8 `8 h# G) Q: {; s
  3. /* USER CODE END PV */
复制代码
; m" t, M$ O6 [$ N- ~1 @1 x2 Q# n
HAL_UART_Transmit_DMA()发送代码。
3 x2 z, x3 p) P! }0 u
6 q9 f. j! [0 s- y) M) T/ u
  1.   /* USER CODE BEGIN WHILE */' A; A( l# u) G) f4 Y3 ?8 u8 F9 l
  2.   while (1)0 j5 P6 W  w7 `' z1 e
  3.   {
    # c4 V0 i, k3 V8 c; `3 d
  4.     /* USER CODE END WHILE */" l! c0 o( S2 f- K  r( G
  5. 6 d& }0 s4 a$ P
  6.     /* USER CODE BEGIN 3 */8 T+ K- e" S4 |4 n! m3 g* E, P
  7.           HAL_UART_Transmit_DMA(&huart2, (uint8_t *)TxData, sizeof(TxData)-1);# s' T- F: Q, F" t1 b9 y
  8.              HAL_Delay(1000);
    2 E" d+ w5 S( G0 ^, U" \
  9.   }
    0 r# u* r7 g! W- e, ]
  10.   /* USER CODE END 3 */
复制代码

9 A2 ~) G+ x; }3 {) \; N; z* @6 wDMA有normal和circular两种模式。2 b0 S6 L: e& N: d1 {/ Z  Y
Normal表单次传输,传输一次后终止传输,所以需要传输几次就需要开启几次,Circular表示循环传输,传输完成后又重新开始继续传输,开启一次后会一直传输。4 h, x, p# I, n
normal传输打印如下所示,传输完成就关闭。
' c$ c- p; @! p- D; ^4 E/ F3 y: H8 |& h0 _( p
931ef447246041108019de81dc19bd24.png
" f' H: E+ Q+ f( {" M  n9 g8 Y/ w
circular传输打印如下所示,一直传输,不会停止。+ Z) V/ [* {4 ^2 Y
7 `" {% f0 y- l5 G& a  P: o
5b00a7e39f264e2f972e8c4ceb1f1e1d.png
! r1 m$ C/ j1 O# z0 P$ s
% G) K9 _9 N. l0 X* |) B. S8 n( f1 P  Q
HAL_UART_Receive_DMA()发送
/ N! `  r1 x- x. W2 L9 u; r2 C* |测试代码如下。( l4 W1 A; b" G" _
定义需要接受存放数组。$ M2 C2 U1 K( h2 b  V2 E$ b
' |, g5 G1 Y1 n8 I+ x) {
  1. /* USER CODE BEGIN PV */0 f+ A0 b1 g" J' t& Q# P  M/ \% {
  2. uint8_t RxData[255];7 }: U9 m* D! W0 {
  3. /* USER CODE END PV */
复制代码

: L2 O/ v5 b! E$ a  d开启HAL_UART_Receive_DMA()接受代码。  F2 r5 D9 L7 S- F- R9 J
( F6 E* M) M6 E; t7 ]' }; q
  1.   /* USER CODE BEGIN 2 */
    # y. g) }8 M  Y9 \; H
  2.   HAL_UART_Receive_DMA(&huart2, RxData, 10);    // 这里加这个函数,接收数据
    ( S- f9 E7 v: o) |% |$ O- f& Y
  3.   /* USER CODE END 2 */
复制代码
1 v, d7 Q) z6 C) @7 d- g
重写读取回调函数,将接受的数据发送出去在开启接收。
2 j( `$ f# c6 q* L) K
& U! S9 U1 x, P% N1 u- p3 S( e
  1. /* USER CODE BEGIN 4 */
    " b( Y6 p; b, _* L
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    % S1 R3 u; e' u. \" ^# |9 R4 C
  3. {
    . c; N$ ^) ?- |/ ~! v* i7 x

  4. # v1 i% X" c7 i3 t2 ~# l0 H
  5.         HAL_UART_Transmit(&huart2, (uint8_t *)"text:", 5,0xffff);//轮询发送,不然可能发送不出去
    ; Q' p1 L, c+ o/ R8 B  _* M! p+ A. V
  6.         HAL_UART_Transmit_DMA(&huart2, (uint8_t *)RxData, 10);//发送接受的数据2 J$ `( b  M0 u5 M
  7.     HAL_UART_Receive_DMA(&huart2, RxData, 10);    // 这里加这个函数,接收数据* r+ H0 Q4 k8 E2 d' G9 u
  8. }- @) R# A: r& _( z' n* Y: h

  9. " X' n' |. J1 h5 x* W0 X# b
  10. /* USER CODE END 4 */
复制代码

' N. Q; a" j7 t; R, }DMA有normal和circular两种模式。
6 ]$ k2 u$ u+ X$ g* ]( H. KNormal表单次接收,接收一次后终止接收,所以需要接收几次就需要开启几次,Circular表示循环接收,接收完成后又重新头开始继续接收,开启一次后会一直接收。
2 u  t4 h1 J/ Q  q  L3 g: s; lnormal传输打印如下所示,传输完成就关闭。
; F' P( {  `; O5 b4 G演示效果如下所示。. i1 C; Q6 X# Y0 d  `

( n" ]( X) K# B2 C: { b107c63d5513418da8ac946300be7612.png
) K& Q+ |9 m7 B5 W! K( M; i/ W! @. x# |
circular接收打印如下所示,当发送数据大于接收长度时候,会进行循环接收。# f5 C; C$ Q6 t) [" R) P- A) l

( O' J) m9 d1 x% k 25ebedc04f9d452fb9ae50e54a094b0e.png
: q2 L( |2 {6 I' X! m0 Z8 q! j9 ?! L! x8 a

) _( ^, ~. h# d# a1 x
+ `  A2 L0 p% N- D+ V
赞 收藏 评论0 发布时间:2022-8-18 16:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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