野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15132|回复: 7

关于DMA中FIFO模式的使用问题求助

[复制链接]
发表于 2016-7-19 11:18:35 | 显示全部楼层 |阅读模式
本帖最后由 望蓝天 于 2016-7-19 11:21 编辑

在学习DMA第二个例程--存储器到外设的实验中,由于对FIFO模式不理解,尝试使用FIFO模式传输数据到上位机
以下是我在原代码上的修改,为了便于观察,开头定义  uint8_t SendBuff[SENDBUFF_SIZE]={'A','B','C','D'};
设置外设数据宽度为半字,
设置存储器数据宽度为字节,
开启FIFO模式,并设置阈值为1/4即一个字。(根据参考手册中FIFO的结构,我以为数组中的数据全部进入FIFO缓存,4个字节都进去到达阈值后一次性全发出去了、、、、然并卵。。。)
存储器和外设的突发模式我也不知道要不要调,我以为存储器的突发模式要设置成4个节拍的一次突发,但是结果都一样。。

然后输出到串口调试工具,只有A C,16进制41 43 00 00,为什么不是41 42 43 44呢? QQ图片20160719103715.png
QQ图片20160719103038.png
给我讲讲FIFO 模式吧!还有节拍。。。



回复

使用道具 举报

 楼主| 发表于 2016-7-19 11:51:15 | 显示全部楼层
是不是因为USART是8位传输,所以才这样 的。。。。。那也应该是41 00 43 00啊
回复 支持 反对

使用道具 举报

发表于 2016-7-19 11:59:24 | 显示全部楼层
你设置的是发送多少个数据?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-19 12:01:41 | 显示全部楼层
定义uint8_t SendBuff[SENDBUFF_SIZE]={'A','0','B','0','C','0','D','0','E'};,结果是ABCDE   16进制:41 42 43 44 45 00 00 00 00
定义uint8_t SendBuff[SENDBUFF_SIZE]={'A','B','0','C','0','D','0','E','0'};   结果是A0000    16进制:41 30 30 30 30 00 00 00 00
貌似能说明一点点情况,但是最后4个00让人有点疑惑。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-19 12:02:52 | 显示全部楼层
flyleaf 发表于 2016-7-19 11:59
你设置的是发送多少个数据?

数组里的SENDBUFF_SIZE是4,发送4位byte
回复 支持 反对

使用道具 举报

发表于 2016-7-19 13:52:35 | 显示全部楼层
把DMA_PeripheralDataSize 设置成Word试下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-19 14:27:05 | 显示全部楼层
flyleaf 发表于 2016-7-19 13:52
把DMA_PeripheralDataSize 设置成Word试下

如果设置成字的话结果显示只有A了,16进制是41 00 00 00。
我觉得是USART每次只能发送8位导致的。我在帖子下面回复里面做了两步测试,设置的还是半字,你可以参考参考,我不知道为什么后面会有4个00
回复 支持 反对

使用道具 举报

发表于 2017-9-17 14:19:08 | 显示全部楼层
你看看我这个、、、DMA_MemoryDataSize可以设成Byte。。。。FIFO我是禁止的...后来又试了一下,开启FIFO后上位机收到了同样的数据。。其实是外设字节大小设置错了。但是我还是没有搞懂FIFO 怎么玩
1.JPG
2.JPG
3.JPG
4.JPG
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-1 17:40 , Processed in 0.042399 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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