ST意法半导体
直播中

张旭

7年用户 1010经验值
私信 关注
[问答]

在STM32H755上使用MemToMem DMA从SRAM到FMC时出现问题如何解决?

我正在使用 FMC LCD 接口为由 SSD1963 控制的 TFT LCD 供电。FMC 数据宽度为 16 位,下面是一个使用逐像素传输的可行代码。
  • void lcd_fill_pixels(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,
  •                      uint16_t *pixels)
  • {
  •   uint16_t xlen = ex - sx + 1;
  •   Set_Column(sx, ex);
  •   Set_Page(sy, ey);
  •   SSD1963__write_memory_start();
  •   for (int i = sy; i <= ey; i++) {
  •     for (int j = sx; j <= ex; j++) {
  •       TFT_RAM = *pixels;
  •       pixels++;
  •     }
  •   }
  • }
我想将第 8-13 行中的代码转换为 DMA。我首先尝试使用 MDMA,因为运行的内核是 Cortex-M7。我还尝试了 DMA MemToMem。下面是我的 MDMA 和 DMA 配置。
从构建分析器中检查出缓冲区位于 RAM_D1 的 .bss 区域。此外,我禁用 D-Cache 和 I-Cache 进行测试。但是,我仍然看不到我的 LCD 充满像素。
熟悉 STM32H7 设备上的 DMA 的人可以帮助我吗?真的很感激!下面是我使用 HAL 的尝试。
  • void lcd_fill_pixels_dma(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,
  •                          uint16_t *pixels)
  • {
  •   uint16_t xlen = ex - sx + 1;
  •   uint16_t ylen = ey - sy + 1;
  •   Set_Column(sx, ex);
  •   Set_Page(sy, ey);
  •   SSD1963__write_memory_start();
  •   extern DMA_HandleTypeDef hdma_memtomem_dma1_stream7;
  •   SCB_CleanInvalidateDCache();
  •   HAL_DMA_Start(&hdma_memtomem_dma1_stream7, (uintptr_t)pixels,
  •                 (uintptr_t)&TFT_RAM, xlen * ylen * 2);
  •   HAL_DMA_PollForTransfer(&hdma_memtomem_dma1_stream7, HAL_DMA_FULL_TRANSFER,
  •                           100);
  • }
  • void lcd_fill_pixels_mdma(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,
  •                           uint16_t *pixels)
  • {
  •   uint16_t xlen = ex - sx + 1;
  •   uint16_t ylen = ey - sy + 1;
  •   Set_Column(sx, ex);
  •   Set_Page(sy, ey);
  •   SSD1963__write_memory_start();
  •   extern MDMA_HandleTypeDef hmdma_mdma_channel41_sw_0;
  •   SCB_CleanInvalidateDCache();
  •   HAL_MDMA_Start(&hmdma_mdma_channel41_sw_0, (uintptr_t)pixels,
  •                  (uintptr_t)&TFT_RAM, xlen * ylen * 2, 1);
  •   HAL_MDMA_PollForTransfer(&hmdma_mdma_channel41_sw_0, HAL_MDMA_FULL_TRANSFER,
  •                            100);
  • }









回帖(1)

刘润生

2023-2-2 11:45:38
看来我自己找到了解决方案。在 HAL_MDMA_Start 中,我无法传输超过 65535 字节的数据,即使参数BlockDataLength是在 uint32_t 中定义的。

下面是我使用启用了 D-Cache 和 I-Cache 的 MDMA 的可行代码


  • void lcd_fill_pixels_mdma(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,
  •                           uint16_t *pixels)
  • {
  •   uint32_t xlen = ex - sx + 1;
  •   uint32_t ylen = ey - sy + 1;
  •   Set_Column(sx, ex);
  •   Set_Page(sy, ey);
  •   SSD1963__write_memory_start();

  •   extern MDMA_HandleTypeDef hmdma_mdma_channel40_sw_0;
  •   SCB_CleanInvalidateDCache();
  •   for (int i = 0; i < ylen; i++) {
  •     HAL_MDMA_Start(&hmdma_mdma_channel40_sw_0, (uintptr_t)pixels,
  •                    (uintptr_t)&TFT_RAM, xlen * 2, 1);
  •     HAL_MDMA_PollForTransfer(&hmdma_mdma_channel40_sw_0, HAL_MDMA_FULL_TRANSFER,
  •                              100);
  •     pixels += xlen;
  •   }
  • }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分