OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4792|回复: 3

stm32 TFTLCD初始化之后打开不了串口中断

[复制链接]

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2020-11-16
在线时间
19 小时
发表于 2021-9-4 08:37:52 | 显示全部楼层 |阅读模式
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初始化之前,复位后就这样了,多按几次可能会正常,大部分是这种情况

把串口打开程序放到LCD初始化之前,复位后就这样了,多按几次可能会正常,大部分是这种情况


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-9-4 14:55:27 | 显示全部楼层
那个LCD的驱动文件有打印的吧! 里面有打印的话 要去先初始化完串口再弄!不知道是不是这个冲突
日常敲键--头秃一片
回复 支持 反对

使用道具 举报

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2020-11-16
在线时间
19 小时
 楼主| 发表于 2021-9-4 19:44:07 | 显示全部楼层
日渐秃兀 发表于 2021-9-4 14:55
那个LCD的驱动文件有打印的吧! 里面有打印的话 要去先初始化完串口再弄!不知道是不是这个冲突

您好,我已经把驱动文件里面的printf去掉了,就是串打开和这个LCD初始化的顺序有影响,按复位键好几次才能正常,有时候就灰屏,感觉是死机了似的
回复 支持 反对

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-9-6 15:02:19 | 显示全部楼层
FlashGQ 发表于 2021-9-4 19:44
您好,我已经把驱动文件里面的printf去掉了,就是串打开和这个LCD初始化的顺序有影响,按复位键好几次才 ...

上仿真器跟着走 看看对应效果执行有没有出现!还是直接报硬件中断了
日常敲键--头秃一片
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 03:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表