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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-4 21:57
微信图片_20230804215604_5.png
( ?( p2 D5 \+ C
最近可能不少人手上弄到了ST发布的的基于M33内核的H5系列Nucleo开发板,这里也用该开发板体验下UART通信,做些验证与确认。【提醒,下面测试过程中没有开启TrustZone功能】
有人在使用过程中,根据开发板手册描述,芯片的UART3默认与STLINK的VCP口相连,测试中感觉好像又不是。这里不妨一起验证下。根据该开放板使用手册描述,UART3[PD8/PD9]默认是与STLINK VCP的接口。

6 d& M$ B# F( T5 I" \& H& E$ b& K3 X
微信图片_20230804215604_4.png

9 L# A9 n1 \7 k( J; w- y; {
基于上面硬件条件,使用CubeMx简单配置即可验证。
* `' V0 w. o5 j2 B, c
6 d( p2 P/ ^- p  r, A6 j$ N
微信图片_20230804215604_3.png
7 G8 w) C5 O% a7 c
微信图片_20230804215604_2.png
" Z+ K7 @3 t5 i  N. L

7 R/ M3 ^' g: j. e. {9 ?
创建工程后,在用户代码里调用HAL_UART_Transmit(&huart3, (uint8_t *)tx1_buffer,  Size, TimeOut)函数,在串口输出终端即可看到结果。看来一切正常。
* M! X. V; O4 S/ Y7 b, Z
微信图片_20230804215604_1.png

1 e) U: a% y/ k" [4 ?3 F9 ?
说明UART3的TX/RX脚【PD8/PD9】的确如手册所言,默认与VCP接口相连。+ [" _/ i( g" p) O; h
上面是基于查询方式做了UART的发送,如果采用DMA方式呢?我们也可以顺便体验下。* A9 m2 w+ D% B& n
我这里使用GPDMA1的CH0和CH1,分别实现UART3的接收与发送。UART3的DMA接收采用Circular模式,外设到内存的传输方向;发送采用Normal模式,内存到外设的传输方向。源端与目的端访问数据宽度均为Byte。DMA请求使用标准请求模式。
$ B! l' u. d5 Z0 I7 ]: D
微信图片_20230804215604.png

' }) X2 h0 \( i# W, X
微信图片_20230804215605_2.png
2 I$ W4 d) ?$ E& X
微信图片_20230804215605_1.png
' ^+ P1 \; @0 w/ \! |( T% a

) B" n5 O# C% ?4 X; z! T' z' g
创建基于STM32HAL库的工程,添加、整理用户代码。
; t: x/ t) d% X% T; U: h: q
  1. #deifne RX_SIZE  (16)5 c) C. Q( Y% p8 `; x% S
  2. #define TX_SIZE  (33)
    7 ~2 ]3 U% ~1 N! n
  3.   
    3 m  f! i0 y- C+ q* E
  4. ALIGN_32BYTES (uint8_t tx1_buffer[])="**STM32H5 UART Test with Polling**\r\n\n";
    2 P2 i1 n: T7 S9 d6 {( J7 m
  5. ALIGN_32BYTES (uint8_t tx_buffer[])="**STM32H5 UART Test with DMA**\r\n\n";2 U; r8 X/ j# o: K( H
  6. ALIGN_32BYTES (uint8_t rx_buffer[16]);
    - }$ S% H/ b( E! A+ v
  7.   4 g" i' t2 f  |; K; N
  8.   __HAL_LINKDMA(&huart3, hdmarx , handle_GPDMA1_Channel0);3 r& m- u, |: x1 t
  9. " D- f: i0 z* ^* g
  10.   __HAL_LINKDMA(&huart3, hdmatx, handle_GPDMA1_Channel1);' M+ H8 q6 P/ P6 e0 N- \4 i; ~2 ]* X
  11.    
    / j8 v7 ^$ b+ J" Z+ q; n# U* O
  12.    HAL_UART_Receive_DMA(&huart3,  rx_buffer,  RX_SIZE);//For RX% \8 }  I7 ^7 l& k1 [% J
  13.    
    8 [! }+ n0 @+ L' C1 ^2 W  {
  14.    。。。。。
    3 D4 I, U: r3 L7 Q, B, _
  15.      /* USER CODE BEGIN WHILE */7 t- @6 x& D9 b/ M
  16. while (1)* F4 x4 y3 x  ]( y# u
  17.   {
    2 ]( N8 C9 J" P' c

  18. # K$ D3 l  `* l# x
  19.   HAL_Delay(2023);: H4 p( F+ Z7 Z3 ~% g( h- b* ]
  20.   g4 x, i4 O) H# q4 f
  21.   HAL_UART_Transmit_DMA(&huart3, (uint8_t *)tx_buffer, TX_SIZE);4 s. z1 r; m+ x
  22.   //HAL_UART_Transmit(&huart3, (uint8_t *)tx1_buffer, 37,0xfff);- |5 x  t, D* O7 d" l8 p
  23.    huart3.gState = HAL_UART_STATE_READY;0 ^2 {8 y) s3 G0 u5 M
  24.     5 e: N- C5 i' z. B
  25.   }
复制代码
   
稍加调试后运行程序看结果。下面左侧窗口为UART3通过DMA发送出来的信息,右侧为串口助手发送后UART3通过DMA接收到的信息。
9 h: K6 ~& F) h2 u9 s2 |
* {+ N: e9 u3 A7 n* v8 `( u8 s
微信图片_20230804215605.png

7 P0 v, }% T( d0 S8 q  p
好,基于STM32H5的UART通信的演示就到这里。内容不难,主要是做了些验证。这些验证过程及结果的确也能为初次接触该板或该MCU系列的人在遇到相关问题时予以信心,在调试受阻时能尽快地锁定问题方向。毕竟做开发调试时,信心和问题方向都是非常重要的因素。

) o7 o( ~$ U4 [7 Z5 P, x. h7 \
转载自: 茶话MCU
如有侵权请联系删除

! E8 ^; @. k5 I! K$ T1 z

: N  M. s: O8 [( k( w6 V' N
收藏 评论3 发布时间:2023-8-4 21:57

举报

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

学习

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

签到

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版