bruce_helen 发表于 2014-3-2 13:46:26

FRDM-KL25Z怎么使用UART DMA实现不定长数据接收?(已解决)

本帖最后由 FSL_TICS_ZP 于 2014-4-2 11:19 编辑

之前一直使用的是STM32,在上面实现了UART DMA接收不定长的数据包。
具体做法:
首先初始化DMA控制器,开辟一个比较大的BUFFER给DMA使用,一般情况下接收的数据包都不会超过这个包大小。然后开启UART IDLE中断,在这个IDLE中断里关闭已经打开的DMA通道。之后,DMA会将之前没有完成的流程完成后给出DMA中断(不需要接收完成之前分配的数据长度),在中断中我们读取当前DMA已经存取的数据大小(长度)。根据数据长度我们就可以知道BUFFER中已经有多少数据了,接下来就是处理这些数据。

KL25Z也有IDLE中,但是不知道是不是能像STM32一样,在这个中断中关闭DMA,之后等DMA完成中断?
我试了一下,发现参考手册中没有讲这方面的内容。我试着直接将DMA DONE至1会出现芯片一直进DMA中断,好像是影响芯片内部的状态机了。

FSL_TICS_ZP 发表于 2014-3-3 13:52:57

你好,楼主!
我大致了解了你的想法,但有一点我想确认一下:1 在UART中断中,是首先暂停DMA操作,然后等退出UART中断后,又使能DMA,从而是DMA完成原来未完成的操作吗?
同时关于你人为的置位DMA_DSR_BCRn,会导致status bit 复位,应该不能实现你想要的结果吧!

bruce_helen 发表于 2014-3-3 14:34:43

FSL_TICS_ZP 发表于 2014-3-3 13:52
你好,楼主!
我大致了解了你的想法,但有一点我想确认一下:1 在UART中断中,是首先暂停DMA操作,然后等退 ...

不是的,我现在想实现UART DMA的方式来接收不定长的数据包。

按照ST的思路:首先DMA已经接收了一定长度的数据(还没到设定的DMA数据长度),这时,外部数据已经发送完成,UART IDLE中断产生,我在IDLE中断中关闭DMA相应的Stream(ST这么叫的和KL25Z channel的概念差不多)。这时候DMA会将没有完成的工作完成(UART IDLE中断来时数据可能还没有完全传输到SRAM中),完成后给出DMA完成中断。在DMA中断中我们读取BCR的数值,用之前设定的DMA接收长度减去BCR就知道接收了多少字节的数据。然后处理数据即可。

因为KL25Z文档上没讲这方面的内容,或者我没看到。我就根据ST的思路猜的,有了之前的测试结果。

表达的可能有点乱,但目的只有一个:使用DMA来接收不定长的数据包。

FSL_TICS_ZP 发表于 2014-3-3 16:47:59

我想我明白啊,是不是在UART的IDLE中断关闭DMA相应的Stream, 然后DMA将没有完成的工作完当做为完成所有指定长度数据传输,并触发DMA中断,其中BCR记录当前已传输的数据长度?
按照这个思路的话,FSL的DMA应该没有相似的操作,我们的DMA可能倾向于源地址,目的地址偏移设置,Channel与chanel相互关联等方面灵活配置。

bruce_helen 发表于 2014-3-3 18:10:41

FSL_TICS_ZP 发表于 2014-3-3 16:47
我想我明白啊,是不是在UART的IDLE中断关闭DMA相应的Stream, 然后DMA将没有完成的工作完当做为完成所有指定 ...

对,你理解的很正确。

接收不定长的数据包应用非常广泛啊,我感觉飞思卡尔应该会提供的。如果不提供,那么DMA控制器的使用受到很大局限性啊。

如果开始配置DMA时指定一个数据长度,必须等到DMA接到到这个指定的长度才给用户中断提示,那么这个应用的实时性就差了。
比如像GSM模块,他通过UART发送的数据量是不确定的。我想在低功耗状态下使用DMA来接收数据就不可能了。

如果实在没办法就使用中断的方式吧,虽然不完美,但是数据量比较小的情况下也能凑合。

FSL_TICS_ZP 发表于 2014-3-4 14:26:09

你好,楼主!
谢谢你的建议与回复,确实从接收不定长的数据包应用的角度来说,KL25的DMA有其不足之处,但是就如你所说的,与中断方式结合,比如采用每次中断触发小批量的数据传输的话,应该会减少接收不定长数据
的时间浪费,从而提高实时性。

louwenyan 发表于 2014-5-4 13:23:01

可以定时来查接收数据的数量判断是否接收完成

bruce_helen 发表于 2014-5-4 13:38:25

louwenyan 发表于 2014-5-4 13:23
可以定时来查接收数据的数量判断是否接收完成

也可以,虽然需要开定时器来读,实时性也差了些。但是是一种解决思路。

ddcour 发表于 2014-5-7 10:31:36

louwenyan 发表于 2014-5-4 13:23
可以定时来查接收数据的数量判断是否接收完成

请问怎么查询?在缓存里面搜索吗?没有STM32那样直接读剩余的长度来的直接

Michael_STM 发表于 2015-1-28 11:55:12

Freescale不支持的主要原因是因为在UART_Idle中断中关闭DMA无法触发DMA中断吗?

bruce_helen 发表于 2015-1-28 14:41:21

Michael_STM 发表于 2015-1-28 11:55
Freescale不支持的主要原因是因为在UART_Idle中断中关闭DMA无法触发DMA中断吗?

是的         
页: [1]
查看完整版本: FRDM-KL25Z怎么使用UART DMA实现不定长数据接收?(已解决)