打印
[应用相关]

一个dma通道没结束另一个dma通道会开启吗

[复制链接]
1351|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jheng|  楼主 | 2019-5-8 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用stm32的多个dma通道,当有多个dma通道同时响应,按照优先级以此响应,是不是一定到等高优先级的dma传输完成后再启动下一个dma

使用特权

评论回复
沙发
john_lee| | 2019-5-8 16:46 | 只看该作者
是的,但基本上不必纠结这个问题,每次传输都是一瞬间(几个时钟周期),就是说如果两个dma通道同时请求传输,那么低优先级的通道最多就耽误几个时钟周期而已。

使用特权

评论回复
板凳
jheng|  楼主 | 2019-5-9 09:45 | 只看该作者
john_lee 发表于 2019-5-8 16:46
是的,但基本上不必纠结这个问题,每次传输都是一瞬间(几个时钟周期),就是说如果两个dma通道同时请求传 ...

传输完成很慢啊,我dma传输100个字节到uart要好久的,是等它传输完成后才能开启其他的dma吗

使用特权

评论回复
地板
john_lee| | 2019-5-9 10:19 | 只看该作者
多个DMA可以同时使用,UART发送的DMA的每次传输(1字节)是依靠UART的SR.TXE和CR3.DMAT位“相与”来触发的。当相与的结果为1时,该DMA通道会去申请数据总线,如果此时总线空闲(没有CPU访问存储,没有其它DMA正在传输,没有其它高优先级的DMA也在申请总线),那么总线仲裁将通过该申请,然后该DMA通道将从内存传输1字节到UART.DR,然后释放总线;如果总线正忙(被CPU或其它DMA占用),那么DMA会等待总线空闲。

实际上每次DMA传输所消耗的时间非常短,所占用总线的时间也非常短,所带来的开销基本可以忽略。
至于你描述的uart的情况,应该是其它的原因。

使用特权

评论回复
5
jheng|  楼主 | 2019-5-9 10:30 | 只看该作者
john_lee 发表于 2019-5-9 10:19
多个DMA可以同时使用,UART发送的DMA的每次传输(1字节)是依靠UART的SR.TXE和CR3.DMAT位“相与”来触发的 ...

你的意思是dma每次传输一个字节都会释放总线给其他通道用?我这边uart对外通讯9600的波特率,100字节数据通过dma从外设传出去,也是就说dma传送一个字节后,总线就释放了?然后等外设把数据传出去后又再次占用总线?

使用特权

评论回复
6
john_lee| | 2019-5-9 10:41 | 只看该作者
对啊,你想想,9600的波特率,大概1ms传输1字节,DMA如果全程占用总线,那么CPU都卡死了。

使用特权

评论回复
7
jheng|  楼主 | 2019-5-9 11:15 | 只看该作者
john_lee 发表于 2019-5-9 10:41
对啊,你想想,9600的波特率,大概1ms传输1字节,DMA如果全程占用总线,那么CPU都卡死了。 ...

好的,感谢帮忙分析

使用特权

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

本版积分规则

35

主题

98

帖子

0

粉丝