前言
隨着物聯網、智能家居、智能控制等行業的極速發展,小而美的且反應迅速且成本低的,模塊化,定製化的嵌入式系統的需求愈來愈大,其中下降使用要求,提升用戶體驗,人機交互是一個很是好的方法,因此本文記錄的是調試rtthread+lcd+littlevgl GUI的記錄及流程模塊化
1、資源介紹
硬件是自行畫的PCB板,資源以下函數
- MCU:STM32F407ZGT6
- LCD:3.2寸320*240分辨率,驅動芯片:ILI9341。 引腳除了RESET和背光控制引腳,其餘引腳鏈接均和正點原子的STM32F407探索者開發板兼容
- 使用FSMC接口驅動
軟件是使用rtthread studio1.1.5版本學習
2、配置過程
添加littlevgl2rtt軟件包
配置以下
其中DPI計算方法:
用勾股定理,好比5寸屏(屏幕的寸數就是對角線的長度),1080*1920分辨率,dpi就是sqrt(1080^2 + 1920^2) / 5=440。
因此個人計算獲得是125
LCD屏幕配置及驅動註冊請參考上一篇
RT-Thread學習筆記系列之LCD驅動及emwin示例(2)
測試
保存編譯無誤下載屏幕卻沒有任何顯示,LCD屏幕是驗證過的,這個軟件包也有不少人使用過(頭大,沒辦法只能一步步分析了)url
分析過程
-
方法:spa
- 先參考別人使用這個軟件包的例子和過程
- 對比二者之間的區別
- 參考官方的demo和文檔介紹
-
查找過程:.net
- 這個軟件包做者是在RT1050 fire的板子,lcd爲800*480進行測試
- 官方有使用ART-PI開發板進行直播使用過
- 論壇也有不少小夥伴也是直接使用ART-PI開發板直接使用BSP驅動成功過
- 我手上有ART-PI開發板可是屏幕接口不兼容沒法直接驗證,既然別人一步成功,那卻別確定是驅動或者接口方面的問題,本身直接建立一個art-pi模板的BSP工程,使能LCD驅動,對比二者的區別,再對比接口的區別。任何屏幕顯示底層無非都是打點,刷新,顯示打開這幾個步驟。因此最終找到了區別以下:
-
區別指針
- ART-PI的LCD驅動的結構體有使用到官方對圖像定義的rt_device_graphic_info結構體並分配了內存給指針framebuffer,因此該指針不爲空,而個人LCD驅動是沒有使用
- littlevgl2rtt軟件包中得接口驅動文件littlevgl2rtt.c中初始化函數littlevgl2rtt_init對刷新回調函數是有作區分的
- 官方的示例文件中的介紹
-刷新函數lcd_fb_flush和lcd_flush的區別
static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { int x1, x2, y1, y2; . .//中間代碼省略 . rt_device_control(device, RTGRAPHIC_CTRL_RECT_UPDATE, &rect_info); lv_disp_flush_ready(disp_drv); } static void lcd_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { int x1, x2, y1, y2; . .//中間代碼省略 . //TODO color convert for (y = act_y1; y <= act_y2; y++) { rt_graphix_ops(device)->blit_line((const char *)color_p, act_x1, y, act_x2 - act_x1 + 1); color_p += (x2 - x1 + 1); } }
發現個人驅動使用的刷新函數沒有lv_disp_flush_ready(disp_drv);沒有通知圖形庫,在lcd_flush函數的最後面加上這句就行了,而後編譯下載
顯示正常了,說明驅動已經成功,可是每一個窗口太大了(按照計算方法確實是125,可能長寬比緣由littlevgl認爲這樣是最佳的顯示把),調節一下DPI爲80(本人不斷的調節認爲比較好的一個數值),顯示比較合理
調試
總結
- 遇到問題不要灰心,不要放棄,白嫖黨是沒有競爭力的,成爲有競爭力的人是你能去解決問題
- 若是有現成的例子,對比法是簡單有消的方法
- 先要清楚原理,就像LCD屏幕底層就是打點,打開顯示等幾個步驟,能夠經過斷點或log判斷是否有執行
- 多看官方的文檔和demo,官方的通常都是比較嚴格可靠的,細心點查找避免忽略重要的信息