本人使用國產(chǎn)的實時操作系統(tǒng)RT-thread,屏幕使用的TFTLCD,屏幕IC是LIL9341
這里就不講移植了,如果需要,請評論,后面出;
前提:移植好LCD,移植好LVGL(不適用DMA能正常顯示)
使用STM32Cubemax配置DMA

上圖中,Burst Size的具體配置根據(jù)芯片參考手冊來選擇,如果要用FIFO的話就需要選擇

因為LVGL需要屏幕數(shù)據(jù)傳輸完后通知一下LVGL,所以這里要啟用DMA中斷

2、添加代碼
2.1、注冊DMA中斷
/*
*注冊的是傳輸完成中斷
*具體注冊的中斷服務(wù)函數(shù)在lv_port_disp.c中
*/
HAL_DMA_RegisterCallback(&hdma_memtomem_dma2_stream7, HAL_DMA_XFER_CPLT_CB_ID, LVGL_LCD_FSMC_DMA_pCallback);

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); //<蓋函數(shù)是設(shè)置LCD屏幕的掃描區(qū)域
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驅(qū)動文件中添加 */
void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
LCD_WR_REG(0x2a);//列地址設(shè)置
LCD_WR_DATA(x1>>8);
LCD_WR_DATA(x1&0x00ff);
LCD_WR_DATA(x2>>8);
LCD_WR_DATA(x2&0x00ff);
LCD_WR_REG(0x2b);//行地址設(shè)置
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命令之后開始寫顏色數(shù)據(jù))
}

2.3、void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)講解
2.3.1、列地址設(shè)置指令
指令:0X2A
列地址設(shè)置指令,在從左到右,從上到下的掃描方式(默認)下面,該指令用于設(shè)置橫坐標(x 坐標):

在默認掃描方式時,該指令用于設(shè)置 x 坐標,該指令帶有 4 個參數(shù),實際上是 2 個坐標值:SC 和 EC,即列地址的起始值和結(jié)束值,SC 必須小于等于 EC,且 0≤SC/EC≤239。
一般在設(shè)置 x 坐標的時候,我們只需要帶 2 個參數(shù)即可,也就是設(shè)置 SC 即可,因為如果 EC 沒有變化,我們只需要設(shè)置一次即可(在初始化 ILI9341 的時候設(shè)置),從而提高速度。
2.3.2、頁地址設(shè)置指令
指令:0X2B
頁地址設(shè)置指令,在從左到右,從上到下的掃描方式(默認)下面,該指令用于設(shè)置縱坐標(y 坐標):

用于設(shè)置 y 坐標,該指令帶有 4 個參數(shù),實際上是 2 個坐標值:SP 和 EP,即頁地址的起始值和結(jié)束值,SP 必須小于等于 EP,且 0≤SP/EP≤319。
一般在設(shè)置y 坐標的時候,我們只需要帶 2 個參數(shù)即可,也就是設(shè)置 SP 即可,因為如果 EP 沒有變化,我們只需要設(shè)置一次即可(在初始化 ILI9341 的時候設(shè)置),從而提高速度。
2.3.3、寫 GRAM 指令
指令:0X2C
寫 GRAM 指令,在發(fā)送該指令之后,我們便可以往 LCD的 GRAM 里面寫入顏色數(shù)據(jù)了,該指令支持連續(xù)寫:

在收到指令 0X2C 之后,數(shù)據(jù)有效位寬變?yōu)?16 位,我們可以連續(xù)寫入 LCD GRAM 值,而 GRAM 的地址將根據(jù) MY/MX/MV 設(shè)置的掃描方向進行自增。
成功?。。?很絲滑??!

開源地址:STM32F407使用DMA加速LVGL: STM32F407使用DMA加速LVGL (gitee.com)文章來源:http://www.zghlxwxcb.cn/news/detail-822214.html
基于單片指紋考勤系統(tǒng)設(shè)計(項目中還是有很多BUG,不夠完善):基于單片機的指紋考勤系統(tǒng)設(shè)計-RT-Thread-LVGL: 基于單片機得指紋考勤系統(tǒng) (gitee.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-822214.html
到了這里,關(guān)于STM32F407使用DMA加速刷新LVGL的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!