上次讲到使用全屏做一个缓冲区,因为cpuRAM空间不足,无法实现,想办法使用一行作为一个缓冲区的模式:
老的全屏刷新程序:
void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
{
uint16_t i,j;
LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
for(i=ysta;i<yend;i++)
{
for(j=xsta;j<xend;j++)
{
LCD_WR_DATA(color);
}
}
}
修改后的程序:
uint8_t line[480];
void LCD_Fill_new(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
{
uint16_t i,j,h;
LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
for(i=ysta;i<yend;i++)
{
for(j=xsta;j<xend;j++)
{
//LCD_WR_DATA(color);
line[2*j] = color>>8;
line[2*j+1] = color;
}
//HAL_Delay(1);
//HAL_SPI_Transmit(&hspi1, &line, xend*2, 0x00); //再考虑区域问题
while(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_BUSY_TX); //等待SPI发送完成
HAL_SPI_Transmit_DMA(&hspi1, &line, xend*2); //再考虑区域问题
}
}
一行是240个点,每个点是2个字节来表示RGB,所以使用了480个字节的缓冲区作为一行;显示刷新率大大提高了,原来是肉眼空间的从上往下刷新一次到了一闪就是一个整屏,可以通过波形计算,现在的整屏刷新只需要50多mS:
一行480个字节的刷新时间是302uS
整个屏幕的刷新时间是48mS
每个字节的时间是1.377uS,更重要的是每个字节之间都是不浪费时间的。
别的写字符之类的函数还在想办法解决如果利用缓冲区提高显示刷新速度。
修改程序后,显示器的刷新率从1秒多刷一整屏,到了48mS刷一整屏,还只用了1行作为缓冲区。