CH582M 移植LVGL時使用DMA發(fā)送數(shù)據(jù)異常的問題

在移植LVGL的時候 使用SPI一個個點去畫的時候顯示時正常的

但是因為LVGL生成的是16位RGB565數(shù)據(jù)格式,顯示出現(xiàn)異常

// LVGL 屏幕數(shù)據(jù) 驅(qū)動

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t *color_p){

#if 1 // 逐點畫

? ? if(disp_flush_enabled) {

? ? ? ? //The most simple case (but also the slowest) to put all pixels to the screen one-by-one

? ? ? ? int32_t x;

? ? ? ? int32_t y;

? ? ? ? for(y = area->y1; y <= area->y2; y++) {

? ? ? ? ? ? for(x = area->x1; x <= area->x2; x++) {

? ? ? ? ? ? ? ? //Put a pixel to the display. For example:

? ? ? ? ? ? ? ? //put_px(x, y, *color_p)

? ? ? ? ? ? ? ? LCD_DrawPoint(x, y, color_p->full);? // 單獨一個個點畫是正常的 但是這樣太慢了

? ? ? ? ? ? ? ? color_p++;

? ? ? ? ? ? }

? ? ? ? }

? ? }

#else?// DMA

? ? LCD_Address_Set(area->x1, area->y1, area->x2, area->y2);?// 設(shè)置屏幕起始和結(jié)束地址

? ?// 這里的color_p是一個16位的RGB565顏色緩沖區(qū)

? ? LCD_Write_DMA_Data(color_p, (area->x2-area->x1+1)*(area->y2-area->y1+1)*2);?

#endif

? ? /*IMPORTANT!!!

? ? ?*Inform the graphics library that you are ready with the flushing*/

? ? lv_disp_flush_ready(disp_drv);

}

//******************* SPI 單獨畫點**********

void LCD_DrawPoint(uint16_t x,uint16_t y,uint16_t color){

? ? LCD_Address_Set(x,y,x,y);//設(shè)置光標位置

? ? LCD_WR_DATA(color);

}

void LCD_WR_DATA(uint16_t dat){

? ? LCD_Writ_Bus(dat>>8);

? ? LCD_Writ_Bus(dat);

}

//******************* SPI 單獨畫點**********?

// DMA 數(shù)據(jù)發(fā)送時序

void LCD_Write_DMA_Data(uint8_t* data,uint16_t len){

? ? ? ?GPIOA_SetBits(DC_PIN); // 寫數(shù)據(jù)

? ? ? ?GPIOA_ResetBits(CS_PIN);

?????? SPI0_MasterDMATrans(data,len);

?? ? ? GPIOA_SetBits(CS_PIN);

}

// 這里是官方庫文件 沒有修改

void SPI0_MasterDMATrans(uint8_t *pbuf, uint16_t len){

? ? R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;

? ? R16_SPI0_DMA_BEG = (uint32_t)pbuf;

? ? R16_SPI0_DMA_END = (uint32_t)(pbuf + len);

? ? R16_SPI0_TOTAL_CNT = len;

? ? R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END | RB_SPI_IF_DMA_END;

? ? R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE;

? ? while(!(R8_SPI0_INT_FLAG & RB_SPI_IF_CNT_END));

? ? R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;

}

  1. 我想請教的問題,因為顏色數(shù)據(jù)時16位的,而SPI的DMA發(fā)送的是8位數(shù)據(jù),我看到有帖子說可以設(shè)置位寬,不知道CH582M是否支持設(shè)置,規(guī)格書沒找到配置項,找到一個數(shù)據(jù)位序選擇

  2. 請問DMA最大一次性只能發(fā)送4095個數(shù)據(jù)嗎?能否修改那么CH32V208這類的MCU是否沒這個限制呢

    下圖是我用兩種方式的顯示效果

    上圖是DMA方式? 下圖是逐個畫的?



  3. 1671604407152876.jpg

  4. 1671604407130765.jpg

經(jīng)過排查,顯示異常是因為自己代碼中配置屏幕的區(qū)域造成的,現(xiàn)在顯示正常了

感覺SPI 驅(qū)動 320*240屏幕還是有點慢,有拉窗簾的感覺,就是不知道DMA的4095的限制能不能去掉


主機模式下 SPI 數(shù)據(jù)收發(fā)總字節(jié)數(shù),低12 位有效。在使用 DMA 時一次最多可以收發(fā) 4095 個字節(jié)。不支持從機模式。

目前暫支持該模式。



樓主你好,可以參考一下你的移植程序嗎,我的lvgl一直移植不成功,謝謝!


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频