TECHWELL 发表于 2025-1-19 22:51

GD32F3xx的DMA0与DMA1,二者是完全独立运行的吗?

本帖最后由 TECHWELL 于 2025-1-19 22:56 编辑

我的小系统中,基本组成如下:
    FreeRTOS+emwin+3.5寸彩屏+4线电阻触摸;
GD32F305+ILI9341,
GD32F305用SPI1 + DMA0_CH4驱动ILI9341,刷屏速度还不错,可以接受;

    利用TIMER4_CH0,输出类似于UART的TX脉冲波形,用以控制RGB LED彩灯
(UART难以实现此功能)。
脉冲宽度由 TIMER4_CH0CV(输出比较通道)控制.

事先计算好 TIMER4_CH0CV 需要的比较值,存放在数组tq[]中。在
每次比较匹配时,输出电平翻转一次,同时,由DMA1_CH4传送tq[]内容值到TIMER4_CH0CV
,从而生成想要脉冲,脉宽最短约4uS。

   问题来了!
    在SPI1 + DMA0_CH4刷新ILI9341彩屏期间,不能启动DMA1_CH4;
而是要等待刷屏完成,才能响应TIMER4比较匹配所触发的DMA1_CH4请求,这会导致脉冲宽度严重走样!
   照理说,DMA0与DMA1不应该是独立的,可以同时运行的吗?      在此之前,用STM32时,没有遇到类似的问题。



yangxiaor520 发表于 2025-1-20 07:55

看下一下数据手册里面的DMA框图

xch 发表于 2025-1-20 11:54

配置 DMA_CHxCTL 寄存器的 PRIO 位域

zeshoufx 发表于 2025-1-20 16:14

贴一下代码,,才能看出来

zchong 发表于 2025-1-20 21:12

本帖最后由 zchong 于 2025-1-20 21:14 编辑

正常情况吧,看看你的SPI和TIMER是不是在一个总线上,DMA本身虽然独立,但总线如果共用的话肯定会相互影响的,数据通过共同的总线传输就是瓶颈,所以有些对时间有严格要求的操作还需要关注总线不能冲突。

probedog 发表于 2025-1-21 15:01

GD32F3xx的DMA0与DMA1是完全独立运行的

probedog 发表于 2025-1-21 15:01

它们各自具有独立的请求通道、处理单元、配置和控制方式。

Amazingxixixi 发表于 2025-1-24 13:59

学习一下,提升自己

梅花香自123 发表于 2025-2-28 16:14

尝试用TIMER5或TIMER6来替代TIMER4,并分配给DMA通道2或DMA通道3。
页: [1]
查看完整版本: GD32F3xx的DMA0与DMA1,二者是完全独立运行的吗?