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

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

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

% r; }! `; |& f' s2 C, L
微信图片_20230804215604_4.png

5 B, s, S/ s% w% c1 R
基于上面硬件条件,使用CubeMx简单配置即可验证。
0 o9 w. r  \, D; h% Z& F
/ W7 L5 h$ A: A7 B5 D) h2 j& L
微信图片_20230804215604_3.png
; \1 w- c7 c9 \* I+ P( V
微信图片_20230804215604_2.png

, ?! f5 v7 y& O+ c: A/ e1 U8 v+ W/ j
创建工程后,在用户代码里调用HAL_UART_Transmit(&huart3, (uint8_t *)tx1_buffer,  Size, TimeOut)函数,在串口输出终端即可看到结果。看来一切正常。

% ~3 X% o( D) W
微信图片_20230804215604_1.png
! |& K% B" M7 y; ?5 a# j, j* J
说明UART3的TX/RX脚【PD8/PD9】的确如手册所言,默认与VCP接口相连。- w# I- [/ E0 R; G% l  `  ^# D: B
上面是基于查询方式做了UART的发送,如果采用DMA方式呢?我们也可以顺便体验下。
3 ]9 ^8 e% B6 l4 X+ b2 ]5 v4 t  z
我这里使用GPDMA1的CH0和CH1,分别实现UART3的接收与发送。UART3的DMA接收采用Circular模式,外设到内存的传输方向;发送采用Normal模式,内存到外设的传输方向。源端与目的端访问数据宽度均为Byte。DMA请求使用标准请求模式。

: {) D$ e, \& u( ?9 Q
微信图片_20230804215604.png

, @# b9 _0 E. r+ A! \% @) v* ^* d0 ~
微信图片_20230804215605_2.png

0 O, O. I7 f% t- `# g; f* u
微信图片_20230804215605_1.png
- }9 x# }4 E5 I( ]1 d$ Q4 Y7 w+ g

2 ^/ S4 F3 T# S* n: x9 m6 Y
创建基于STM32HAL库的工程,添加、整理用户代码。
2 l1 V1 h9 o5 v3 g
  1. #deifne RX_SIZE  (16)7 z5 u6 h4 [( [
  2. #define TX_SIZE  (33)
    ( o' i, s" {$ Z$ l" K: x
  3.   " v0 d1 G. W$ @: y2 q) n, y
  4. ALIGN_32BYTES (uint8_t tx1_buffer[])="**STM32H5 UART Test with Polling**\r\n\n";3 B" i* _. A' Z; _/ K
  5. ALIGN_32BYTES (uint8_t tx_buffer[])="**STM32H5 UART Test with DMA**\r\n\n";
    % c. O9 J, Z6 I: E; x4 r( x2 Q5 [
  6. ALIGN_32BYTES (uint8_t rx_buffer[16]);/ T" @  Q7 V' F, {- F( [
  7.   - a" G( R$ d* T, m, W- z" e
  8.   __HAL_LINKDMA(&huart3, hdmarx , handle_GPDMA1_Channel0);9 y$ U% k3 B5 i" c

  9. ! d' K/ A9 K# ]2 J5 x
  10.   __HAL_LINKDMA(&huart3, hdmatx, handle_GPDMA1_Channel1);
    ( n1 g6 |- _" w. |3 G
  11.    
    1 `( I/ u, e6 j7 y6 B  z2 g
  12.    HAL_UART_Receive_DMA(&huart3,  rx_buffer,  RX_SIZE);//For RX% s- O$ H$ h) J
  13.    
    ) k7 R& v! _1 O6 z- ?
  14.    。。。。。# d- y/ A; G6 _5 a! Q, d
  15.      /* USER CODE BEGIN WHILE */
    0 _- `" \+ F/ r$ l# ~/ Q1 j
  16. while (1)
    % Z9 _4 S7 ~  M4 B
  17.   {7 W' b6 C0 `' c* }
  18. 2 E/ p: }1 P8 a/ [" B" F' C3 w
  19.   HAL_Delay(2023);' D: k% J7 R' [4 T

  20. 5 Y5 n# k5 w; F- g% j$ t: y& R
  21.   HAL_UART_Transmit_DMA(&huart3, (uint8_t *)tx_buffer, TX_SIZE);
    7 Y, \3 d3 J7 r1 f1 @
  22.   //HAL_UART_Transmit(&huart3, (uint8_t *)tx1_buffer, 37,0xfff);- _0 _+ a: `2 V5 L! Z' [' x
  23.    huart3.gState = HAL_UART_STATE_READY;/ a" \1 ~, I% `+ v! P
  24.     % b; j# ?: I4 O8 d$ I5 f5 I# ~8 d
  25.   }
复制代码
   
稍加调试后运行程序看结果。下面左侧窗口为UART3通过DMA发送出来的信息,右侧为串口助手发送后UART3通过DMA接收到的信息。+ O8 i; P: g* [9 `. j, R
& e8 P* G" p- c1 h! E  @
微信图片_20230804215605.png
5 ]2 g2 N- Z7 y& I5 c) N/ Q
好,基于STM32H5的UART通信的演示就到这里。内容不难,主要是做了些验证。这些验证过程及结果的确也能为初次接触该板或该MCU系列的人在遇到相关问题时予以信心,在调试受阻时能尽快地锁定问题方向。毕竟做开发调试时,信心和问题方向都是非常重要的因素。

$ Y3 g5 w6 B6 q
转载自: 茶话MCU
如有侵权请联系删除

, n9 L, ~# e0 k4 R8 ], f

  ?2 s7 g' c& P3 p/ m. a% e2 ?

点评

本人按您的示例添加,发现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 手机版