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

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

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

+ ~! i  `4 F7 H. s$ Y
微信图片_20230804215604_4.png

( q+ a, B8 o/ |; }/ p
基于上面硬件条件,使用CubeMx简单配置即可验证。2 ~; I% |2 A( D6 f' x5 B
7 F2 b8 {4 S9 M( X
微信图片_20230804215604_3.png

4 @' M, a+ x( g
微信图片_20230804215604_2.png

. J2 \) ]. G& @. _! }0 |  N9 L; d% U: U
创建工程后,在用户代码里调用HAL_UART_Transmit(&huart3, (uint8_t *)tx1_buffer,  Size, TimeOut)函数,在串口输出终端即可看到结果。看来一切正常。
6 B: F4 R# w! b) _5 @7 S
微信图片_20230804215604_1.png
/ u2 E7 c$ c5 q9 J5 @1 m7 ?
说明UART3的TX/RX脚【PD8/PD9】的确如手册所言,默认与VCP接口相连。  d; X+ S7 ?0 e& w- p' ]( u1 [+ V
上面是基于查询方式做了UART的发送,如果采用DMA方式呢?我们也可以顺便体验下。" i2 F; G$ }1 }; L1 l, T
我这里使用GPDMA1的CH0和CH1,分别实现UART3的接收与发送。UART3的DMA接收采用Circular模式,外设到内存的传输方向;发送采用Normal模式,内存到外设的传输方向。源端与目的端访问数据宽度均为Byte。DMA请求使用标准请求模式。
# x6 y! [: r7 [, A( ]
微信图片_20230804215604.png
! _1 A* O; ?5 |4 N3 [, O- C. ~
微信图片_20230804215605_2.png
: B- D( {7 S1 w0 s, V1 ~! L! ?
微信图片_20230804215605_1.png

7 U3 Z. q9 F+ v( [0 G( ^; Z4 ], u# [& P; t, ~
创建基于STM32HAL库的工程,添加、整理用户代码。) M+ n0 c% m' j
  1. #deifne RX_SIZE  (16)/ y* k5 P+ N& ^- ]$ j% a0 d, M. q
  2. #define TX_SIZE  (33)
    + u2 }: b3 b9 {3 ?& l+ j
  3.   0 T7 ?  i+ e0 x: h( Z
  4. ALIGN_32BYTES (uint8_t tx1_buffer[])="**STM32H5 UART Test with Polling**\r\n\n";
    # P" d4 Z; _6 P. ?/ [
  5. ALIGN_32BYTES (uint8_t tx_buffer[])="**STM32H5 UART Test with DMA**\r\n\n";
    % j' M! m  q( ^9 k5 g2 K( ?- `
  6. ALIGN_32BYTES (uint8_t rx_buffer[16]);8 h1 H8 K0 E0 J
  7.   ; Z; Q5 F; H) C* s
  8.   __HAL_LINKDMA(&huart3, hdmarx , handle_GPDMA1_Channel0);
    9 @- a( m$ n6 N
  9. * I. K, B/ s- V: ?5 w  @7 ?4 Y* y" E( K
  10.   __HAL_LINKDMA(&huart3, hdmatx, handle_GPDMA1_Channel1);9 |4 j# L0 U4 G' Z9 T
  11.     * E$ q# Z+ l1 K2 X! k& g" O: N
  12.    HAL_UART_Receive_DMA(&huart3,  rx_buffer,  RX_SIZE);//For RX: z# S9 g( |1 \% z  X, P0 b& \: C; x
  13.    
    4 j# ~" o" \$ e6 w9 {- z
  14.    。。。。。) A7 K( T( v. V
  15.      /* USER CODE BEGIN WHILE */
    2 p& }5 b1 o4 u" L
  16. while (1)$ m4 u$ ^4 C9 c$ g3 {; y
  17.   {
    / }/ \* z$ y  U, p2 M9 {
  18.   u4 f  W9 `: z5 }$ k
  19.   HAL_Delay(2023);) v  y# A& h; \( `0 y
  20. 1 F% j$ s! i* ~3 y, w3 w
  21.   HAL_UART_Transmit_DMA(&huart3, (uint8_t *)tx_buffer, TX_SIZE);
    7 R7 n5 r$ I# `4 Q
  22.   //HAL_UART_Transmit(&huart3, (uint8_t *)tx1_buffer, 37,0xfff);) t5 p# |" u9 r* |& {& Y' t" c
  23.    huart3.gState = HAL_UART_STATE_READY;$ ]3 ?; n, @1 i/ `( W
  24.     9 l7 a; Y- z7 \/ j( X8 n3 O; [
  25.   }
复制代码
   
稍加调试后运行程序看结果。下面左侧窗口为UART3通过DMA发送出来的信息,右侧为串口助手发送后UART3通过DMA接收到的信息。
  l. o5 A# o" j$ @+ Z* @
& o! J$ |0 ~0 B2 ?$ S* M
微信图片_20230804215605.png
6 Q  T+ V7 s6 U: v/ k1 s
好,基于STM32H5的UART通信的演示就到这里。内容不难,主要是做了些验证。这些验证过程及结果的确也能为初次接触该板或该MCU系列的人在遇到相关问题时予以信心,在调试受阻时能尽快地锁定问题方向。毕竟做开发调试时,信心和问题方向都是非常重要的因素。
3 [) @9 T1 h3 h
转载自: 茶话MCU
如有侵权请联系删除
- t0 I. s; d2 M4 v% `" k1 f6 u3 W
$ ~$ g4 d3 Q1 P4 x
收藏 评论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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版