本帖最后由 bojue2015 于 2018-2-25 11:05 编辑 用STM32F030驱动TFT-LCD(TFT-LCD初始化总时间不到15MS),驱动芯片ST7789V,左上角刚上电小几率出现一小块花屏! 刷屏流程为:上电--屏供电--初始化(总延时不到20MS,不能再长)--整体刷黑底---需要的位置上刷图片。 左上角有小几率出现小块花屏,之后如果需要切换显示的话,会再刷黑底,花屏消失。之后坏样机再重新上电也难以复现此现象。 最新的优化方法是上电的初次刷两次黑底,能有效改善此问题,但几率性还是存在。 |
åªæå·¦ä¸è§æåºç°
【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异常
STM32F0 ADC-DMA方式采集2路数据时出现问题
STM32F030C8T6,TIM16定时慢很多问题?
首先你这问题的表述太过于简单 可能是初始化 或者是干扰导致的 具体情况 还得根据你实际情况看 先把问题条件 症状表述清楚 才好
评分
查看全部评分
评分
查看全部评分
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);
}
评分
查看全部评分