我正在使用 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);
- }
的