重构 ILI9341+LVGL 驱动:异步 DMA + 硬件旋转,修复残影与白屏

- 硬件 MADCTL 旋转,删除软件转置,LVGL 坐标与面板 1:1,消除移动残影
- 全异步 DMA:flush 启动即返回,完成/出错由 SPI 中断收尾,去掉信号量阻塞
- DMA 缓冲经 .lcd_ram 段强制放入 AXI SRAM,规避 DTCM 不可被 DMA 访问导致的白屏
- LV_COLOR_16_SWAP=1,LVGL 直出面板字节序,省去逐像素交换/拷贝
- 看门狗超时重建 SPI 自恢复,单次异常不再级联长时间白屏
- 定制 scatter(motor_ili9341_lcd.sct) 并接入 uvprojx
- 新增 README_ILI9341.md 说明根因/设计/构建验证
This commit is contained in:
zhy200308
2026-07-08 11:02:42 +08:00
parent b4423fcfa2
commit e4d61b19f0
8 changed files with 460 additions and 773 deletions
+34
View File
@@ -0,0 +1,34 @@
; *************************************************************
; *** ILI9341 定制 Scatter 文件 ***
; -------------------------------------------------------------
; 目的:把 LCD 的 DMA 源缓冲(.lcd_ram 段)强制放到 AXI SRAM
; (0x24000000)。原因:
; - DTCM(0x20000000) CPU 访问最快,但 DMA1/DMA2 无法访问,
; 把 DMA 缓冲放这里会导致 DMA 读到空/错数据 → 白屏/花屏。
; - AXI SRAM(0x24000000) DMA1 可访问,适合放 LCD 缓冲。
; 默认自动 scatter 会把缓冲随机分到两块 RAM,是之前偶发
; 白屏的根因之一。本文件消除这种不确定性。
;
; 若在 Keil 里修改了内存布局,请保持 .lcd_ram 始终落在 AXI SRAM。
; *************************************************************
LR_IROM1 0x08000000 0x00020000 { ; 加载域 = Flash 128KB
ER_IROM1 0x08000000 0x00020000 { ; 执行域 = 加载域
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
; DTCM 128KB —— CPU 专用高速 RAMDMA 不可访问。
; 普通全局变量、堆栈放这里。切勿放 DMA 缓冲。
RW_IRAM1 0x20000000 0x00020000 {
.ANY (+RW +ZI)
}
; AXI SRAM 512KB —— DMA 可访问。LCD DMA 缓冲必须放这里。
RW_IRAM2 0x24000000 0x00080000 {
*(.lcd_ram) ; LCD 绘制/DMA 缓冲,DMA 可达
.ANY (+RW +ZI)
}
}