STM32 之 DMA学习笔记

外设到存储器模式

使能这种模式(将 DMA_SxCR 寄存器中的位 EN 置 1)后,每当外设请求产生时,数据流都会启动数据源到 FIFO 的传输。达到 FIFO 的阈值级别时,FIFO 的内容移出并存储到目标中。

如果 DMA_SxNDTR 寄存器达到零、外设请求传输终止(在使用外设流控制器的情况下)或DMA_SxCR 寄存器中的 EN 位由软件清零,传输即会停止

直接模式下(当 DMA_SxFCR 寄存器中的 DMDIS 值为“0”时),不使用 FIFO 的阈值级别控制:每完成一次从外设到 FIFO 的数据传输后,相应的数据立即就会移出并存储到目 标中。

只有赢得了数据流的仲裁后,相应数据流才有权访问 AHB 源或目标端口。系统使用在DMA_SxCR 寄存器 PL[1:0] 位中为每个数据流定义的优先级执行仲裁。

存储器到外设模式

使能这种模式(将 DMA_SxCR 寄存器中的 EN 位置 1)时,数据流会立即启动传输,从源完全填充 FIFO。
每次发生外设请求,FIFO 的内容都会移出并存储到目标中。当 FIFO 的级别小于或等于预定义的阈值级别时,将使用存储器中的数据完全重载 FIFO。

如果 DMA_SxNDTR 寄存器达到零、外设请求传输终止(在使用外设流控制器的情况下)或DMA_SxCR 寄存器中的 EN 位由软件清零,传输即会停止

直接模式下(当 DMA_SxFCR 寄存器中的 DMDIS 值为“0”时),不使用 FIFO 的阈值级别。一旦使能了数据流,DMA 便会预装载第一个数据,将其传输到内部 FIFO。一旦外设请求数据传输,DMA 便会将预装载的值传输到配置的目标。然后,它会令要传输的下一个数据再次载入内部空 FIFO。预装载的数据大小为 DMA_SxCR 寄存器中 PSIZE 位字段的值。

只有赢得了数据流的仲裁后,相应数据流才有权访问 AHB 源或目标端口。系统使用在DMA_SxCR 寄存器 PL[1:0] 位中为每个数据流定义的优先级执行仲裁。

循环模式

循环模式可用于处理循环缓冲区和连续数据流(例如 ADC 扫描模式)。可以使用 DMA_SxCR寄存器中的 CIRC 位使能此特性。当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应 DMA 请求。

双缓冲区模式

此模式可用于所有 DMA1 和 DMA2 数据流。通过将 DMA_SxCR 寄存器中的 DBM 位置 1,即可使能双缓冲区模式。除了有两个存储器指针之外,双缓冲区数据流的工作方式与常规(单缓冲区)数据流的一样。

使能双缓冲区模式时,将自动使能循环模式DMA_SxCR 中的 CIRC 位的状态是“无关”),并在每次事务结束时交换存储器指针。在此模式下,每次事务结束时,DMA 控制器都从一个存储器目标交换为另一个存储器目标。 这样,软件在处理一个存储器区域的同时,DMA 传输还可以填充/使用第二个存储器区域。双缓冲区数据流可以双向 工作(存储器既可以是源也可以是目标)。

DMA_SxCR 寄存器中的 CT 位为“0”时,可以修改DMA_SxM1AR寄存器,以修改存储器指针。当 CT =“1”时,试图写入此寄存器会将错误标志位 (TEIF) 置 1,并自动禁止数据流。
同理,当 DMA_SxCR 寄存器中的 CT 位为“1”时,可以写入 DMA_SxM0AR 寄存器。当 CT=“0”时,试图写入此寄存器会将错误标志位 (TEIF) 置 1,并自动禁止数据流。

对于所有其它模式(双缓冲区模式除外),一旦使能数据流,存储器地址寄存器即被写保护。

可编程数据宽度、封装/解封、字节序

要传输的数据项数目必须在使能数据流之前编程到 DMA_SxNDTR(要传输数据项数目位, NDT)中,当流控制器是外设且 DMA_SxCR 中的 PFCTRL 位置为 1 时除外。

当使用内部 FIFO 时,源和目标数据的数据宽度可以通过 DMA_SxCR 寄存器的 PSIZE 和 MSIZE 位(可以是 8、16 或32 位)编程。

单次传输和突发传输

DMA 控制器可以产生单次传输或 4 个、8 个和 16 个节拍的增量突发传输。突发大小通过软件针对两个 AHB 端口独立配置,配置时使用 DMA_SxCR 寄存器中的MBURST[1:0] 和 PBURST[1:0] 位。突发大小指示突发中的节拍数,而不是传输的字节数。为确保数据一致性,形成突发的每一组传输都不可分割:在突发传输序列期间,AHB 传输会 锁定,并且 AHB 总线矩阵的仲裁器不解除对 DMA 主总线的授权。根据单次或突发配置的情况,每个 DMA 请求在 AHB 外设端口上相应地启动不同数量的传输。
●当 AHB 外设端口被配置为单次传输时,根据 DMA_SxCR 寄存器 PSIZE[1:0] 位的值, 每个 DMA 请求产生一次字节、半字或字的数据传输。
●当 AHB 外设端口被配置为突发传输时,根据 DMA_SxCR 寄存器 PBURST[1:0] 和PSIZE[1:0] 位的值,每个 DMA 请求相应地生成 4 个、8 个或 16 个节拍的字节、半字或字的传输。对于需要配置 MBURST 和 MSIZE 位的 AHB 存储器端口,必须考虑与上述相同的内容。在直接模式下,数据流只能生成单次传输,而 MBURST[1:0] 和 PBURST[1:0] 位由硬件强制配置。必须选择地址指针(DMA_SxPAR 或 DMA_SxM0AR 寄存器),以确保一个突发块内的所有 传输在等于传输大小的地址边界对齐。

FIFO

FIFO 结构
FIFO 用于在源数据传输到目标之前临时存储这些数据。每个数据流都有一个独立的 4 字 FIFO,阈值级别可由软件配置为 1/4、1/2、3/4 或满。为了使能 FIFO 阈值级别,必须通过将 DMA_SxFCR 寄存器中的 DMDIS 位置 1 来禁止直接 模式。FIFO 的结构随源与目标数据宽度而不同。

FIFO 阈值与突发配置
选择 FIFO 阈值(DMA_SxFCR 寄存器的位 FTH[1:0])和存储器突发大小(DMA_SxCR 寄存 器的 MBURST[1:0] 位)时需要小心:FIFO 阈值指向的内容必须与整数个存储器突发传输完全 匹配。如果不是这样,当使能数据流时将生成一个 FIFO 错误(DMA_HISR 或 DMA_LISR 寄存器的标志 FEIFx),然后将自动禁止数据流。允许的和禁止的配置在表 41:FIFO 阈值 配置中介绍。

FIFO 刷新
当复位 DMA_SxCR 寄存器中的 EN 位时,可以刷新 FIFO。禁止数据流时可能仍有某些数据存留在 FIFO 中,DMA 控制器会将剩余的数据继续传输到目标(即使已经有效禁止了数据流)。
刷新完成时,会将 DMA_LISRDMA_HISR 寄存器中的传输完成状态位 (TCIFx) 置 1。此时, DMA_SxNDTR 寄存器的值显示了目标存储器现有多少可用数据项。
请注意在 FIFO 刷新操作期间,如果 FIFO 中要传输到存储器的剩余数据项的数目(以字节为单位)小于存储器数据宽度(例如在 MSIZE 配置为字时 FIFO 中为 2 个字节),则会使用在 DMA_SxCR 寄存器中的 MSIZE 位设置的数据宽度发送数据。这意味着将使用非预期值写入存储器。软件可以读取 DMA_SxNDTR 寄存器来确定包含良好数据的存储器区域(起始地址和最后地址)。如果 FIFO 中剩余数据项的数目小于突发大小,并且数据流通过将 DMA_SxCR 寄存器MBURST 位置 1 进行配置来管理在 AHB 存储器端口上的突发传输,则使用单次传输来完成FIFO 的刷新。

直接模式

默认情况下,FIFO 以直接模式操作(将 DMA_SxFCR 中的 DMDIS 位置 1),不使用 FIFO阈值级别。如果在每次 DMA 请求之后,系统需要至/自存储器的立即和单独传输,这种模式非常有用。当在直接模式(禁止 FIFO)下将 DMA 配置为以存储器到外设模式传输数据时,DMA 会将一 个数据从存储器预加载到内部 FIFO,从而确保一旦外设触发 DMA 请求时则立即传输数据。为了避免 FIFO 饱和,建议使用高优先级配置相应的数据流。该模式仅限以下方式的传输:●源和目标传输宽度相等,并均由 DMA_SxCR 中的 PSIZE[1:0] 位定义(MSIZE[1:0] 位的 状态是“无关”)●不可能进行突发传输(DMA_SxCR 中的 PBURST[1:0] 和 MBURST[1:0] 位的状态是“无 关”)当实现存储器到存储器传输时不得使用直接模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值