你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
bojue2015 提问时间:2018-2-25 10:27 /
本帖最后由 bojue2015 于 2018-2-25 11:05 编辑

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

只有左上角才出现

只有左上角才出现

点评

楼主尽快上传图片和代码吧,不然大家也帮不上忙  发表于 2018-2-26 08:56
收藏 1 评论15 发布时间:2018-2-25 10:27

举报

15个回答
Tcreat 回答时间:2018-2-25 10:42:17
本帖最后由 Tcreat 于 2018-2-25 10:51 编辑

首先你这问题的表述太过于简单     可能是初始化 或者是干扰导致的 具体情况 还得根据你实际情况看 先把问题条件  症状表述清楚 才好

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

努力的人 回答时间:2018-2-25 10:46:50
比如说你上传一张出现花屏的照片,你的硬件连接部分的图片,不然也没法判断呀,如果硬件没问题,那就看软件上的问题就可以了,建议好好阅读论坛问答发帖规范

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wudianjun2001 回答时间:2018-2-25 11:08:36
这个涉及到的原因可能好几种,具体不好说
bojue2015 回答时间:2018-2-25 11:09:32
屏供应商回复说初始化时间太短,造成芯片初始化不完全造成。但就有个疑问,为什么总是只出现在左上角,且大小位置都一样。
七哥 回答时间:2018-2-25 22:22:05
上原理图和工程代码吧!
ST7789V有多种工作模式,你这用的是哪一种?
看一下手册中AC Characteristics参数部分。
把时序放慢,比如SPI时钟频率减小,两条读写指令之前增加软件延时。
Sitronix的LCD驱动芯片用的比较多,51上都能驱动,51的时序较慢。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wolfgang 回答时间:2018-2-26 13:06:12
您这个问题是初始化的问题,初始化前没有矫正输出模式。
后期的图形显示把花屏留在了左上角。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wolfgang 回答时间:2018-2-26 13:07:45
wolfgang2015 发表于 2018-2-26 13:06
您这个问题是初始化的问题,初始化前没有矫正输出模式。
后期的图形显示把花屏留在了左上角。 ...

不是初始化时间太短,
初始化代码顺序有问题,建议你看看初始化的码制式设定。好像系统默认的不是565。
bojue2015 回答时间:2018-2-27 16:35:21
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
}

初始化代码为供应商提供。
bojue2015 回答时间:2018-2-27 16:37:43
//TFT处理函数
static void TFTDisp_Proc(void)
{               
        if(g_BlackWakeID == WakeByRtcPwrOff)
                return;
        switch(g_TftDispSt)
        {
                case TFT_Idle:
                        s_TftDisp_X4ms = 0/4;
                        g_TftDispSt = TFT_RstStart;
                        break;
                case TFT_RstStart:
                        if(s_TftDisp_X4ms)
                                return;                       
                        TFTPOWER_ON;
                        DISP_SPI_RST_HIGH;
                        s_TftDisp_X4ms = 4/4;//8
                        g_TftDispSt = TFT_Rsting;
                        break;
                case TFT_Rsting:
                        if(s_TftDisp_X4ms)
                                return;
                        DISP_SPI_RST_LOW;
                        s_TftDisp_X4ms = 4/4;//20
                        g_TftDispSt = TFT_RstEnd;
                        break;
                case TFT_RstEnd:
                        if(s_TftDisp_X4ms)
                                return;
                        DISP_SPI_RST_HIGH;
                        s_TftDisp_X4ms = 4/4;//8
                        g_TftDispSt = TFT_WriteDataDelay;
                        break;
                case TFT_WriteDataDelay:
                        if(s_TftDisp_X4ms)
                                return;
                        //WriteData(0x11);
                        //s_TftDisp_X4ms = 120/4;
                        g_TftDispSt = TFT_WriteData;
                        //break;
                case TFT_WriteData:
                        if(s_TftDisp_X4ms)
                                return;
                        TftDispInit();
                        s_TftDisp_X4ms = 0/4;//10
                        g_TftDispSt = TFT_WriteDataEnd;
                        break;
                case TFT_WriteDataEnd:
                        if(s_TftDisp_X4ms)
                                return;
                        WriteComm(0x29);       
                        s_TftDisp_X4ms = 0/4;//20
                        g_TftDispSt = TFT_WaitStandby;
                        break;
                case TFT_WaitStandby:
                        if(s_TftDisp_X4ms)
                                return;       
                        g_TftDispSt = TFT_Standby;
                        break;
                case TFT_Standby:
                        if(s_TftDisp_X4ms)
                                return;               
                        break;
                default:
                        g_TftDispSt = TFT_Idle;
                        break;
        }
}
bojue2015 回答时间:2018-2-27 16:38:44
//写命令函数
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);
}
bojue2015 回答时间:2018-2-27 16:39:02
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);
}
bojue2015 回答时间:2018-2-27 16:51:22
SPI读写LCD采用的是指令和库函数结合的方式,以优化减少读写时间,加快显示。
zhjb1 回答时间:2018-3-14 09:18:08
楼主:您好!我玩过很多屏。直接感觉您的初始化[软复位时间太短],一般的TFT LCD多数需要不少于40mS的软复位,如果有硬件复位例外,但眼见复位的时间也应该不少于数十到百毫秒以上。建议硬件复位之后CPU再启动,如果仅软复位时间不少于50mS,可以设置为100mS较为可靠。当然较新的驱屏芯片可能时间会少点的。此外TFTLCD许多是支持改写内带的FLASHROM的,这个需要严格按照手册操作。气态的就是如果曾经电源接反过——不一定烧屏,如果没有烧,再接正确了就可能会出现你描述的问题。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

埃斯提爱慕 回答时间:2018-3-15 15:46:30
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版