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时,没有遇到类似的问题。
看下一下数据手册里面的DMA框图 配置 DMA_CHxCTL 寄存器的 PRIO 位域 贴一下代码,,才能看出来 本帖最后由 zchong 于 2025-1-20 21:14 编辑
正常情况吧,看看你的SPI和TIMER是不是在一个总线上,DMA本身虽然独立,但总线如果共用的话肯定会相互影响的,数据通过共同的总线传输就是瓶颈,所以有些对时间有严格要求的操作还需要关注总线不能冲突。 GD32F3xx的DMA0与DMA1是完全独立运行的 它们各自具有独立的请求通道、处理单元、配置和控制方式。 学习一下,提升自己 尝试用TIMER5或TIMER6来替代TIMER4,并分配给DMA通道2或DMA通道3。
页:
[1]