STM32F407使用DMA加速刷新LVGL

本人使用国产的实时操作系统RT-thread,屏幕使用的TFTLCD,屏幕IC是LIL9341

这里就不讲移植了,如果需要,请评论,后面出;

前提:移植好LCD,移植好LVGL(不适用DMA能正常显示)
  1. 使用STM32Cubemax配置DMA

STM32F407使用DMA加速刷新LVGL_第1张图片

上图中,Burst Size的具体配置根据芯片参考手册来选择,如果要用FIFO的话就需要选择

STM32F407使用DMA加速刷新LVGL_第2张图片

因为LVGL需要屏幕数据传输完后通知一下LVGL,所以这里要启用DMA中断

STM32F407使用DMA加速刷新LVGL_第3张图片

2、添加代码

2.1、注册DMA中断
/*
*注册的是传输完成中断
*具体注册的中断服务函数在lv_port_disp.c中
*/
HAL_DMA_RegisterCallback(&hdma_memtomem_dma2_stream7, HAL_DMA_XFER_CPLT_CB_ID, LVGL_LCD_FSMC_DMA_pCallback);
STM32F407使用DMA加速刷新LVGL_第4张图片

2.2、lv_port_disp.c中添加代码
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
		LCD_Address_Set(area->x1,area->y1,area->x2,area->y2); //<盖函数是设置LCD屏幕的扫描区域
		HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream7, (uint32_t)color_p, (uint32_t)&LCD->LCD_RAM,
																	((area->x2+1) - area->x1) * ((area->y2+1) - area->y1));
}

void LVGL_LCD_FSMC_DMA_pCallback(DMA_HandleTypeDef *_hdma)
{
	lv_disp_flush_ready(&disp_drv1);
}
/* 在LCD驱动文件中添加 */
void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
  LCD_WR_REG(0x2a);//列地址设置
  LCD_WR_DATA(x1>>8);
  LCD_WR_DATA(x1&0x00ff);
  LCD_WR_DATA(x2>>8);
  LCD_WR_DATA(x2&0x00ff);
  LCD_WR_REG(0x2b);//行地址设置
  LCD_WR_DATA(y1>>8);
  LCD_WR_DATA(y1&0x00ff);
  LCD_WR_DATA(y2>>8);
  LCD_WR_DATA(y2&0x00ff);
  LCD_WR_REG(0x2c);//储存器写(2C命令之后开始写颜色数据)
}
STM32F407使用DMA加速刷新LVGL_第5张图片

2.3、void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)讲解
2.3.1、列地址设置指令

指令:0X2A

列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x 坐标):

STM32F407使用DMA加速刷新LVGL_第6张图片

在默认扫描方式时,该指令用于设置 x 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SC 和 EC,即列地址的起始值和结束值,SC 必须小于等于 EC,且 0≤SC/EC≤239。

一般在设置 x 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SC 即可,因为如果 EC 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。

2.3.2、页地址设置指令

指令:0X2B

页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y 坐标):

STM32F407使用DMA加速刷新LVGL_第7张图片

用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP 和 EP,即页地址的起始值和结束值,SP 必须小于等于 EP,且 0≤SP/EP≤319。

一般在设置y 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SP 即可,因为如果 EP 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。

2.3.3、写 GRAM 指令

指令:0X2C

写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写:

STM32F407使用DMA加速刷新LVGL_第8张图片

在收到指令 0X2C 之后,数据有效位宽变为 16 位,我们可以连续写入 LCD GRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。

成功!!! 很丝滑!!

开源地址:STM32F407使用DMA加速LVGL: STM32F407使用DMA加速LVGL (gitee.com)

基于单片指纹考勤系统设计(项目中还是有很多BUG,不够完善):基于单片机的指纹考勤系统设计-RT-Thread-LVGL: 基于单片机得指纹考勤系统 (gitee.com)

你可能感兴趣的:(LVGL移植,arm,stm32)