各位大神,小弟在显示动态曲线的时候出了些问题,如下:
小弟用的单片机是正点原子的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);
}
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>