重构 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:
+5
-7
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user