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

基于STM32U5片内GPDMA Burst传输应用示例

[复制链接]
STMCU小助手 发布时间:2022-8-14 15:55
有人想使用STM32U5系列的GPDMA的burst【分组、节拍、突发】传输功能,似乎遇到了点阻碍。我这里尝试下,稍作演示,仅供参考。

* U! x9 ^" Z7 G- M  i8 d+ Y: x
我用TIMER1更新事件触发DMA, DMA工作在非循环模式,DMA将数据从源内存区传输到目的内存区。我先准备下面两个数组。
0 f) e5 D; F* j# v. |$ J
微信图片_20220814155500.png

; I% F! q1 L  z! H$ h+ m
微信图片_20220814155455.png
9 z' M7 t- Q% I& b. d
当两端访问数据宽度设置一样,burst大小始终为1时,传输是很顺畅的,不会有啥问题,结果符合预期。
8 _. x$ X9 Z$ ]' S7 H6 v# G. {- z
微信图片_20220814155449.png
4 v: N! Q3 x4 M7 T, d9 m, E
基于上面配置,结果就很正常。结果如下图,也正是我期望的结果。
/ ]: W' Z* z9 L7 M! ?! ~' a! g
微信图片_20220814155446.png
6 O. [# q$ w5 [
当我们尝试使用DMA burst功能时,发现结果就不对劲了,比方我希望源端按字节读取,然后基于BURST功能打包,目的端按半字来提取,发现结果跟预期不一样。我们一起看看:
微信图片_20220814155442.png

; Q9 o1 F' z/ e& @. V3 F
显然,每半个字的高字节都是填充的0。那是怎么回事呢?
6 Y( t: d- R3 z' Q/ ]
我们再看看源端按字节读取,然后基于BURST功能打包,目的端按字来提取,看看结果又会怎么样?

" T7 K2 ^: p3 X( r" q, h6 H
微信图片_20220814155437.png

- h9 l  C8 f/ ?( K' N/ F8 y
结果变成了上面的那个样子,显然结果严重不符合预期。

% a3 h0 }' {" W3 o9 q
那是怎么回事呢? 经过反复修改参数,结合我之前之前玩过F4系列DMA burst传输功能以及对STM32 DMA burst功能的理解,感觉这里的BUSRT传输应该是工作了。对DMA burst的基本配置以及我的用户实现代码还是比较自信的。 而且目前结果上来看,有数据传输,且数据结果是有规律的,数据并不混乱,程序也没跑飞,就是感觉数据好像在DMA BURST传输过程中被处理过。
( R% S- ?/ F$ m. d! ]+ V
刚好这两天也就随机性瞄了下这块,隐约记得它是有数据处理功能的。【说实话,U5系列DMA好复杂,比其它M4核STM32的DMA复杂很多。要沉下心来细看真不易!!】

, P/ G2 v8 k7 M' {: _" K' g
想到这里,不禁自我怀疑。难道配置哪里还有问题,没做到位?
+ m8 G- z! F5 ?- R9 w) P, U; Y
继续查看CubeMx界面下有关GPDMA的配置,嗯?我看到了一直被我无视的一个地方:

1 }& G4 a* J  n% G$ B
微信图片_20220814155433.png

0 x$ l1 n. t% G* \% H
难道问题是在这里?此处有乾坤?

! P6 }6 I& y  I7 c( r" v* \
。。。。。。其实,问题真的就在这里。
5 I* K: N/ b4 d) I4 S- k
当我将那个Data Handling 配置由Disable转为Enable基本恍然大悟了。

7 D( D1 K$ n# L3 h9 F4 N
我们回过头去查看手册,手册里面对GPDMA的数据处理功能也做了描述。下图是相关描述里的一个表格截图。
1 X" z: |* x8 v+ f) F
微信图片_20220814155429.png

! V, m7 |1 R+ a* k  {, S4 ~
关于GPDMA的数据处理功能,这里就不解读了,需要时我们可以自行研读手册。对STM32U5的DMA功能,我只能说:哇塞!功能真强大!

5 Q9 R. w8 M) d$ [0 W7 T  x  U$ _
我们还是继续回到上面的测试。当我使能Data handling功能,并选中满足我当前需求的一个选项后,一切便拨云见日。

+ Y  B, d% Z+ X# _6 n6 n2 s
微信图片_20220814155426.png

, [8 k" X! J" E/ I0 u# g& O( t2 ?
注意上面截图中那个关于数据对齐的选项。意思还是比较简单明了,当源数据宽度小于目的端数据宽度时,按照目的端数据宽度打包摆放。

9 ]) L* d; }! E! `9 N" W) O
当我在前面BURST配置的前提下,再加上这个Data Handling配置就能输出符合预期的结果了。

, D' x* u. O0 ~; j
换句话说,我前面的DMA Burst基本配置是没有问题的,只是没有选择合适的Data Handling方式导致没有呈现我们预期的效果,这也正是它跟其它系列不一样的地方。

8 z. B% s, x9 x& f
这里涉及的用户代码很简单,也干脆贴过来,供有需要的参考【初始化配置使用CubeMx】:
; }1 \  V+ C! [& }# m8 G# c
微信图片_20220814155423.png
3 f  \3 S* n. l9 C# f% a; Z. Z: j8 H
最后顺便提醒一点,上面那个DMA启动函数里的size变量【箭头所指的地方】,是按照字节数来算的,这点要注意,这也是跟其它系列不一样的地方。

, i5 X/ D& I# ~2 Q0 ~
转载自 茶话MCU
1 `% a% ]% W( X
赞 收藏 评论0 发布时间:2022-8-14 15:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

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