大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是 i.MXRT1060 上 LCD 橫向漸變色顯示出亮點問題的分析解決經(jīng)驗。
痞子衡前段時間在支持一個 i.MXRT1060 客戶項目時遇到了 LCD 顯示有異常亮點的問題,這個問題的定位和排查花了一點時間,整個過程現(xiàn)在回想起來仍覺得有意思。做嵌入式(尤其是軟件)這行主要工作除了寫代碼就是解 Bug 了,而且很多時候往往是寫代碼容易,解 Bug 難,所以解 Bug 能力是衡量一個工程師是否資深的重要因素。Bug 不僅要解得好,還得解得快,這個很考驗工程師的邏輯思維能力和調(diào)試經(jīng)驗。今天痞子衡就給把之前分析解決 LCD 異常亮點問題全過程復(fù)現(xiàn)給大家,希望對大家今后解 Bug 有所幫助。
本篇是上篇,主要是拋出問題,希望大家能夠留言積極回復(fù),給出你解 Bug 的思路,看看誰的思路能更勝一籌。
一、問題描述
先給大家簡單描述一下這個 LCD 顯示異常亮點問題,客戶使用的是一塊由 ST7701S 驅(qū)動的 480x480 分辨率的 RGB 接口 LCD 屏,主控芯片是 i.MXRT1062,客戶在 FlexSPI1 接口上掛了一片 QuadSPI Flash 存放應(yīng)用程序,還在 FlexSPI2 接口上掛了一片 HyperRAM 做顯存。為了驗證系統(tǒng)是否正常,客戶設(shè)計了一個 LCD 顯示測試程序(即下圖中的 App),這個 App 連同 L2 Boot 一起被燒寫進 QuadSPI Flash,芯片上電啟動,BootROM 加載 L2 Boot 運行,L2 Boot 完成 HyperRAM 初始化(為什么設(shè)計二級啟動后面會解釋)后加載 App 到 HyperRAM 運行,App 里構(gòu)造 uint32_t s_frameBuffer[480][480](像素格式是 XRGB8888)內(nèi)容后借助 eLCDIF 模塊驅(qū)動 LCD 屏顯示,s_frameBuffer 里的內(nèi)容就是簡單的橫向漸變色,但是漸變色顯示出了問題,如下圖中左邊 LCD 示意圖所示,均勻地出現(xiàn)了幾根不明白色縱向線條。
這是客戶的 LCD 顯示測試代碼(下圖左側(cè)),基于 SDK_2.6.2_EVK-MIMXRT1060boardsevkmimxrt1060driver_exampleselcdifrgb 下的 IAR 工程,代碼僅稍作修改(LCD 驅(qū)動部分要增加 ST7701S 初始化,并且相應(yīng)調(diào)整 LCD 寬高參數(shù)),主函數(shù)則相當(dāng)簡單,s_frameBuffer[][]放在 HyperRAM 里,其內(nèi)容填充由 APP_FillFrameBuffer()函數(shù)完成,實現(xiàn)紅 / 綠 / 藍三種顏色的橫向漸變顯示(下圖右側(cè),存在不明亮線條)。
?
核心顯示數(shù)據(jù)填充函數(shù) APP_FillFrameBuffer()再貼一遍,防止大家看不清上圖中的代碼:
#define APP_IMG_HEIGHT 480
#define APP_IMG_WIDTH 480
__no_init uint32_t s_frameBuffer[APP_IMG_HEIGHT][APP_IMG_WIDTH];
void APP_FillFrameBuffer(void)
{
uint32_t i = 0, j = 0;
for (i = 0; i < APP_IMG_HEIGHT / 3; i++)
{
for (j = 0; j < APP_IMG_WIDTH; j++)
{
uint8_t k = j % 255;
s_frameBuffer[i][j] = APP_MakeLutData(k, 0, 0);
s_frameBuffer[i+APP_IMG_HEIGHT/3][j] = APP_MakeLutData(0, k, 0);
s_frameBuffer[i+APP_IMG_HEIGHT*2/3][j] = APP_MakeLutData(0, 0, k);
}
}
}
二、現(xiàn)有條件
一個實驗室,焊接工具一應(yīng)俱全。
一塊出問題的客戶板子(以及客戶測試程序)。
客戶 LCD 屏廠給的驅(qū)動程序(基于 STM32 開發(fā)板,屏廠反饋屏面板本身沒有問題)
一塊恩智浦官方 i.MXRT1060-EVK,如下圖所示。
幾片 HyperRAM 芯片(與恩智浦 EVK 上 HyperFlash 同封裝,但型號與客戶板子上 HyperRAM 不一致)
客戶 LCD 屏 40pin 連接線與恩智浦 EVK 上 LCD 屏 40pin 連接線線序不一致。
?
?
三、你的解 Bug 思路
痞子衡列了一些可能出問題的地方(不一定全),供大家參考:
客戶 LCD 顯示測試代碼邏輯是否有問題?
客戶 LCD 屏與 i.MXRT1060 連接(線序)是否有問題?
客戶 LCD 屏的 ST7701S 驅(qū)動移植(從 STM32 到 i.MXRT1060)是否有問題?
客戶選用的 HyperRAM 本身質(zhì)量是否有問題?
i.MXRT1060 配置的客戶 HyperRAM 時序參數(shù)是否有問題?
i.MXRT1060 的 LCD 顯示模塊 eLCDIF 驅(qū)動是否有問題?
i.MXRT1060 系統(tǒng)的總線處理(如 Cache、總線競爭)是否有問題?
請留言給出你能想到的其他出問題的地方,你解 Bug 的思路(要從解決問題的效率出發(fā),看看誰的方法能更快的定位問題)。