打印
[STM32F4]

关于多通道DMA的问题

[复制链接]
3963|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32F4使用串口1,2,3同时接收数据,3个串口每秒同时进来长度固定(3600个ASCII码)的数据,1能否同时开启3路DMA同时从串口接收数据  2如果DMA使用Normal模式,搬运完一次数据之后,需要再次开启DMA,请问用什么触发DMA的再次开启,之前用过串口的空闲中断,但是效果不理想,请大神们指点
沙发
wang2043120|  楼主 | 2014-7-21 10:09 | 只看该作者
如果开启DMA接收串口1的数据,是不是串口1就不能开中断了?否则每次有串口数据进来的时候,既要DMA传输数据,串口还要进入中断?

使用特权

评论回复
板凳
airwill| | 2014-7-21 10:34 | 只看该作者
1能否同时开启3路DMA同时从串口接收数据                                  当然可以, 只要 DMA 通道不冲突.
2如果DMA使用Normal模式,搬运完一次数据之后,需要再次开启DMA                    可以考虑用 DMA 中断触发
3如果开启DMA接收串口1的数据,是不是串口1就不能开中断了?               DMA  和 USART 是完全独立的硬件.  所以 串口中断当然能打开, 并正常工作,  至于 "既要DMA传输数据,串口还要进入中断" 对于 STM32 也照样能够应付, 有没有必要这样处理, 看设计者的考虑了

使用特权

评论回复
地板
wang2043120|  楼主 | 2014-7-21 10:43 | 只看该作者
airwill 发表于 2014-7-21 10:34
1能否同时开启3路DMA同时从串口接收数据                                  当然可以, 只要 DMA 通道不冲突 ...

对于问题2,串口1每秒接收3600个数据,如果按照您的意思采用DMA中断触发,第一秒数据接收完成后,开启DMA完成中断,DMA-USART再次使能,那么此时DMA立刻从串口1开始接收数据吗?我的本意是第一秒数据DMA完成之后,DMA不工作,等待第二秒的数据来之后再次开启DMA

使用特权

评论回复
5
airwill| | 2014-7-21 10:49 | 只看该作者
你可以在 DMA 中断中迅速处理这 3600 个数据, 然后再次开启 DMA
或者更换接受地址, 再开启 DMA.

你原来的想法有问题, 可能导致后续数据不能完整接受. 另外, 每秒接收3600个数据, 对于 STM32, 即使用 USART RxD中断, 也是小菜一碟, 接收任务太轻松了. 有没有问题就看你后面的数据处理程序了.

使用特权

评论回复
6
wang2043120|  楼主 | 2014-7-21 10:59 | 只看该作者
airwill 发表于 2014-7-21 10:49
你可以在 DMA 中断中迅速处理这 3600 个数据, 然后再次开启 DMA
或者更换接受地址, 再开启 DMA.

串口1开启DMA接收数据,并且串口1同时开启了中断!请问,串口数据进来的时候,串口是不是   1进入串口中断。2  DMA直接进行传送?在数据进来的时候,这两项任务是不是可以同时完成?请问大神的QQ,能不能私聊向您请教,这个项目初次上手,希望大神指点,优化一下结构,也许您不经意间的悉心指点,可以帮助我更加了解其中的奥秘

使用特权

评论回复
7
airwill| | 2014-7-21 11:14 | 只看该作者
串口1开启DMA接收数据,并且串口1同时开启了中断!
          我只说这样是可以的. 但实际情况相信不需要这样处理.

串口数据进来的时候,串口是不是   1进入串口中断。2  DMA直接进行传送?在数据进来的时候,这两项任务是不是可以同时完成?
          当然是的, DMA 是由硬件实现的, 数据的传输在软件 "不知道" 的情况下已经完成了.

为了不至于导致误会, 我强调, 这样处理是可以的, 至于为什么, 有啥好处, 涉及数据处理和可能有复杂的协议, 楼主自己把握和斟酌.

使用特权

评论回复
8
mmuuss586| | 2014-7-21 12:14 | 只看该作者
1、可以同时开启;
2、看看有没有DMA循环模式(ADC我知道有的),串口我想应该也有;

使用特权

评论回复
9
mmuuss586| | 2014-7-21 12:30 | 只看该作者
另外你传输数据量这么大,最好把硬件流控制也用上;

使用特权

评论回复
10
wang2043120|  楼主 | 2014-7-22 16:51 | 只看该作者
airwill 发表于 2014-7-21 11:14
串口1开启DMA接收数据,并且串口1同时开启了中断!
          我只说这样是可以的. 但实际情况相信不需要这 ...

谢谢您的回复,现在DMA的问题基本解决,即使打开循环模式,使能DMA之后,当串口有数据进来的时候,才启动一次搬运,计数器减一,串口没有数据进来,就一直等待。但是(DMA-串口1)完成中断和串口1中断不能同时使用,使能DMA_ITConfig(DMA2_Stream2, DMA_IT_TC, ENABLE);USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);这两个函数之后USART1_IRQHandler(void)串口中断函数就进不去了。

使用特权

评论回复
11
wang2043120|  楼主 | 2014-7-22 16:52 | 只看该作者
mmuuss586 发表于 2014-7-21 12:30
另外你传输数据量这么大,最好把硬件流控制也用上;

谢谢您的提醒,我之前还没有注意这个问题

使用特权

评论回复
12
mmuuss586| | 2014-7-22 17:35 | 只看该作者
wang2043120 发表于 2014-7-22 16:52
谢谢您的提醒,我之前还没有注意这个问题

:)
不客气,我们前段时间调WIFI转串口的模块,加了硬件流控制,通讯速度提高了不少;

使用特权

评论回复
13
仙人球W| | 2014-12-20 16:15 | 只看该作者
已经被airwill斑竹给解决...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝