使用TFT实时显示动态图线的问题

2019-07-24 12:49发布

各位大神,小弟在显示动态曲线的时候出了些问题,如下:
小弟用的单片机是正点原子的F1战舰版,最近在做32和FPGA之间的数据传输,以前都是FPGA采取2MHZ以下的数据,然后利用SPI通信协议传输给32,32再将数据再TFT显示屏上动态显示出来,自己写的程序,在显示低中频时效果还行,但是最近做高频,外部输入信号差不多有60MHZ,这就导致32在画动态曲线的时候,由于32内部执行的语句过多,导致,32在执行完显示语句以及擦线语句后,存在一个很短的时间间隔,但对于高频信号,就存在一个采取间断,所接收到的数据,并不是连续的,因此画的动态曲线也是断断续续,用通俗的话来讲,就是外部传输速率太快,然后32内部执行的速度跟不上(由于程序上,32要执行的语句过多导致)。请求各位大神   ,能不能帮小弟指点下,下面是我的程序:
void showline(float led0pwmval)//此函数直接调用   led0pwmval为外部接收到的数据
{
        static u16 i;
       static u16 x=1;
       static u16 buf[481];  //由于小弟采用的是480*800的TFT显示屏,利用横轴  作为数据的X轴
        if(x>480)
        {       
                POINT_COLOR=YELLOW;
                for(i=0;i<480;i++)
                {
                        buf[i]=buf[i+1];  //实现数据的左移
                }
                buf[480]=led0pwmval*A;//将新接收到的数据传输给数组的最后一位,A为数据的放大参数
                for(i=0;i<479;i++)
                {
                        if(buf[i+1]>buf[i])        LCD_DrawLine(i,800-buf[i]/B,i+1,800-buf[i+1]/B);   //画线函数   B为数据的缩小参数
                        else LCD_DrawLine(i,800-buf[i+1]/B,i+1,800-buf[i]/B);
                }
                if(i==479)//边界数据的处理
                {
                        if(buf[480]>buf[479])        LCD_DrawLine(479,800-buf[479]/B,480,800-buf[480]/B);   
                        else LCD_DrawLine(479,800-buf[480]/B,480,800-buf[479]/B);
                }
                for(i=0;i<480;i++)
                {
                       
                        if(buf[i+1]>buf[i])LCD_CDrawLine(i,800-buf[i]/B,i+1,800-buf[i+1]/B);//擦线函数  将buf所存的上次数据,全部擦掉(即,改为背景 {MOD})
                        else LCD_CDrawLine(i,800-buf[i+1]/B,i+1,800-buf[i]/B);
                }
        }
        else
                {
                        POINT_COLOR=YELLOW;
                        buf[0]=0;
                        x++;
                        delay_ms(10);
                        buf[x]=led0pwmval*A;
                        if(buf[x]>buf[x-1])        LCD_DrawLine(x-1,800-buf[x-1]/B,x,800-buf[x]/B);   
                        else LCD_DrawLine(x-1,800-buf[x]/B,x,800-buf[x-1]/B);
                        if(x==480)
                        {
                                for(x=0;x<481;x++)
                                {
                                        if(buf[x+1]>buf[x])LCD_CDrawLine(x,800-buf[x]/B,x+1,800-buf[x+1]/B);
                                        else LCD_CDrawLine(x,800-buf[x+1]/B,x+1,800-buf[x]/B);
                                }       
                        }
          }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
XCN
2019-07-24 13:54
我有一个建议,不知道管用不管用。你既然接受的数据太快处理不来,时间不够空间来凑。用DMA和串口空闲中断配合接受数据,并存储在数组里面,多久做一次处理就好了,处理时间可以和人眼的刷新时间相匹配。具体细节还需要你自己考量。个人建议,我原来做实时曲线是这样处理数据的。

一周热门 更多>