打印
[技术问答]

F4A0,DMA可以一次请求传输多个数据块吗?如何设置?

[复制链接]
2083|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
newiot|  楼主 | 2024-3-31 08:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
F4A0,DMA介绍如下:
■ 数据块最小为 1 个数据,最多可以是 1024 个数据
■ 每个数据的宽度可配置为 8bit、16bit 或 32bit
■ 可以配置最多 65535 次传输
■ 源地址和目标地址可以独立配置为固定,自增,自减,循环或指定偏移量的跳转
■ 可产生 3 种中断:块传输完成中断、传输完成中断、传输错误中断。每种中断都可以配置是否屏
蔽。其中块传输完成、传输完成可作为事件输出,可作为其它外围模块的触发源
■ 支持连锁传输功能,可实现一次请求传输多个数据块


假设一个数据块是1000个字节 ,可以一次请求传输64个数据块吗?也就相当于一次请求传输64*1000个字节,对吗?有demo吗?





使用特权

评论回复
沙发
beacherblack| | 2024-4-2 19:00 | 只看该作者
关于F4A0单片机的DMA(Direct Memory Access,直接内存访问)功能,它允许在没有CPU干预的情况下进行高速数据传输。这对于提高系统效率和降低CPU负载非常有益,特别是在需要处理大量数据或快速响应外部设备的场景中。

使用特权

评论回复
板凳
caigang13| | 2024-4-2 20:37 | 只看该作者
DMA是配置一次操作多长的字节数,和数据分成几个块没有关系吧。

使用特权

评论回复
地板
zerorobert| | 2024-4-4 10:26 | 只看该作者
DMA控制器通常能够支持连锁传输功能,这意味着一旦配置好,它可以连续地执行多次数据传输操作。例如,如果设定每个数据块为1000个字节,DMA可以被设置为一次请求传输64个这样的数据块,也就是一次性传输64KB的数据量。

使用特权

评论回复
5
tifmill| | 2024-4-4 11:46 | 只看该作者
在需要传输数据时,可以通过调用DMA相关的API函数(如STM32 HAL库中的HAL_DMA_Start()函数)来启动DMA传输。在传输过程中,DMA控制器会根据初始化结构体中的设置,自动完成多个数据块的传输。

使用特权

评论回复
6
everyrobin| | 2024-4-4 13:37 | 只看该作者
DMA传输需要配置源地址、目标地址、传输数据量等参数。在配置DMA时,可以设置一次传输的数据量,也就是块大小。

使用特权

评论回复
7
kkzz| | 2024-4-4 15:42 | 只看该作者
DMA还具有循环模式,可以在传输完成后自动重新开始传输,适用于需要连续传输大量数据的场景。

使用特权

评论回复
8
xiaoyaodz| | 2024-4-4 17:52 | 只看该作者
F4系列通常具有多个DMA通道,每个通道可以独立配置和运行。

使用特权

评论回复
9
albertaabbot| | 2024-4-4 19:56 | 只看该作者
通过相应的寄存器使能DMA传输,并配置所需的中断。例如,可以设置块传输完成中断和传输完成中断等。

使用特权

评论回复
10
mattlincoln| | 2024-4-4 22:01 | 只看该作者
在DMA传输过程中,可以通过检查DMA状态寄存器来了解传输的状态

使用特权

评论回复
11
51xlf| | 2024-4-5 20:37 | 只看该作者
DMA(Direct Memory Access,直接内存访问)控制器允许外设直接访问内存,而不需要CPU的介入,这样可以提高系统的效率和性能。

使用特权

评论回复
12
pl202| | 2024-4-5 23:00 | 只看该作者
MA传输完成后会产生中断。你可以通过设置DMA_CCRx寄存器中的相应位来启用或屏蔽这些中断。例如,你可以启用块传输完成中断和传输完成中断,并将它们配置为事件输出,作为其他外围模块的触发源。

使用特权

评论回复
13
modesty3jonah| | 2024-4-6 11:38 | 只看该作者
在DMA初始化结构体中,设置总的传输次数。每次请求(由DMA触发源触发一次)启动一个数据块的传输。

使用特权

评论回复
14
phoenixwhite| | 2024-4-6 13:32 | 只看该作者
在DMA_CMARx寄存器中分别设置源地址和目的地址。源地址是数据将要被读取的位置,而目的地址是数据将要被写入的位置。

使用特权

评论回复
15
bartonalfred| | 2024-4-6 15:28 | 只看该作者
DMA可以一次传输一个数据块,这个数据块可以由多个数据组成,例如一个数组。

使用特权

评论回复
16
febgxu| | 2024-4-6 17:28 | 只看该作者
设置数据块的大小(通常范围是1到1024个数据单位),以及总的传输次数。每次DMA触发源触发一次,就会启动一个数据块的传输。

使用特权

评论回复
17
benjaminka| | 2024-4-6 20:42 | 只看该作者
使用DMA_Start(DMA_HandleTypeDef* hdma, uint32_t Config)函数启动DMA传输。在这个函数中,你可以传递DMA初始化结构体中的参数。

使用特权

评论回复
18
yorkbarney| | 2024-4-7 07:54 | 只看该作者
在DMA初始化结构体中,设置数据块的大小。例如,可以设置数据块包含1至1024个数据,每个数据的宽度可配置为8位、16位或32位。

使用特权

评论回复
19
qiufengsd| | 2024-4-7 10:20 | 只看该作者
DMA传输完成后,可以触发中断,在中断服务程序中进行后续处理,如更新源地址、目标地址等,以传输下一块数据。

使用特权

评论回复
20
macpherson| | 2024-4-7 12:29 | 只看该作者
一旦所有配置完成,就可以通过写DMA_CCRx寄存器的相应位来启动DMA传输。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

79

帖子

1

粉丝