硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7427|回复: 8
收起左侧

[DMA] STM32H7的DMA1和DMA2学习笔记(2018-08-04 V1.0)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-4 11:34:24 | 显示全部楼层 |阅读模式
说明:
这个知识点非常重要,放在前面说明
使用DMA的FIFO和突发,务必要慎重又慎重,一般的外设直接关闭即可。因为DMA使用时要注意的事项太多太多。
下面是简单的主要内容整理:
1、FIFO禁止模式,即官方手册里面所说的直接模式,务必要保证外设数据宽度和内存数据宽度是一样的,而且这个模式不支持突发,即使配置了,也是无效的。另外这个模式不可用于存储器到存储器的数据传输。
2、FIFO使能模式,这种模式是配置突发模式一起搞的,使用时一定要谨慎再谨慎,各种注意事项。(使能FIFO,不使用突发模式也是可以的,这点要注意)。
3、FIFO的主要目的就是为了解决源和目的数据宽度不同而搞的,仅仅16字节大小,所以缓冲的目的并不大,另外就是配合下突发模式。
4、独立的源和目标传输宽度(字节、半字、字):源和目标的数据宽度不相等时, DMA 自动封装/解封必要的传输数据来优化带宽。这个特性仅在 FIFO 模式下可用。这个特性非常重要,在H7和F4的SDIO操作时可以用。无需像F1系列那样强行数据缓冲的4字节对齐要求。


==============================================================================
                                                                  ##### DMA1和DM2特性  #####
==============================================================================  


1、由于总线矩阵的存在,各个主控的道路四通八达,从而可以让DMA和CPU同时开工,但是注意一点,如果他们同时访问的同一个外设,会有一点性能影响的。

2、DMA1和DMA2都有个8个Stream,也就是输入,而每个Stream有115个触发源可供选择,详情可以看此贴:http://www.armbbs.cn/forum.php?mod=viewthread&tid=88811

3、DMA1和DMA2都支持硬件FIFO和双缓冲配置。

4、DMA的优先级可通过软件配置,支持very high, high, medium, low四个等级,如果配置的优先级相同,则由Stream的序号决定,Stream0最高,Stream7最低。

5、DMA的传输数据项目数可以有DMA流控制决定,也就是大家配置可传输的项目数,范围1-65525(单位可以是字节,半字和字)。也可以有外设流控制决定,比如SDIO。

6、源地址和目的地址的数据宽度可以不同,但是必须要开启DMA的FIFO功能。

7、DMA主要有两种模式,一个是Normal正常模式,传输一次后就停止传输;另一种是Circular循环模式,会一直循环的传输下去,即使有DMA中断,传输也是一直在进行的。

8、支持 4 个、 8 个和 16 个节拍的增量突发传输。突发增量的大小可由软件配置,通常等于外设 FIFO 大小的一半。


1、外设到存储器的DMA传输
1.png

2、存储器到外设的DMA传输
2.png

3、存储器到储存器的DMA传输
888.png


使用突发和循环模式,要注意这里的问题:
1.png



使能双缓冲区模式时,自动使能循环模式。由于存储器到存储器模式与循环模式不兼容,所以当使能双缓冲区模式时,不允许配置存储器到存储器模式。
双缓冲模式的地址在运行期间是可以修改的,使用其中一个地址时,另一个地址可修改。

QQ截图20180804164955.png


可编程数据宽度、封装/解封、字节序
不同数据宽度的传输

55.png

注意事项:



单次传输和突发传输
QQ截图20180804172924.png


其它问题:http://www.armbbs.cn/forum.php?mod=viewthread&tid=77359

FIFO缓冲
这里最需要注意的就是配合突发时的注意事项和FIFO刷新了



注意事项:


FIFO刷新:




流控制,SDIO的DMA有用


注意事项


DMA暂停注意事项


最后一个,可能的DMA配置汇总



回复

使用道具 举报

0

主题

22

回帖

188

积分

初级会员

积分
188
发表于 2018-8-4 14:52:40 | 显示全部楼层
硬汉兄,请教下,H7的DCMI-DMA怎样配置呀,看文档DMA项好像找不到。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2018-8-4 15:12:39 | 显示全部楼层
lzts 发表于 2018-8-4 14:52
硬汉兄,请教下,H7的DCMI-DMA怎样配置呀,看文档DMA项好像找不到。

用CubeMX生成就行,如果你手头有硬件的话,可以测试下配置。
回复

使用道具 举报

0

主题

22

回帖

188

积分

初级会员

积分
188
发表于 2018-8-4 15:48:07 | 显示全部楼层
eric2013 发表于 2018-8-4 15:12
用CubeMX生成就行,如果你手头有硬件的话,可以测试下配置。

谢谢,硬件是有,想用h7作些图像处理,怕性能不够,还特意去弄寄存器方式,那知就卡在DCMI的DMA了,找文档的DMA方式竟然找不到。看来又得学CudbeMX了。蛋疼呀。H7的DCMI和F7,F4区别真大。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2018-8-4 17:42:03 | 显示全部楼层
更新完毕。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-1-12 01:04:34 | 显示全部楼层
重温下这个帖子。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2021-3-27 06:21:19 | 显示全部楼层
eric2013 发表于 2019-1-12 01:04
重温下这个帖子。

我用VisualGDB 写了个DMA一直读ADC1 ,在Keil 正常运行,VisualGDB调试发现DMA中断只进一次就发生TE传输错误了,    if ((tmpisr_dma & (DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
tmpisr_dma 是 0x00080000 Keil正常tmpisr_dma应该是 0x00300000

HAL_ADC_Start_DMA执行了以后看到DMA1的LISR是0x00080000
Keil编译的正常LISR应该是 0x0000100B


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-3-27 08:07:59 | 显示全部楼层
张静茹 发表于 2021-3-27 06:21
我用VisualGDB 写了个DMA一直读ADC1 ,在Keil 正常运行,VisualGDB调试发现DMA中断只进一次就发生TE传输错 ...

GCC的话,我只在Embedded Studio下载玩过,测试这些都正常。

VisualGDB 使用GCC的话,不太了解。
回复

使用道具 举报

8

主题

157

回帖

181

积分

初级会员

积分
181
发表于 2023-8-25 14:32:10 | 显示全部楼层
eric2013 发表于 2021-3-27 08:07
GCC的话,我只在Embedded Studio下载玩过,测试这些都正常。

VisualGDB 使用GCC的话,不太了解。

硬汉哥,外设DMA方式操作, 什么时候会用到FIFO?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 02:35 , Processed in 0.230621 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表