重构 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
+5 -7
View File
@@ -284,14 +284,12 @@ for(;;)
lv_timer_handler();
/*
* DMA 看门狗:兜底极端情况下 DMA 传输既没有触发完成中断
* 也没有触发错误中断(硬件卡死/中断丢失)时,强制恢复 SPI
* 状态机,避免画面永久冻结。正常情况下 ILI9341_WriteArea_DMA
* 内部的信号量超时已经能处理绝大多数异常,这里只是双保险
* timeout_ms 要大于 ILI9341_WriteArea_DMA 内部的 100ms 超时,
* 避免两层保护互相打架。
* LCD 看门狗:新驱动是全异步的,正常刷新由 SPI 完成/错误中断
* 自动收尾,不阻塞本任务。此处只兜底极端情况——一次 DMA 既没
* 触发完成中断也没触发错误中断(硬件卡死/中断丢失)时,强制
* 中止并重建 SPI,恢复刷新管线,避免长时间白屏/冻结
*/
ILI9341_DMA_Watchdog(180);
ILI9341_ServiceWatchdog(180);
osDelay(5);
}