stm32驅動ili9486液晶顯示屏

2021-08-21 21:23:53 字數 4058 閱讀 4420

這是我接手的第乙個小專案,也是第一次我寫的**真正排上用場,雖然不超過50行。但遇到的阻礙,我想確實硬體廠商善意的刁難。這個專案最大的收穫是弄清楚我與軟體工程師最大的不同吧!給我職業生涯上的第乙個教訓。下面言歸正傳(驅動見51hei論壇附件tft資料)。

(一)ili9486顯示屏簡介

ili9486支援262144種色彩,有320rgb*480個畫素點,內部gram345600bytres(320*480*18bit),有全彩(262k_colors,65k_colors)和idle(8_colors)兩種顯示模式,支援8種匯流排,用im2,im1,im0決定,見下圖        

支援16bit-rgb(5,6,5)和18bit-rgb(6,6,6)兩種色彩格式,也用單一純色格式(in idle mode)。

(二)常用命令

顯示屏的需求,最多的還是在怎樣滿足我們的顯示要求,比如橫屏,豎屏,顏色格式,刷屏速度等等。這裡只稍微講一下在此次專案中用到的命令,慢慢補充。

1.display function control(b6h)

命令主要引數:gs,sm,ss

2.memory access control (36h)

命令主要引數:mx,my,mv,bgr(色彩模式rgb or gbr),mh,ml

2)設定指標位置

1.set page address (2bh)

設定指標x起點, 預設情況為0~13f(b5= 0),受36h的第五位(b5)影響0~1df(b5 = 1)

2.set column address (2ah)

設定指標y起點, 預設情況為0~1df(b5= 0),受36h的第五位(b5)影響0~13f(b5 = 1)

3)設定畫素格式

1. inte***ce pixel format(3ah)

設定是16bit或則18bit的畫素。dpi設定介面畫素格式,dbi設定cpu畫素格式

4)連續寫

1.memory write continue (3ch)

要在使用memory write (2ch)後使用此命令,最多能連續讀取65535個位元組。     

(三)與ucui介面相關函式

介面函式在gui/lcddriver資料夾下lcd_dummy.c以及config目錄下lcdconfig.h。

1. lcd_dummy.c主要是介面相應顯示屏

1--void lcd_l0_setpixelindex(int x, int y, int pixelindex) 設定畫素點,要使用自己的函式實現設定畫素點功能。下面乙個簡單的例子:

void lcd_l0_setpixelindex(int x, int y, int pixelindex) 

2--void lcd_l0_drawvline  (int x,  int y0,  int y1)//畫橫線

3--void lcd_l0_drawhline  (int x0, int y,  int x1)//畫豎線

注:這兩個函式,可以不用替換,ucgui預設情況下給乙個座標,畫乙個畫素點(速度慢,但準確,無差錯)。如果你覺得你使用自己的函式更加快速,可進行替換(ili9486有自動移動指標的功能,可以只送乙個起始點,然後送資料,指標會自動加也會自動換行(列),而不用送座標位址)

4--lcd_l0_drawbitmap(...)//畫位圖

5--drawbitline16bpp(...)//畫位圖主要功能函式

2.lcdconfig.h需修改如下項

#define lcd_xsize                 (480)   /* x-resolution of lcd, logical coor. */

#define lcd_ysize                  (350)   /* y- resolution of lcd, logical coor. */

#define lcd_bitsperpixel      (16)     //畫素點位數

#define lcd_controller       -1        // -1表示不在gui_init()裡面初始化顯示屏 

#define lcd_swap_rb             1        // 1--bgr 0--rgb

#define lcd_mirror_x           (1)      //0 if active: x ->-x /1--翻轉x軸起點

#define lcd_mirror_y           (0)      //0 if active: y -> -y /1--翻轉y軸起點

#define lcd_swap_xy             1        //0  if active: x y/1--調換xy的值

(四)faq

1.顯示顏色不對,而影象輪廓正確

1)這個問題最常見的是rb調換,tft顯示屏常見的畫素格式為bgr(5,6,5),而一般的windows的格式為rgb(5,6,5),這個問題只要轉換memory access control(36h)命令bgr引數即可。

2)第二個可能原因是由於高低位元組的問題,這款ili9486的顯示屏為低位元組在前,高位元組在後,可以在送資料到顯示屏之前將資料轉換一下。

3)如果以上步驟沒有將顏色的問題解決,考慮顯示屏質量問題或者螢幕焊接問題(換塊顯示屏試試)。

2.背景圖顯示不正確,沒有完整的影象

1)這個問題主要是取影象大小時出錯,如果要鋪滿整個螢幕的話,影象一定要與顯示屏規格相同,例如:ili9486是320*480,所以你的影象大小也要為320*480或者橫屏480*320,不能多也不能少,否則不會正確顯示影象。

3.影象無法整屏顯示,或者是整屏顯示需要更多的畫素點

1)這個問題很有可能是匯流排模式選擇錯誤,ili9486支援多種縱向模式8、9、16、18以及3/4spi等等,匯流排模式取決於im[2:0]的選擇,詳細內容請參考相關資料手冊。

2)還有乙個可能是資料在傳輸的過程中丟失了(因為傳輸速度過快/頻率太高),可以每傳送一次資料,延時一段時間,觀察有沒有出現漏點的情況(對比色要鮮明),或者調整頻率,讓送資料的速度變慢些(不太建議這樣做,因為頻率low,可能導致其他問題出現,頻率high也是)。

4.螢幕總是白屏,而無法顯示其他內容

1)這問題最有可能是因為螢幕的顯示模式不正確,極有可能處在idle模式下,加入命令0x0011(退出idle模式,進入normal模式)可解決。

5. 顏色抖動現象

1)這個問題最有可能的是電路上的問題,可以嘗試重新焊接一下。

(五)測試

1.顏色測試:讓顯示屏顯示出三原色的三種純色,三種顏色正確,基本不會出現顏色問題,若出現顏色問題,考慮硬體上的問題。

2.刷屏測試:用320*480個畫素點刷屏,如果能鋪滿整屏,匯流排模式正確。反之模式不正確。

注意:3.5_tft彩色lcd模組 驅動晶元型號為ssd2119

3.2_tft彩色lcd模組 驅動晶元型號為ili9320

2.8_tft彩色lcd模組 驅動晶元型號為st7781、ili9325、ili9328、或ili9331。具體是哪種控制晶元可以在ucgui程式裡初始化lcd程式的讀id函式裡下個斷點即可看到器件id號。 

驅動程式全相容這些控制晶元,要想詳細了解控制晶元請檢視目錄下的對應晶元資料手冊,ili9328的資料手冊請參考ili9325的。兩個是一樣的,只是讀到的id不一樣,驅動程式也是相同的。

ssd2119    讀到的id為        0x9919

ili9320    讀到的id為        0x9320

ili9325    讀到的id為        0x9325

ili9328    讀到的id為        0x9328

ili9331    讀到的id為        0x9331

st7781     讀到的id為        0x7783

lgdp4531   讀到的id為        0x4531

使用者可以自己提取對應驅動晶元的初始化檔案用到自己的工程中。

linux spi驅動分析 基於STM32

linux kernel 版本2.6.30,spi驅動基於platform device,platform driver驅動模型來編寫.spi分為主從裝置,乙個主裝置下可心掛接多個從裝置,linux驅動中使用struct spi master結構來表示乙個主裝置,使用struct spi devic...

stm32用pwm驅動舵機

舵機的主要組成部分為伺服電機,所謂伺服就是服從訊號的要求而動作。在訊號來之前,轉子停止不動 訊號來到之後,轉子立即運動。因此我們就可以給舵機輸入不同的訊號,來控制其旋轉到不同的角度。舵機接收的是pwm訊號,當訊號進入內部電路產生乙個偏置電壓,觸發電機通過減速齒輪帶動電位器移動,使電壓差為零時,電機停...

小結 stm32 驅動LED燈

使用位帶操作,位帶操作就是把每個位元膨脹成乙個32位的字,當訪問這些字的時候就訪問這些位元位。然後,埠使能 pb5 pe5 led io void led init void gpio setbits gpiob,gpio pin 5 這個必須要寫,取位址。gpio setbits gpiob,gp...