用STM32F030驱动1.45寸TFT-LCD,左上角刚上电小几率出现一小块花屏

2019-07-14 18:29发布

本帖最后由 bojue2015 于 2018-2-25 11:05 编辑

STM32F030驱动TFT-LCD(TFT-LCD初始化总时间不到15MS),驱动芯片ST7789V,左上角刚上电小几率出现一小块花屏!   刷屏流程为:上电--屏供电--初始化(总延时不到20MS,不能再长)--整体刷黑底---需要的位置上刷图片。
   左上角有小几率出现小块花屏,之后如果需要切换显示的话,会再刷黑底,花屏消失。之后坏样机再重新上电也难以复现此现象。
   最新的优化方法是上电的初次刷两次黑底,能有效改善此问题,但几率性还是存在。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
hhdzkj09
1楼-- · 2019-07-15 10:31
static void TftDispInit(void)
{
        WriteComm(0x36); // Memory Access Control
        WriteData(0xC8); // C8
       
        WriteComm(0x3A);   
        WriteData(0x55);  //66
       
        WriteComm(0xC0);
        WriteData(0x05);
        WriteData(0x05);
       
        WriteComm(0xC1);
        WriteData(0x04);
       
        WriteComm(0xE0); //Set Gamma
        WriteData(0x06);
        WriteData(0x09);
        WriteData(0x0e);
        WriteData(0x04);
        WriteData(0x13);
        WriteData(0x08);
        WriteData(0x36);
        WriteData(0X68);
        WriteData(0x46);
        WriteData(0x06);
        WriteData(0x0e);
        WriteData(0x0d);
        WriteData(0x18);
        WriteData(0x1b);
        WriteData(0x0f);

        WriteComm(0XE1); //Set Gamma
        WriteData(0x06);
        WriteData(0x23);
        WriteData(0x29);
        WriteData(0x03);
        WriteData(0x0f);
        WriteData(0x04);
        WriteData(0x39);
        WriteData(0x23);
        WriteData(0x48);
        WriteData(0x03);
        WriteData(0x0b);
        WriteData(0x08);
        WriteData(0xb1);
        WriteData(0x36);
        WriteData(0x0f);

        WriteComm(0x11); //Exit Sleep
}

初始化代码为供应商提供。
hhdzkj09
2楼-- · 2019-07-15 14:55
 精彩回答 2  元偷偷看……
hhdzkj09
3楼-- · 2019-07-15 16:05
//写命令函数
static void WriteComm(Uint8 command)
{
        Uint8 i;
        //__set_PRIMASK(1);
       
        GPIOA->BRR = Pin_SPI_CS;
        //DISP_SPI_CS_LOW;
        GPIOB->BRR = Pin_SPI_DC;       
        //DISP_SPI_DC_LOW;
        //while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        while(!(SPI1->SR & SPI_I2S_FLAG_TXE));
        for(i=0;i<2;i++);
       
        //SPI_SendData8(SPI1, command);
        *((__IO uint8_t *)SPI1+0x0c) = command;
        //while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        while(!(SPI1->SR & SPI_I2S_FLAG_TXE));
        for(i=0;i<2;i++);
        //DISP_SPI_CS_HIGH;
        GPIOA->BSRR = Pin_SPI_CS;
       
        //__set_PRIMASK(0);
}
hhdzkj09
4楼-- · 2019-07-15 21:49
static void WriteData(Uint8 date)
{
        Uint8 i;

        //__set_PRIMASK(1);
       
        GPIOA->BRR = Pin_SPI_CS;
        //DISP_SPI_CS_LOW;
        GPIOB->BSRR = Pin_SPI_DC;
        //DISP_SPI_DC_HIGH;
        //while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        while(!(SPI1->SR & SPI_I2S_FLAG_TXE));
        for(i=0;i<2;i++);
        //SPI_SendData8(SPI1, date);       
        *((__IO uint8_t *)SPI1+0x0c) = date;
        //while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        while(!(SPI1->SR & SPI_I2S_FLAG_TXE));
        for(i=0;i<2;i++);
        //DISP_SPI_CS_HIGH;
        GPIOA->BSRR = Pin_SPI_CS;
       
        //__set_PRIMASK(0);
}
hhdzkj09
5楼-- · 2019-07-16 01:19
SPI读写LCD采用的是指令和库函数结合的方式,以优化减少读写时间,加快显示。
HELLOKITTYNEW
6楼-- · 2019-07-16 05:35
楼主:您好!我玩过很多屏。直接感觉您的初始化[软复位时间太短],一般的TFT LCD多数需要不少于40mS的软复位,如果有硬件复位例外,但眼见复位的时间也应该不少于数十到百毫秒以上。建议硬件复位之后CPU再启动,如果仅软复位时间不少于50mS,可以设置为100mS较为可靠。当然较新的驱屏芯片可能时间会少点的。此外TFTLCD许多是支持改写内带的FLASHROM的,这个需要严格按照手册操作。气态的就是如果曾经电源接反过——不一定烧屏,如果没有烧,再接正确了就可能会出现你描述的问题。

一周热门 更多>