硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4227|回复: 3
收起左侧

[其它] ILI9488仅部分区域可清屏

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2020-12-20 00:30:10 | 显示全部楼层 |阅读模式
本帖最后由 pkokoc 于 2020-12-20 00:31 编辑

STM32H750VB + ILI9488 3.5寸,采用FMC驱动
目前FMC驱动正常。但是清屏仅在一个很小的区域中进行(下图红框区域是可以正常刷屏的区域,屏幕其它区域无法正常显示),核对了网上很多初始化代码,未看出差异
请大佬们指导一下。
1、如何才能全屏,而不是图中的某个区域
2、LCD_Clear() 中为什么需设置显示区域,且必须放在设置光标之后? 我看其它代码中都没有在LCD_Clear() 中设置显示区域
3、LCD_Clear() 最后向GRAM写数据时需 LCD_BGR2RGB(color) 转换,否则显示颜色不正常。但是此处的color已经是RGB565的颜色值,并非BGR的颜色值,为什么还需转换。其它代码也没有这个转换。


  1. void LcdInit(void)
  2. {
  3.         LCD_WR_REG(0xE0); //P-Gamma
  4.         LCD_WR_DATA(0x00);
  5.         LCD_WR_DATA(0x13);
  6.         LCD_WR_DATA(0x18);
  7.         LCD_WR_DATA(0x04);
  8.         LCD_WR_DATA(0x0F);
  9.         LCD_WR_DATA(0x06);
  10.         LCD_WR_DATA(0x3A);
  11.         LCD_WR_DATA(0x56);
  12.         LCD_WR_DATA(0x4D);
  13.         LCD_WR_DATA(0x03);
  14.         LCD_WR_DATA(0x0A);
  15.         LCD_WR_DATA(0x06);
  16.         LCD_WR_DATA(0x30);
  17.         LCD_WR_DATA(0x3E);
  18.         LCD_WR_DATA(0x0F);
  19.         
  20.         LCD_WR_REG(0XE1); //N-Gamma
  21.         LCD_WR_DATA(0x00);
  22.         LCD_WR_DATA(0x13);
  23.         LCD_WR_DATA(0x18);
  24.         LCD_WR_DATA(0x01);
  25.         LCD_WR_DATA(0x11);
  26.         LCD_WR_DATA(0x06);
  27.         LCD_WR_DATA(0x38);
  28.         LCD_WR_DATA(0x34);
  29.         LCD_WR_DATA(0x4D);
  30.         LCD_WR_DATA(0x06);
  31.         LCD_WR_DATA(0x0D);
  32.         LCD_WR_DATA(0x0B);
  33.         LCD_WR_DATA(0x31);
  34.         LCD_WR_DATA(0x37);
  35.         LCD_WR_DATA(0x0F);
  36.         
  37.         /* Power Control 1 (C0h)  */
  38.   LCD_WR_REG(0XC0);   //Power Control 1
  39.   LCD_WR_DATA(0x18); //0x18 Vreg1out
  40.   LCD_WR_DATA(0x17); //0x17 Verg2out

  41.   /* Power Control 2 (C1h) */
  42.   LCD_WR_REG(0xC1);   //Power Control 2
  43.   LCD_WR_DATA(0x44); //0x41 VGH,VGL
  44.   
  45.   /* VCOM Control (C5h)  */
  46.   LCD_WR_REG(0xC5);   //Power Control 3
  47.   LCD_WR_DATA(0x00);
  48.   LCD_WR_DATA(0x1A); //0X0A 0x36 Vcom 0x1A
  49.   LCD_WR_DATA(0x80);  //0x48 0x80

  50.   LCD_WR_REG(0x36);
  51.   LCD_WR_DATA(0x48);  //0x48  MY MX MV ML BGR MH HF VF  4A     48  08

  52.   /* Interface Pixel Format (3Ah) */
  53.   LCD_WR_REG(0x3A);   // Interface Pixel Format
  54.   LCD_WR_DATA(0x55); //* 0x55 : 16 bits/pixel  */
  55.   
  56.   //LCD_WR_REG(0x21);  //颜色反转显示

  57.   LCD_WR_REG(0XB0);   // Interface Mode Control
  58.   LCD_WR_DATA(0x00);
  59.   
  60.   /* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
  61.   LCD_WR_REG(0xB1);   //Frame rate
  62.   LCD_WR_DATA(0xA0); //0xB0 - 70Hz, 0xA0 - 60Hz
  63.   LCD_WR_DATA(0x11);  //新增  ???  此句似乎应与0X36指令后的0x3B数据共存亡,否则显示不正常。且与E0,E1设置有关
  64.   
  65.   /* Display Inversion Control (B4h) */
  66.   LCD_WR_REG(0xB4);   //Display Inversion Control
  67.   LCD_WR_DATA(0x02); //2-dot

  68.   /* Display Function Control (B6h)  */
  69.   LCD_WR_REG(0XB6);   //RGB/MCU Interface Control
  70.   LCD_WR_DATA(0x02); //MCU RGB
  71.   LCD_WR_DATA(0x02); //Source,Gate scan dieection
  72.   LCD_WR_DATA(0x3B);  //新增
  73.   
  74.   /* Entry Mode Set (B7h)  */
  75.   LCD_WR_REG(0XB7);   //新增
  76.   LCD_WR_DATA(0xC6);  //新增
  77.   
  78.   /* HS Lanes Control (BEh) */
  79.   LCD_WR_REG(0XBE);   //新增
  80.   LCD_WR_DATA(0x00);  //新增
  81.   LCD_WR_DATA(0x04);  //新增

  82.   /* Set Image Function (E9h)  */
  83.   LCD_WR_REG(0XE9);    // Set Image Function
  84.   LCD_WR_DATA(0x00);  //disable 24 bit data input

  85.   /* Adjust Control 3 (F7h)  */
  86.   LCD_WR_REG(0xF7);    // Adjust Control
  87.   LCD_WR_DATA(0xA9);
  88.   LCD_WR_DATA(0x51);
  89.   LCD_WR_DATA(0x2C);  //新增
  90.   LCD_WR_DATA(0x82);  //新增
  91.         
  92.   /* Sleep Out (11h) */
  93.         LCD_WR_REG(0x11);
  94.         HAL_Delay(120);
  95.    
  96.   /* Display On */
  97.         LCD_WR_REG(0x29);        
  98.   HAL_Delay(120);
  99.   
  100.   LCD_Display_Dir(0);     //设置屏的方向
  101. }

  102. //设置LCD显示方向
  103. //dir:0,竖屏;1,横屏
  104. void LCD_Display_Dir(uint8_t dir)   
  105. {   
  106.     if(dir==0)          //竖屏   
  107.     {   
  108.         lcddev.dir=0;   //竖屏   
  109.    
  110.         lcddev.wramcmd=0X2C;   
  111.         lcddev.setxcmd=0X2A;   
  112.         lcddev.setycmd=0X2B;        
  113.    
  114.         lcddev.width=KLCD_WIDTH;   
  115.         lcddev.height=KLCD_HEIGHT;            
  116.     }else               //横屏   
  117.     {                     
  118.         lcddev.dir=1;   //横屏   
  119.         lcddev.wramcmd=0X2C;   
  120.         lcddev.setxcmd=0X2A;   
  121.         lcddev.setycmd=0X2B;        
  122.         lcddev.width=KLCD_HEIGHT;   
  123.         lcddev.height=KLCD_WIDTH;            
  124.            
  125.     }   
  126.     LCD_Scan_Dir(DFT_SCAN_DIR); ////扫描方向 L2R_U2D  0 //从左到右 从上到下
  127. }  

  128. //清屏                                                                                                   
  129. void LCD_Clear(uint16_t color)                                                                                                                                                                                                                                                                                             
  130. {                                                                                                        
  131.     uint32_t index=0;                                                                                    
  132.     uint32_t totalpoint=lcddev.width;                                                                    
  133.     totalpoint*=lcddev.height;                                                                           
  134.                                                                                                          
  135.     //设置光标位置                                                                                       
  136.     LCD_SetCursor(0x00,0x0000);
  137.                                                                              
  138.     //设定显示窗口x方向显示范围                                                                          
  139.     ILI9488_WriteCmd(0X2A);                                                                              
  140.     ILI9488_WriteParam(0x00);                                                                           
  141.     ILI9488_WriteParam(0x00);                                                                           
  142.     ILI9488_WriteParam(0x01);                                                                           
  143.     ILI9488_WriteParam(0x37);                                                                           
  144.                                                                                                          
  145.     HAL_Delay(1);                                                                                       
  146.                                                                                                          
  147.     //设定显示窗口Y方向显示范围                                                                          
  148.     ILI9488_WriteCmd(0X2B);                                                                              
  149.     ILI9488_WriteParam(0x00);                                                                           
  150.     ILI9488_WriteParam(0x00);                                                                           
  151.     ILI9488_WriteParam(0x01);                                                                           
  152.     ILI9488_WriteParam(0xDF);
  153.                                                                                                                                                                                                                                                                               
  154.     LCD_WriteRAM_Prepare();                                                                              
  155.    
  156.     for(index=0;index<totalpoint;index++)                                                               
  157.     {                                                                                                   
  158.         LCD->LCD_RAM=LCD_BGR2RGB(color);                                                                 
  159.         //LCD->LCD_RAM=(color);                                                                          
  160.     }                                                                                                   
  161. }
复制代码



01.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2020-12-21 07:28:48 | 显示全部楼层
论坛置顶帖V5任意下载一个emWin里面,里面有9488的驱动可以直接实现,仅需修改地址和FSMC配置即可
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-12-21 20:03:20 | 显示全部楼层
eric2013 发表于 2020-12-21 07:28
论坛置顶帖V5任意下载一个emWin里面,里面有9488的驱动可以直接实现,仅需修改地址和FSMC配置即可

已经用里面的9488代码测试过了,还是不正常。目前定位在可能9488寄存器初始化有问题,排查中
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2020-12-22 10:45:51 | 显示全部楼层
pkokoc 发表于 2020-12-21 20:03
已经用里面的9488代码测试过了,还是不正常。目前定位在可能9488寄存器初始化有问题,排查中

注意FMC地址空间的MPU配置,要设置为Strongly order或者Device才可以,此点很重要。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 16:43 , Processed in 0.273640 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表