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

基于STM32H563演示UART+DMA经验分享

[复制链接]
攻城狮Melo 发布时间:2023-8-4 21:57
微信图片_20230804215604_5.png

, s7 t, d0 m; O& Y& W: O$ `
最近可能不少人手上弄到了ST发布的的基于M33内核的H5系列Nucleo开发板,这里也用该开发板体验下UART通信,做些验证与确认。【提醒,下面测试过程中没有开启TrustZone功能】
有人在使用过程中,根据开发板手册描述,芯片的UART3默认与STLINK的VCP口相连,测试中感觉好像又不是。这里不妨一起验证下。根据该开放板使用手册描述,UART3[PD8/PD9]默认是与STLINK VCP的接口。
$ }% o0 R0 o3 v
微信图片_20230804215604_4.png

" Q3 n4 z# o" \& P$ |
基于上面硬件条件,使用CubeMx简单配置即可验证。1 T6 a# W. r5 n

- d$ ^+ ?0 P5 V/ l
微信图片_20230804215604_3.png
$ {- O6 l4 b+ P" }* q- W  I
微信图片_20230804215604_2.png

: k8 @: j: x. D6 C0 A' `% U5 p+ m- h
创建工程后,在用户代码里调用HAL_UART_Transmit(&huart3, (uint8_t *)tx1_buffer,  Size, TimeOut)函数,在串口输出终端即可看到结果。看来一切正常。

, a: h) M/ q, b* f# C: b% A9 M9 W
微信图片_20230804215604_1.png

7 V8 L1 I# W3 L+ O. K8 P8 C
说明UART3的TX/RX脚【PD8/PD9】的确如手册所言,默认与VCP接口相连。
7 \& ]- I" G9 G* `, b
上面是基于查询方式做了UART的发送,如果采用DMA方式呢?我们也可以顺便体验下。
, j% _0 F5 H  N( @; [: e0 g& W1 J
我这里使用GPDMA1的CH0和CH1,分别实现UART3的接收与发送。UART3的DMA接收采用Circular模式,外设到内存的传输方向;发送采用Normal模式,内存到外设的传输方向。源端与目的端访问数据宽度均为Byte。DMA请求使用标准请求模式。
/ J' o5 |7 s3 i! p4 C/ {
微信图片_20230804215604.png

+ F! J/ B7 u3 W
微信图片_20230804215605_2.png

2 a$ M' O% |* H0 M; }7 v
微信图片_20230804215605_1.png

- t9 d6 V8 x* q! \- m# @! w5 S& t: x
创建基于STM32HAL库的工程,添加、整理用户代码。3 L- a) [# i. F
  1. #deifne RX_SIZE  (16)5 ~1 B, @; s% W" N- e) L4 b/ i
  2. #define TX_SIZE  (33)
    $ m( v  P. F" j
  3.   
    " q- H7 X: i& Y4 C& e( a
  4. ALIGN_32BYTES (uint8_t tx1_buffer[])="**STM32H5 UART Test with Polling**\r\n\n";8 K$ x$ y( D+ A6 i7 f
  5. ALIGN_32BYTES (uint8_t tx_buffer[])="**STM32H5 UART Test with DMA**\r\n\n";9 K" @  S+ l& U5 W% x; L, ^
  6. ALIGN_32BYTES (uint8_t rx_buffer[16]);% r/ A$ l7 ]! \0 M2 j
  7.   
    . ?# o6 T! P+ k9 W/ g
  8.   __HAL_LINKDMA(&huart3, hdmarx , handle_GPDMA1_Channel0);3 n! Y% n& }9 s0 x: c) a% w5 G

  9. ( j+ {2 D4 j& e: V. _
  10.   __HAL_LINKDMA(&huart3, hdmatx, handle_GPDMA1_Channel1);9 X" V3 ^: U( w
  11.     + n8 M! J% S" D. H( h+ O
  12.    HAL_UART_Receive_DMA(&huart3,  rx_buffer,  RX_SIZE);//For RX
    , B% t. X8 e6 o- O
  13.    
    3 i* t4 c8 u3 p. p  X1 c
  14.    。。。。。* L  ?! p$ U1 n& y9 I
  15.      /* USER CODE BEGIN WHILE */
    6 w# o4 \1 h# V2 d  n# h6 ]% B$ O
  16. while (1)& W- C& z% w% U" Q- P5 }8 Q
  17.   {
    + a1 M3 S0 z: g; X! l' v
  18. / c( B( D: W2 H0 ~9 R: N
  19.   HAL_Delay(2023);; E! k+ g5 m$ O7 r; ~* E

  20. 9 `) t/ {4 r/ h, t
  21.   HAL_UART_Transmit_DMA(&huart3, (uint8_t *)tx_buffer, TX_SIZE);1 s) U/ G9 j1 C" M
  22.   //HAL_UART_Transmit(&huart3, (uint8_t *)tx1_buffer, 37,0xfff);
    $ u& ^# x, F6 J* m
  23.    huart3.gState = HAL_UART_STATE_READY;
    . o4 X7 n  a: N+ {! t
  24.     8 h: l3 G+ L' Y$ S
  25.   }
复制代码
   
稍加调试后运行程序看结果。下面左侧窗口为UART3通过DMA发送出来的信息,右侧为串口助手发送后UART3通过DMA接收到的信息。
$ y7 O! I# V! r# }3 C  x7 F  y

! d! ^6 O3 ]! O. @8 T( e
微信图片_20230804215605.png

4 h' A5 ^! ]4 B, k8 t- B
好,基于STM32H5的UART通信的演示就到这里。内容不难,主要是做了些验证。这些验证过程及结果的确也能为初次接触该板或该MCU系列的人在遇到相关问题时予以信心,在调试受阻时能尽快地锁定问题方向。毕竟做开发调试时,信心和问题方向都是非常重要的因素。

' O5 j' g! l+ B- z: g( {, O
转载自: 茶话MCU
如有侵权请联系删除
  u% x1 R) C* x& v

3 K6 A4 E; |  F# W) s$ S& @. f% |

点评

本人按您的示例添加,发现DMA没有接收到数据,能否帮忙指导。感谢感谢。  发表于 2026-2-7 14:45
赞 收藏 评论4 发布时间:2023-8-4 21:57

举报

4个回答
JasonQT 回答时间:2023-8-31 08:42:00

学习

556 回答时间:2023-9-1 08:55:57
[md]学习写贴
tongyu 回答时间:2023-9-1 09:38:53

签到

所属标签

相似技术帖

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