硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4001|回复: 5
收起左侧

[DMA2D] DMA2D内存到内存模式传输错误

[复制链接]

9

主题

27

回帖

54

积分

初级会员

积分
54
发表于 2020-6-22 15:32:23 | 显示全部楼层 |阅读模式
第一次用DMA2D,使用寄存器到存储器模式没问题,读取传输到SDRAM中的数据也是正确的,但使用内存到内存模式,sdram中的数据始终不对,跟踪发现DMA2D传输出错(中断寄存器值为1),请教大家这大概是什么原因呢,就这么几个寄存器,实在找不到原因了void lcdFillColor(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t *color)
{
  uint32_t tm = 0;
  __HAL_RCC_DMA2D_CLK_ENABLE();                                    //开启DMA2D时钟
  DMA2D->CR &= ~(DMA2D_CR_START);                                  //停止DMA2D
  DMA2D->CR = (0 << 16) | (0x1 << 9);                              //M2M,传输完成中断
  DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_RGB565;                       //RGB565
  DMA2D->FGOR = 0;                                                 //源偏移
  DMA2D->OOR = 800 - (x2 - x1 + 1);                                //目标偏移
  DMA2D->FGMAR = (uint32_t)color;                                  //源地址
  DMA2D->OMAR = (__IO uint32_t)(0xC0000000 + 2 * (800 * y1 + x1)); //目标地址
  DMA2D->NLR = ((x2 - x1 + 1) << 16) | (y2 - y1 + 1);              //行数
  DMA2D->CR |= DMA2D_CR_START;                                     //开启DMA2D
  while ((DMA2D->ISR & DMA2D_ISR_TCIF_Msk) == RESET)               //等待传输完成中断
  {
    tm++;
    if (tm > 0xfffff) //超时
    {
      printf("timeout , %d\r\n", DMA2D->ISR);
      break;
    }
  }
  DMA2D->IFCR |= DMA2D_ISR_TCIF_Msk; //清除传输完成中断
}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111801
QQ
发表于 2020-6-22 16:42:56 | 显示全部楼层
【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至78章(2020-05-25)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

QQ截图20200622164420.jpg
回复

使用道具 举报

9

主题

27

回帖

54

积分

初级会员

积分
54
 楼主| 发表于 2020-6-23 11:11:38 | 显示全部楼层
eric2013 发表于 2020-6-22 16:42
【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至78章(2020-05 ...

谢谢,找到原因了,代码没问题,把色块指定到空间足够的内存地址就好了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111801
QQ
发表于 2020-6-24 09:20:14 | 显示全部楼层
老鸟kkk 发表于 2020-6-23 11:11
谢谢,找到原因了,代码没问题,把色块指定到空间足够的内存地址就好了

嗯,其实参考我的就行,已经做的比较完善


回复

使用道具 举报

2

主题

26

回帖

32

积分

新手上路

积分
32
发表于 2022-3-8 18:22:48 | 显示全部楼层
我的代码跟上面类似。
使用内部的 AXI RAM 作显存(目的地址0x24000000)。源地址在AXI RAM 会出错,CEIF置位。
我作了分散加载的尝试,把源地址指定到SRAMx,也出错。
如果源地址在映射的外部QSPI FLASH,0x90000000+,DMA2D就工作正常。
板子没有片外SDRAM。 单帧显存是384000Byte。看楼主的“把色块指定到空间足够的内存地址就好了”,是不是意思是,这个色块也得有384000Byte的空间才行。
刚刚把尝试打断点尝试了哈,只要源地址的内存,小于显存,就一定出现CEIF。
这下就难搞了。LTDC用L8格式输出,只是用DMA2D做个搬运的工作。512K的空间,怎么也搞不出2块38.4K的内存区域来。如此一来,只能用cpu搬运了。
回复

使用道具 举报

2

主题

26

回帖

32

积分

新手上路

积分
32
发表于 2022-3-9 09:41:49 | 显示全部楼层
我开始尝试MDMA作字节搬运
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-11-11 03:23 , Processed in 0.282340 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表