链表项示例第一个链表项存放在0x20000,定义了要传输的第一个数据块,这个数据块是存放在0x0A200和0x0AE00之间的数据。
-
源起始地址0x0A200
-
目标地址设为目标外设地址
-
传输数据宽度:1个字(32位)
-
传输大小:3072个字节(0xC00)
-
源和地址突发大小:16个传输
-
下个LLI地址:0x20010
第二个链表项存放在0x20010,描述了要传输的下个数据块:
-
源起始地址0x0B200
-
目标地址设为目标外设地址
-
传输数据宽度:1个字(32位)
-
传输大小:3072个字节(0xC00)
-
源和目标突发大小:16个传输
-
下个LLI地址:0x20020
这样,一个链表就形成了,每个链表项都指向链表中的下一个链表项。为了初始化DMA流,需要将第一个链表项(位于0x20000)编程到DMA。当第一个数据包被传输后,下个LLI就自动被装载。最后一个LLI存放在0x20070,它包含:
-
源起始地址0x11200
-
目标地址设为目标外设地址
-
传输数据宽度:1个字(32位)
-
传输大小:3072个字节(0xC00)
-
源和目标突发大小:16个传输
-
下个LLI地址:0x0
由于下个LLI地址被设为0,因此,这是最后一个描述符,而且,DMA通道在传输完最后这个数据项后被禁能。当然,通道也可能设置成产生中断来向ARM处理器指明通道可以被重新编程了。
想了解更多关于DMA数据传输的具体实现吗?可以查看DMA数据传输原理以及STM32+DMA数据传输的高效利用。这些资源不仅详细讲解了DMA的工作机制,还提供了实用的编程实例和优化技巧。
如果你对DMA在不同系统下的应用感兴趣,可以看看在RedHat Linux下通过DMA传输数据和Nios的DMA传输,这些文章为你提供了跨平台的知识扩展。
对于想要实践的朋友,不妨下载DMA数据传输程序.zip,亲自动手试试吧!
暂无评论