找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[BSP] PDMA 每次传送都要重新设定吗?

[复制链接]
楼主
chrishu 发表于 2023-12-19 10:29:02 | 显示全部楼层
PDMA传输的操作模式分为基本模式和集散模式
基本模式就是按照描述符表里设置的传输规则将设定个数的数据搬运完成就结束了,会停止。
集散模式是按照第一张表的描述符搬运完指定数据后,会寻找第二张描述符表,按照第二张表的规则搬运,结束后会寻找下一张表,如果最后一张表指向的下一张表是第一张表。那么就可以实现循环搬运一直不停。
SPI_PDMA_LoopTest例程采用的是基本模式,如果想要使用集散模式可以参考PDMA_ScatterGather或PDMA_ScatterGather_PingPongBuffer例程

回复 支持 反对

使用道具 举报

沙发
chrishu 发表于 2023-12-20 10:56:51 | 显示全部楼层
例程是写的memory to memory之间传输。需要和谁传输就改成和谁传输(芯片支持的类型就行),再填好传输相应的源地址和目标地址即可。




回复 支持 反对

使用道具 举报

板凳
chrishu 发表于 2023-12-21 13:23:02 | 显示全部楼层
游客 121.29.98.x 发表于 2023-12-21 11:20
例程是写的memory to memory之间传输。需要和谁传输就改成和谁传输(芯片支持的类型就行),再填好传输 ...

如何操作,上一次回复里已经截图告诉你了
回复 支持 反对

使用道具 举报

地板
chrishu 发表于 2023-12-21 13:47:40 | 显示全部楼层
下图是在M487上写的一个应用,通过PDMA的集散模式(两张表)循环将一个数组的数据搬运到UART1的TX.你要用到M031上时注意看一下外设寄存器名字是否一致。



回复 支持 反对

使用道具 举报

5#
chrishu 发表于 2023-12-22 17:51:23 | 显示全部楼层
请问一下DMA_DESC对应的结构体是你自己定义的吗?你的next是对应我们例程里的offset吗?
没有看到你的整体配置,从else里看到的是这样表设置的基本模模式,传完就PDMA就停止了。
例程UART_PDMA用的基本模式,所以会重复启动

你可以看一下前面的回复,再结合TRM手册里的详细描述,再去看例程里基本模式和集散模式的配置和使用,可能会更明白一些。
回复 支持 反对

使用道具 举报

6#
chrishu 发表于 2023-12-25 11:31:10 | 显示全部楼层
游客 183.198.2.x 发表于 2023-12-22 18:27
DMA_DESC 是M460系列的 pdma reg 寄存器里面的啊!

基本模式是直接设置的寄存器。集散模式是自己在内存里定义两张表,每次传完会将下一张表加载到寄存器里,示意图如下:

如之前回复所说,确定用集散模式就参考PDMA_ScatterGather_PingPongBuffer
你说例程是memory to memory的,需要memory 和外设传输,我有截图说明怎么去修改描述符表。

之后你又说不知道怎么操作 例如修改成 PDMA_UART0_TX。也有截图UART TX发送的描述符表如下图:
到此集散模式的描述符表配置已经完全ok了,直接到例程里这么改就可以测试了。

回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU