STM32 F429 LittleVGL 使用DMA2D 加速(阻塞式) 发现最近随便转载的很多啊,未经授权禁止转载!抄袭!!否则转载者死全家!!另外这是我的笔记,不是教程,难免会有错误,不具有很高的参考性,望周知。
步骤 在ltdc.c文件中添加使用DMA2D画点的函数(先在STM32CubeMX中启用DMA2D)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 void LTDC_DMA2D_Fill_Color (uint16_t start_x, uint16_t start_y, uint16_t end_x, uint16_t end_y, uint16_t *color) { #define LTDC_FRAMEBUF_ADDR 0xc0000000; #define TFT_WEIGHT 800 #define TFT_WIDTH 480 DMA2D_InitTypeDef DMA2D_InitStruct; uint32_t Xaddress = 0 ; uint32_t timeout=0 ; uint16_t OutputOffset; uint16_t NumberOfLine; uint16_t PixelPerLine; Xaddress = 0xc0000000 + 2 * (800 * start_y + start_x); OutputOffset = 800 -(end_x-start_x+1 ); NumberOfLine = end_x-start_x+1 ; PixelPerLine = end_y-start_y+1 ; DMA2D->CR&=~(DMA2D_CR_START); DMA2D->CR=DMA2D_M2M; DMA2D->FGPFCCR=DMA2D_RGB565; DMA2D->FGOR=0 ; DMA2D->OOR=OutputOffset; DMA2D->FGMAR=(uint32_t )color; DMA2D->OMAR=Xaddress; DMA2D->NLR=(PixelPerLine)|(NumberOfLine<<16 ); DMA2D->CR|=DMA2D_CR_START; while ((DMA2D->ISR&(DMA2D_FLAG_TC))==0 ) { timeout++; if (timeout>0X1FFFFF )break ; } DMA2D->IFCR|=DMA2D_FLAG_TC; }
修改LittleVGL显示接口,在lv_port_disp.c文件中:
1 2 3 4 5 6 7 8 9 10 static void disp_flush (lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { LTDC_DMA2D_Fill_Color(area->x1, area->y1, area->x2, area->y2, (uint16_t *)color_p); lv_disp_flush_ready(disp_drv); }
编译下载测试,FPS还是33,但是全屏刷新从原来的5 FPS提高到了10FPS,肉眼可见的提升。
参考资料 [1] stm32 DMA2D使用中断LVGL,提高LVGL帧率_紫枫洛天的博客-CSDN博客_lvgl优化
[2] 分享一个littlevgl的基本demo,通过dma进行绘制,提高了速度 - STM32F429 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)