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

用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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版