lvgl填充函数的位置:

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
	LCD_Color_Fill(area->x1,area->y1,area->x2,area->y2,(u16*)color_p);
    lv_disp_flush_ready(disp_drv);
}

填充函数的具体内容

spi+dma连续传输(速度较快)

void LCD_Color_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 *color_p)
{
	u16 i,j,width,height; 
	width = xend-xsta+1;
	height = yend-ysta+1;
	uint32_t size = width * height;
	
	ST7789V_SetLcdAddress(xsta,ysta,xend,yend,USE_HORIZONTAL);
	
	hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
	hspi1.Instance->CR1|=SPI_CR1_DFF;
	HAL_SPI_Transmit_DMA(&hspi1,(uint8_t*)color_p,size);
	while(__HAL_DMA_GET_COUNTER(&hdma_spi1_tx)!=0);
	
	hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
	hspi1.Instance->CR1&=~SPI_CR1_DFF;
	
}

spi间隔传输

void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 *color,uint8_t increasing)
{          
	u16 i,j; 
	ST7789V_SetLcdAddress(xsta,ysta,xend,yend,USE_HORIZONTAL);//设置显示范围
	
	for(i=ysta;i<=yend;i++)
	{		
		for(j=xsta;j<=xend;j++)
		{
			ST7789V_SPISendData2Bytes(*color);
			if(increasing == 1){color++;}
			
		}
	} 					  	    
}

注意:
1.填充函数传入的颜色指针需要递增,如果不使用spi的dma传输函数,那么color需要手动+1;

void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 *color,uint8_t increasing)
{          
	u16 i,j; 
	ST7789V_SetLcdAddress(xsta,ysta,xend,yend,USE_HORIZONTAL);//设置显示范围
	for(i=ysta;i<=yend;i++)
	{		
		for(j=xsta;j<=xend;j++)
		{
			ST7789V_SPISendData2Bytes(*color);
			if(increasing == 1){color++;}
		}
	} 					  	    
}

2.传入lcd驱动的位置范围要正确,否则图形会出现有规律的歪斜

ST7789V_SetLcdAddress(xsta,ysta,xend,yend,USE_HORIZONTAL);//设置显示范围

3.填充颜色的数据数量要对,否则会出现规律的未上色区域

HAL_SPI_Transmit_DMA(&hspi1,(uint8_t*)color_p,size);

for(i=ysta;i<=yend;i++)
{		
	for(j=xsta;j<=xend;j++)
	{
		ST7789V_SPISendData2Bytes(*color);
		if(increasing == 1){color++;}
	}
} 	
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐