初级会员

- 积分
- 108
- 金钱
- 108
- 注册时间
- 2020-11-16
- 在线时间
- 19 小时
|
1. 我是通过Cubemx编写的程序,TFTLCD初始化,显示都没有问题,但是我的项目需要串口接收数据,发现TFTLCD初始化之后再打开串口中断,串口无法接收数据,单独测试串口接收数据是没问题的
2. 偶然间发现把TFTLCD初始化的放到串口中断开启的后面就能正常使用了,但是显示屏偶尔会出现问题,比如刚复位进入不了程序,或者用着用着就灰屏了,不知道啥问题,有没有专业的人帮忙看看哪里有问题。
```c
TFTLCD_Init(); //初始化显示屏
LL_mDelay(100);
POINT_COLOR=BLACK;
LCD_Clear(WHITE);
LCD_InterfaceInit();
LL_mDelay(500);
LCD_ShowString(5,90,230,16,16,(uint8_t *)"Start Collecting:");
// LCD_ShowString(5,290,150,16,16,(uint8_t *)"Sampling times(s):");
LL_mDelay(500);
LL_USART_EnableIT_PE(USART2); //开启串口总中断
LL_USART_EnableIT_RXNE(USART2); //开启串口2接收中断
LL_USART_EnableIT_ERROR(USART2); //开启串口2错误中断
LL_TIM_EnableIT_UPDATE(TIM2);
LL_TIM_EnableCounter(TIM2);
LL_GPIO_ResetOutputPin(LED0_GPIO_Port,LED0_Pin);
```
如上面代码中,把后面的串口开启放到TFTLCD_Init()前面就行,但是放到后面就不行了,串口不接收数据
下面是初始化LCD的代码,这个是原子的:
```c
void TFTLCD_Init(void)
{
LL_mDelay(50); // delay 50 ms
//尝试9341 ID的读取
LCD_WR_REG(0XD3);
lcddev.id=LCD_RD_DATA(); //dummy read
lcddev.id=LCD_RD_DATA(); //读到0X00
lcddev.id=LCD_RD_DATA(); //读取93
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA(); //读取41
if(lcddev.id!=0X9341) //非9341,尝试看看是不是NT35310
{
LCD_WR_REG(0XD4);
lcddev.id=LCD_RD_DATA();//dummy read
lcddev.id=LCD_RD_DATA();//读回0X01
lcddev.id=LCD_RD_DATA();//读回0X53
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA(); //这里读回0X10
if(lcddev.id!=0X5310) //也不是NT35310,尝试看看是不是NT35510
{
LCD_WR_REG(0XDA00);
lcddev.id=LCD_RD_DATA(); //读回0X00
LCD_WR_REG(0XDB00);
lcddev.id=LCD_RD_DATA(); //读回0X80
lcddev.id<<=8;
LCD_WR_REG(0XDC00);
lcddev.id|=LCD_RD_DATA(); //读回0X00
if(lcddev.id==0x8000)lcddev.id=0x5510;//NT35510读回的ID是8000H,为方便区分,我们强制设置为5510
if(lcddev.id!=0X5510) //也不是NT5510,尝试看看是不是SSD1963
{
LCD_WR_REG(0XA1);
lcddev.id=LCD_RD_DATA();
lcddev.id=LCD_RD_DATA(); //读回0X57
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA(); //读回0X61
if(lcddev.id==0X5761)lcddev.id=0X1963;//SSD1963读回的ID是5761H,为方便区分,我们强制设置为1963
}
}
}
// printf(" LCD ID:%x\r\n",lcddev.id); //打印LCD ID
if(lcddev.id==0X9341) //9341初始化
{
LCD_WR_REG(0xCF);
/*由于代码过长这里只放了主要部分 */
}else if(lcddev.id==0X1963)
{
LCD_WR_REG(0xE2); //Set PLL with OSC = 10MHz (hardware), Multiplier N = 35, 250MHz < VCO < 800MHz = OSC*(N+1), VCO = 300MHz
LCD_WR_DATA(0x1D); //参数1
LCD_WR_DATA(0x02); //参数2 Divider M = 2, PLL = 300/(M+1) = 100MHz
LCD_WR_DATA(0x04); //参数3 Validate M and N values
opt_delay(100);
LCD_WR_REG(0xE0); // Start PLL command
LCD_WR_DATA(0x01); // enable PLL
HAL_Delay(10);
LCD_WR_REG(0xE0); // Start PLL command again
LCD_WR_DATA(0x03); // now, use PLL output as system clock
HAL_Delay(12);
LCD_WR_REG(0x01); //软复位
HAL_Delay(10);
LCD_WR_REG(0xE6); //设置像素频率,33Mhz
LCD_WR_DATA(0x2F);
LCD_WR_DATA(0xFF);
LCD_WR_DATA(0xFF);
LCD_WR_REG(0xB0); //设置LCD模式
LCD_WR_DATA(0x20); //24位模式
LCD_WR_DATA(0x00); //TFT 模式
LCD_WR_DATA((SSD_HOR_RESOLUTION-1)>>8);//设置LCD水平像素
LCD_WR_DATA(SSD_HOR_RESOLUTION-1);
LCD_WR_DATA((SSD_VER_RESOLUTION-1)>>8);//设置LCD垂直像素
LCD_WR_DATA(SSD_VER_RESOLUTION-1);
LCD_WR_DATA(0x00); //RGB序列
LCD_WR_REG(0xB4); //Set horizontal period
LCD_WR_DATA((SSD_HT-1)>>8);
LCD_WR_DATA(SSD_HT-1);
LCD_WR_DATA(SSD_HPS>>8);
LCD_WR_DATA(SSD_HPS);
LCD_WR_DATA(SSD_HOR_PULSE_WIDTH-1);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_REG(0xB6); //Set vertical period
LCD_WR_DATA((SSD_VT-1)>>8);
LCD_WR_DATA(SSD_VT-1);
LCD_WR_DATA(SSD_VPS>>8);
LCD_WR_DATA(SSD_VPS);
LCD_WR_DATA(SSD_VER_FRONT_PORCH-1);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_REG(0xF0); //设置SSD1963与CPU接口为16bit
LCD_WR_DATA(0x03); //16-bit(565 format) data for 16bpp
LCD_WR_REG(0x29); //开启显示
//设置PWM输出 背光通过占空比可调
LCD_WR_REG(0xD0); //设置自动白平衡DBC
LCD_WR_DATA(0x00); //disable
LCD_WR_REG(0xBE); //配置PWM输出
LCD_WR_DATA(0x05); //1设置PWM频率
LCD_WR_DATA(0xFE); //2设置PWM占空比
LCD_WR_DATA(0x01); //3设置C
LCD_WR_DATA(0x00); //4设置D
LCD_WR_DATA(0x00); //5设置E
LCD_WR_DATA(0x00); //6设置F
LCD_WR_REG(0xB8); //设置GPIO配置
LCD_WR_DATA(0x03); //2个IO口设置成输出
LCD_WR_DATA(0x01); //GPIO使用正常的IO功能
LCD_WR_REG(0xBA);
LCD_WR_DATA(0X01); //GPIO[1:0]=01,控制LCD方向
LCD_SSD_BackLightSet(100);//背光设置为最亮
}
```
请问大家有没有遇到类似的问题?怎么解决呢?
这个是串口初始化放到前面的显示情况,偶尔重新上电会正常显示,但是大部分情况是非正常显示,全靠运气,脑壳疼
把串口打开程序放到LCD初始化之前,复位后就这样了,多按几次可能会正常,大部分是这种情况
|
|