OpenEdv-开源电子网

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

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

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-7-11
在线时间
3 小时
发表于 2018-7-11 10:03:17 | 显示全部楼层 |阅读模式
10金钱
各位大神,小弟在显示动态曲线的时候出了些问题,如下:
小弟用的单片机是正点原子的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所存的上次数据,全部擦掉(即,改为背景色)
                        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);
                                }       
                        }
          }
}


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

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2017-3-13
在线时间
24 小时
发表于 2018-7-11 17:57:16 | 显示全部楼层
我有一个建议,不知道管用不管用。你既然接受的数据太快处理不来,时间不够空间来凑。用DMA和串口空闲中断配合接受数据,并存储在数组里面,多久做一次处理就好了,处理时间可以和人眼的刷新时间相匹配。具体细节还需要你自己考量。个人建议,我原来做实时曲线是这样处理数据的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 13:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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