MSP432 uartDMA如何接收超过1K的数据

[复制链接]
楼主: ccczzzyyy
手机看帖
扫描二维码
随时随地手机跟帖
10299823| | 2017-7-18 17:05 | 显示全部楼层
这个这么大的数组为什么选用DMA呢

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 17:47 | 显示全部楼层
hudi008 发表于 2017-7-18 16:59
这个DMA没有用过这么大地址的。

收的数据比较多,大于1k。别的没什么特殊的

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 17:48 | 显示全部楼层
minzisc 发表于 2017-7-18 16:59
DMA的地址位是1024吗?

单次可以传输1024个,一个可以是1个字节,2个字节或者4个字节。

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 17:50 | 显示全部楼层
gygp 发表于 2017-7-18 17:00
使用DMA发送时每次发送数据前需要配置发送的数据长度,此时要注意应先关闭DMA,然后配置数据长度 ...

配置了的,就是我现在是连续接收。比如说我把这个串口A1接收设成DMA模式,接收到1024个字节就满了。但是如果另一头给我发的超过1024,后面的就收不到了。我不知道这个怎么解决

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 17:51 | 显示全部楼层
uiint 发表于 2017-7-18 17:02
怎么需要这么大数据保存。

是接收一个配置文件,里面的内容比较多

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 17:52 | 显示全部楼层
wangdezhi 发表于 2017-7-18 17:01
USART+DMA接收未知数据长度的接收

您好,我就是不太懂这个地方。比如说收到1024个满了,我是不是要在下一个字节到来之前把缓存区复制完,并且使能接收?还是说有连续接收的模式?

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 17:54 | 显示全部楼层
mituzu 发表于 2017-7-18 17:02
楼主是使用的是什么功能?

想通过串口收一个配置文件,配置文件大于1k。然后配置文件从另一头发过来的时候,我想通过DMA把这些文件接收保存下来。但是现在只能接收前面1k,不知道如何连续接收

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 17:55 | 显示全部楼层
51xlf 发表于 2017-7-18 17:03
能够超过1024个数组吗?

超过1024数组?是什么意思,反正我看的资料是说一次最多传递1024个“单元”,"单元"可以是字节,半个字或者1个字。

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 18:00 | 显示全部楼层
xiaoyaozt 发表于 2017-7-18 17:04
DMA能够读取获取的长度吧。

我先定义了1个缓存区,串口收到的数都会进那个缓存区去。然后我用的时候再从里面取数。现在就是另一头发送的超过单次DMA能传递的大小了(1024),缓存区是被写满了,但是我不知道后面的数怎么保存下来

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 18:06 | 显示全部楼层
hudi008 发表于 2017-7-18 17:04
使用中断接收数据怎么样

我也看了,但是driverlib里面就只有INT0,1,2,3总共4个中断,也没找到中断标志位那些东西。我在想这个东西会不会和uart接收一样,DMA满了,肯定会有一个标志位被置位,然后如果我能进入这个标志位的中断,在这个时候把DMA缓存区的数据都移走,再清空缓存区,使能接收,如果速度够快,应该能接收到下一个字节吧。但是我在官方库里根本没有找到什么DMA的中断标志位,也没有例程。这个是不是要我自己用寄存器写法来写程序了,不能用库函数了?

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 18:06 | 显示全部楼层
minzisc 发表于 2017-7-18 17:04
这个数据接收数组定义了多少?

1024,单字节的

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 18:08 | 显示全部楼层
gygp 发表于 2017-7-18 17:04
DMA接收长度达到配置长度后会导致接收中断,此时在中断处理函数内要先关闭DMA,然后读出数据长度,清掉相应 ...

我也是这么想的,但是我在例程里完全没找着中断标志位什么的东西,不像uart那种还有明确的发送中断和接收中断,不知道大哥有没有资料或者以前写过这方面东西

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 18:12 | 显示全部楼层
wangdezhi 发表于 2017-7-18 17:04
计算DMA内存数组剩余容量,得到接收的字符长度。将接收的字符复制给DMA内存数组,启动DMA通道传输数据 ...

我现在是首先定义了一个1k的缓存区,然后把串口接收设成DMA模式,串口收到的数就自动进这个缓存区了。如果另一头单次发送的数据小于1k就没什么问题,从dma传递和缓存区大小都没问题。但是如果另一头单次发送超过1k了我就不知道怎么办了,前面1k的数据进了DMA缓存区,但是后面的数据应该就被丢失了。我感觉应该用DMA接收 满 的中断,来取数和使能。但是看官方5个例程,也没有这个DMA接收满的中断,就不知道怎么做了。。

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 18:14 | 显示全部楼层
mituzu 发表于 2017-7-18 17:05
推荐使用中断获取数据

您是说直接用uart的中断接收函数吗,就是不用dma,定义一个缓存区,收到数就进接收中断,把数据放在缓存区里,指针再移到下个位?

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 18:14 | 显示全部楼层
51xlf 发表于 2017-7-18 17:05
不是地址是最大1024吗?

嗯嗯,是,最多1024个

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 18:14 | 显示全部楼层
xiaoyaozt 发表于 2017-7-18 17:05
见过别人设计不定长度的数据接收。

不知道您有没有程序或者大概思路呢,我不太懂这个地方

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 18:16 | 显示全部楼层
10299823 发表于 2017-7-18 17:05
这个这么大的数组为什么选用DMA呢

我感觉不是DMA快吗。。还有种方法是不是定义串口接收中断,定义个缓存区,每收到一个数就进一次中断,把数据放在缓存区里,缓存区里指针移到下一个位置?

使用特权

评论回复
dirtwillfly| | 2017-7-18 18:27 | 显示全部楼层
ccczzzyyy 发表于 2017-7-18 13:34
我看的driverlib里面dma有5个例子,但没有连续收发的啊。论坛里的是TI的讨论还是别的板子的讨论呢?
...

https://bbs.21ic.com/icview-1673158-1-1.html

使用特权

评论回复
ccczzzyyy|  楼主 | 2017-7-18 19:11 | 显示全部楼层
dirtwillfly 发表于 2017-7-18 18:27
https://bbs.21ic.com/icview-1673158-1-1.html

这个贴看了,他好像是纠结能不能发2048个数据,我还在想如何uart和DMA联系起来

使用特权

评论回复
一周一天班| | 2017-7-20 09:17 | 显示全部楼层
本帖最后由 一周一天班 于 2017-7-20 09:20 编辑

你要先做出串口驱动程序,不管串口中断,DMA,对外接口都是一样的。正规做法是串口中断+队列,或者DMA+队列。DMA方式下设置DMA模式为对缓冲区循环,硬件方式实现了队列的写入,读队列前修改DMA当前位置和前次记录的位置的变量进行比较,得到队列的In信息。数据处理是针对队列的,无关串口事情。这种处理方式是通用的。
队列数据来源可以是多样的,可以是SPI,NET,UART......

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ccczzzyyy + 1 很给力!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则