|
本帖最后由 bojue2015 于 2018-2-25 11:05 编辑 用STM32F030驱动TFT-LCD(TFT-LCD初始化总时间不到15MS),驱动芯片ST7789V,左上角刚上电小几率出现一小块花屏! 刷屏流程为:上电--屏供电--初始化(总延时不到20MS,不能再长)--整体刷黑底---需要的位置上刷图片。 左上角有小几率出现小块花屏,之后如果需要切换显示的话,会再刷黑底,花屏消失。之后坏样机再重新上电也难以复现此现象。 最新的优化方法是上电的初次刷两次黑底,能有效改善此问题,但几率性还是存在。 |
åªæå·¦ä¸è§æåºç°
请都大神--STM32F072CB芯片开启HSI48时钟问题
谁能解释一下STM32F0的RTC_IRQHandler中断中EXTI_Line17的作用?
【STM32F0开发日志/评测/笔记】+互补PWM波的产生
STM32F030 PB14和PB15无法输出PWM求助
【STM32F030探索套件】序列之五 外部中断
【STM32F0开发日志---二】+ucosii.2.92移植在STM32F030
上传个STM32F0+5110+内部温度传感器的菜鸟实例
【STM32F030探索套件使用问题】STM32F030 SPI方式驱动ST7565LCD失败
求一份STM32F051 I2C驱动LCD 12864的例程
STM32F0 M0 向结构体赋值进入HardFault异常
微信公众号
手机版
首先你这问题的表述太过于简单 可能是初始化 或者是干扰导致的 具体情况 还得根据你实际情况看 先把问题条件 症状表述清楚 才好
评分
查看全部评分
评分
查看全部评分
ST7789V有多种工作模式,你这用的是哪一种?
看一下手册中AC Characteristics参数部分。
把时序放慢,比如SPI时钟频率减小,两条读写指令之前增加软件延时。
Sitronix的LCD驱动芯片用的比较多,51上都能驱动,51的时序较慢。
评分
查看全部评分
后期的图形显示把花屏留在了左上角。
评分
查看全部评分
不是初始化时间太短,
初始化代码顺序有问题,建议你看看初始化的码制式设定。好像系统默认的不是565。
{
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
}
初始化代码为供应商提供。
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;
}
}
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);
}
{
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);
}
评分
查看全部评分