stm32 DMA2D知識點

紫楓洛天發表於2020-12-13

 

LTDC會一直從視訊記憶體中搬運資料並重新整理資料到液晶屏, 所以我們只需要往視訊記憶體寫資料就可以了

1 什麼是DMA2D

下面資料來自安富萊BSP手冊

 

2 DMA2D工作模式

1 模式 1:暫存器到儲存器模式
這個模式主要用於清屏,也即是將螢幕清為單色效果

2 模式 2:儲存器到儲存器模式
這個模式用於從一個儲存器複製一塊資料到另一個儲存器,比如將攝像頭 OV7670 的輸出影像複製到
LCD 視訊記憶體就可以採用這種方式。

3 模式 3:儲存器到儲存器模式,帶顏色格式轉換
這個模式比模式 2 多了一個顏色格式轉換,比如我們要顯示一幅 RGB888 顏色格式的點陣圖到 RGB565
顏色格式的螢幕,就需要用到這個模式,只需輸入端配置為 RGB888,輸出端配置 RGB565 即可。
點陣圖顏色格式轉換後會顯示到螢幕上。

4 模式 4:儲存器到儲存器模式,帶顏色格式轉換和混合
這個模式比模式 3 多了一個混合操作,通過混合,可以將兩種效果進行混合顯示。

5 模式 5:儲存器到儲存器模式,帶顏色格式轉換和混合,前景色是固定的
同模式 4,只是前景色的顏色值是固定的。

 

1 暫存器到儲存器

這個模式主要用於清屏,也即是將螢幕清為單色效果

此函式主要用於 LCD 的顏色填充。
 第 23 行,設定 DMA2D 採用暫存器往儲存器傳輸資料模式,即 DMA2D 將 OCOLR 暫存器設定顏色
值填充到儲存器裡面。
 第 24 行,OCOLR 暫存器用於設定輸出顏色值,特別注意要跟第 27 行的輸出顏色格式匹配。比如設
置的是 RGB565,那麼設定的顏色值就要是 16 位色的。
 第 25 行,設定輸出填充區的首地址。
 第 26 行,設定輸出行偏移。
 第 27 行,設定輸出顏色格式,如果是輸出到 LCD 視訊記憶體,那麼此格式要與 LCD 顏色格式一致,否則
顯示不正常。
 第 28 行,高 16 位用於設定每行的畫素數,低 16 位用於設定行數,合併起來決定總傳輸次數。
 第 31-34 行,啟動傳輸,並等待傳輸完成。

具體應用:

1 正點原子

//LTDC填充矩形,DMA2D填充
//(sx,sy),(ex,ey):填充矩形對角座標,區域大小為:(ex-sx+1)*(ey-sy+1)
//color:要填充的顏色
//有時候需要頻繁的呼叫填充函式,所以為了速度,填充函式採用暫存器版本,
//不過下面有對應的庫函式版本的程式碼。
void LTDC_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint32_t color)
{
    uint32_t psx,psy,pex,pey;	//以LCD皮膚為基準的座標系,不隨橫豎屏變化而變化
    uint32_t timeout=0;
    uint16_t offline;
    uint32_t addr;

    //座標系轉換
    if(PIXELS_DIR)	//橫屏
    {
        psx=sx;
        psy=sy;
        pex=ex;
        pey=ey;
    } else			//豎屏
    {
        psx=sy;
        psy=PIXELS_H-ex-1;
        pex=ey;
        pey=PIXELS_H-sx-1;
    }
    offline=PIXELS_W-(pex-psx+1);
    addr=(LCD_FRAME_BUF_ADDR+PIXELS_BYTE*(PIXELS_W*psy+psx));

    __HAL_RCC_DMA2D_CLK_ENABLE();	//使能DM2D時鐘
    //DMA2D->CR&=~(DMA2D_CR_START);	//先停止DMA2D
		
		
    DMA2D->CR=DMA2D_R2M;			//暫存器到儲存器模式
		// 設定 DMA2D 採用暫存器往儲存器傳輸資料模式,即 DMA2D 將 OCOLR 暫存器設定顏色值填充到儲存器裡面。
    DMA2D->OPFCCR=LTDC_PIXEL_FORMAT_RGB565;	//設定顏色格式
		
    DMA2D->OOR=offline;				//設定行偏移

    DMA2D->OMAR=addr;				//輸出儲存器地址
    DMA2D->NLR=(pey-psy+1)|((pex-psx+1)<<16);	//設定行數暫存器
    DMA2D->OCOLR=color;						//設定輸出顏色暫存器
		
    DMA2D->CR|=DMA2D_CR_START;				//啟動DMA2D
    while((DMA2D->ISR&(DMA2D_FLAG_TC))==0)	//等待傳輸完成
    {

    }
    DMA2D->IFCR|=DMA2D_FLAG_TC;		//清除傳輸完成標誌
}

2 安富萊

 

/*
*********************************************************************************************************
*	函 數 名: _DMA2D_Fill
*	功能說明: DMA2D顏色填充功能
*	形    參: pDst          顏色資料目的地址
*             xSize         色塊X軸大小,即每行畫素數
*             ySize         色塊Y軸大小,即行數
*             OffLine       前景層影像的行偏移
*             ColorIndex    色塊顏色值
*             PixelFormat   目標區顏色格式
*	返 回 值: 無
*********************************************************************************************************
*/
static void _DMA2D_Fill(void * pDst, 
	                    uint32_t xSize, 
                        uint32_t ySize, 
                        uint32_t OffLine, 
                        uint32_t ColorIndex, 
                        uint32_t PixelFormat) 
{
	
	/* DMA2D採用暫存器到儲存器模式, 這種模式用不到前景層和背景層 */  
	DMA2D->CR      = 0x00030000UL | (1 << 9);
	DMA2D->OCOLR   = ColorIndex;
	DMA2D->OMAR    = (uint32_t)pDst;
	DMA2D->OOR     = OffLine;
	DMA2D->OPFCCR  = PixelFormat;
	DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;

	/* 啟動傳輸 */
	DMA2D->CR   |= DMA2D_CR_START;   

	/* 等待DMA2D傳輸完成 */
	while (DMA2D->CR & DMA2D_CR_START) {} 
}

2 儲存器到儲存器模式

 

 

此函式用於從前景層複製指定區域的顏色資料到目標區域。
 第 25 行,設定 DMA2D 採用儲存器往儲存器傳輸資料模式,輸入儲存器只能是前景層。即 DMA2D
將 FGMAR 暫存器所指向的儲存資料傳輸到暫存器 OMAR 所指向的儲存器。
 第 26 行,設定前景層資料首地址。
 第 27 行,設定輸出儲存器首地址。
 第 28 行,設定前景層行偏移。
 第 29 行,設定輸出區行偏移。
 第 32-33 行,設定前景層和輸出區域都採用 RGB565 顏色格式。另外注意,如果是輸出到 LCD 視訊記憶體,
那麼輸出顏色格式要與 LCD 顏色格式一致,否則顯示不正常。
 第 35 行,高 16 位用於設定每行的畫素數,低 16 位用於設定行數,合併起來決定總傳輸次數。
 第 38-41 行,啟動傳輸,並等待傳輸完成。
注意事項:
1.  使用此函式前務必要呼叫函式__HAL_RCC_DMA2D_CLK_ENABLE 使能 DMA2D 時鐘。

 

1 正點原子

 

//矩形彩色填充函式
void LTDC_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color)
{
		uint32_t psx,psy,pex,pey;	//以LCD皮膚為基準的座標系,不隨橫豎屏變化而變化
    uint32_t timeout=0;
    uint16_t offline;
    uint32_t addr;

    //座標系轉換
    if(PIXELS_DIR)	//橫屏
    {
        psx=sx;
        psy=sy;
        pex=ex;
        pey=ey;
    } else			//豎屏
    {
        psx=sy;
        psy=PIXELS_H-ex-1;
        pex=ey;
        pey=PIXELS_H-sx-1;
    }
    offline=PIXELS_W-(pex-psx+1);
    addr=(LCD_FRAME_BUF_ADDR+PIXELS_BYTE*(PIXELS_W*psy+psx));

	__HAL_RCC_DMA2D_CLK_ENABLE();	//使能DM2D時鐘
	//DMA2D->CR&=~(DMA2D_CR_START);	//先停止DMA2D
		
	DMA2D->CR=DMA2D_M2M;			//儲存器到儲存器模式

		
	DMA2D->FGMAR=(uint32_t)color;		//源地址
	DMA2D->OMAR=addr;				//輸出儲存器地址
		
	DMA2D->FGOR=0;					//前景層行偏移為0
	DMA2D->OOR=offline;				//設定行偏移 

	DMA2D->FGPFCCR=0X02;	//設定顏色格式
		
	DMA2D->NLR=(pey-psy+1)|((pex-psx+1)<<16);	//設定行數暫存器 
		
	DMA2D->CR|=DMA2D_CR_START;					//啟動DMA2D
	while((DMA2D->ISR&(DMA2D_FLAG_TC))==0)		//等待傳輸完成
	{

	} 
	DMA2D->IFCR|=DMA2D_FLAG_TC;				//清除傳輸完成標誌  	
}

2 安富萊

將大小 128*128,顏色格式為 RGB565 的點陣圖繪製到 LCD 起始座標為(328, 20)的區域,輸出顏色格
式也配置為 RGB565。

1.  _DMA2D_Copy((uint32_t *)_acmickey, /* 點陣圖地址 */
2.  (uint32_t *)(SDRAM_LCD_BUF1 + g_LcdWidth*20*2 + 328*2), /* 顯示起始地址(328, 20) */
3.  128, /* 點陣圖長 */
4.  128, /* 點陣圖高 */
5.  0, /* 點陣圖行偏移 */
6.  g_LcdWidth-128, /* 目標區行偏移 */
7.  LTDC_PIXEL_FORMAT_RGB565); /* 目標區顏色格式 */


 第 1 行是點陣圖首地址。
 第 2 行,根據設定的起始座標,計算起始座標在 LCD 視訊記憶體中的具體位置。
SDRAM_LCD_BUF1 表示 LCD 視訊記憶體首地址。
g_LcdWidth*20*2 計算的是行數佔用的位元組數。
328*2 計算的是所在行的具體地址。
乘以 2 是因為 RGB565 顏色格式的 1 個畫素佔用兩個位元組。

 第 5 行是點陣圖的行偏移,行偏移的意思就是一行結束到下一行開始的距離,單位畫素個數。由於整個
點陣圖都要繪製,所有行偏移就是 0。
 第 6 行,輸出行偏移的,由於輸出區需要的長度是 128,那麼行偏移就是 LCD 的長度減去 128。

/*
*********************************************************************************************************
*	函 數 名: _DMA2D_Copy
*	功能說明: 通過DMA2D從前景層複製指定區域的顏色資料到目標區域
*	形    參: pSrc          顏色資料來源地址
*             pDst          顏色資料目的地址
*             xSize         目的區域的X軸大小,即每行畫素數
*             ySize         目的區域的Y軸大小,即行數
*             OffLineSrc    前景層影像的行偏移
*             OffLineDst    輸出的行偏移
*             PixelFormat   目標區顏色格式
*	返 回 值: 無
*********************************************************************************************************
*/
static void _DMA2D_Copy(void * pSrc, 
	                    void * pDst, 
						uint32_t xSize, 
						uint32_t ySize, 
						uint32_t OffLineSrc, 
						uint32_t OffLineDst, 
						uint32_t PixelFormat) 
{

	/* DMA2D採用儲存器到儲存器模式, 這種模式是前景層作為DMA2D輸入 */  
	DMA2D->CR      = 0x00000000UL | (1 << 9);
	DMA2D->FGMAR   = (uint32_t)pSrc;
	DMA2D->OMAR    = (uint32_t)pDst;
	DMA2D->FGOR    = OffLineSrc;
	DMA2D->OOR     = OffLineDst;
	
	/* 前景層和輸出區域都採用的RGB565顏色格式 */
	DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_RGB565;
	DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_RGB565;
	
	DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;

	/* 啟動傳輸 */
	DMA2D->CR   |= DMA2D_CR_START;   

	/* 等待DMA2D傳輸完成 */
	while (DMA2D->CR & DMA2D_CR_START) {} 
}

3 模式 3:儲存器到儲存器模式,帶顏色格式轉換

此函式用於前景層和目標區域的顏色混合,並將混合後的影像輸出到目標區域。
 第 24 行,DMA2D 採用儲存器到儲存器模式, 這種模式把前景層和背景層作為 DMA2D 輸入,且支
持顏色格式轉換和顏色混合。
 第 25 行,設定前景層資料首地址。
 第 26 行,設定背景層資料首地址,這裡是把輸出區中的資料作為背景層。
 第 27 行,設定輸出儲存器首地址。
 第 28 行,設定前景層行偏移。
 第 29 行,設定背景層行偏移。
 第 29 行,設定輸出區行偏移。
 第 33-37 行,前景層,背景層和輸出區都採用 RGB565 格式,並且為前景層配置一個 Alpha 值。另
外注意,如果是輸出到 LCD 視訊記憶體,那麼輸出顏色格式要與 LCD 顏色格式一致,否則顯示不正常。
 第 39 行,高 16 位用於設定每行的畫素數,低 16 位用於設定行數,合併起來決定總傳輸次數。
 第 42-45 行,啟動傳輸,並等待傳輸完成。

 

使用舉例:
將大小 128*128,顏色格式為 RGB565 的點陣圖繪製到 LCD 起始座標為(176, 168)的區域,輸出顏色格
式也配置為 RGB565,透明度設定為 200(255 表示完全不透明,0 表示完全透明)。

1.  _DMA2D_MixColorsBulk((uint32_t *)_achuoying, /* 點陣圖地址 */
2.  0, /* 點陣圖行偏移 */
3.  (uint32_t *)(SDRAM_LCD_BUF1 + g_LcdWidth*168*2 + 176*2), /* 顯示起始地址(176, 168) */
4.  g_LcdWidth-128, /* 目標區行偏移 */
5.  128, /* 目標區長 */
6.  128, /* 目標區高 */
7.  200); /* 點陣圖顯示透明度 200 */


 第 1 行是點陣圖首地址。
 第 2 行是點陣圖的行偏移,行偏移的意思就是一行結束到下一行開始的距離,單位畫素個數。由於整個
點陣圖都要繪製,所有行偏移就是 0。
 第 3 行,根據設定的起始座標,計算起始座標在 LCD 視訊記憶體中的具體位置。
SDRAM_LCD_BUF1 表示 LCD 視訊記憶體首地址。
g_LcdWidth*168*2 計算的是行數佔用的位元組數。
176*2 計算的是所在行的具體地址。
乘以 2 是因為 RGB565 顏色格式的 1 個畫素佔用兩個位元組。
 第 4 行,輸出行偏移的,由於輸出區需要的長度是 128,那麼行偏移就是 LCD 的長度減去 128。

/*
*********************************************************************************************************
*	函 數 名: _DMA2D_MixColorsBulk
*	功能說明: 前景層和目標區域的顏色混合
*	形    參: pColorFG      前景層資料來源地址
*             OffLineSrcFG  前景層影像的行偏移
*             pColorDst     目標區資料地址
*             OffLineDst    目標區的行偏移
*             xSize         目的區域的X軸大小,即每行畫素數
*             ySize         目的區域的Y軸大小,即行數
*             Intens        設定前景層的透明度,255表示完全不透明,0表示完全透明
*	返 回 值: 無
*********************************************************************************************************
*/
static void _DMA2D_MixColorsBulk(uint32_t * pColorFG,  
	                             uint32_t OffLineSrcFG,
                                 uint32_t * pColorDst, 
                                 uint32_t OffLineDst,
							     uint32_t xSize, 
                                 uint32_t ySize, 
                                 uint8_t Intens)
{
	/* DMA2D採用儲存器到儲存器模式, 這種模式前景層和背景層作為DMA2D輸入,且支援顏色格式轉換和顏色混合 */  
	DMA2D->CR      = 0x00020000UL | (1 << 9);
	DMA2D->FGMAR   = (uint32_t)pColorFG;
	DMA2D->BGMAR   = (uint32_t)pColorDst;
	DMA2D->OMAR    = (uint32_t)pColorDst;
	DMA2D->FGOR    = OffLineSrcFG;
	DMA2D->BGOR    = OffLineDst;
	DMA2D->OOR     = OffLineDst;

	/* 前景層,背景層和輸出區都是用的RGB565格式 */
	DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_RGB565
				 | (1UL << 16)
				 | ((uint32_t)Intens << 24);
	DMA2D->BGPFCCR = LTDC_PIXEL_FORMAT_RGB565;
	DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_RGB565;

	DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;
  
	/* 啟動傳輸 */
	DMA2D->CR   |= DMA2D_CR_START;   

	/* 等待DMA2D傳輸完成 */
	while (DMA2D->CR & DMA2D_CR_START) {} 
}

4  模式 4:儲存器到儲存器模式,帶顏色格式轉換和混合

此函式用於前景層和背景層的顏色混合,並將混合後的影像輸出到目標區域。
 第 26 行,DMA2D 採用儲存器到儲存器模式, 這種模式把前景層和背景層作為 DMA2D 輸入,且支
持顏色格式轉換和顏色混合。

 第 27 行,設定前景層資料首地址。
 第 28 行,設定背景層資料首地址。
 第 29 行,設定輸出儲存器首地址。
 第 30 行,設定前景層行偏移。
 第 31 行,設定背景層行偏移。
 第 32 行,設定輸出區行偏移。
 第 35-37 行,前景層,背景層採用 ARGB8888 格式,輸出區採用 RGB565 格式。另外注意,如果是
輸出到 LCD 視訊記憶體,那麼輸出顏色格式要與 LCD 顏色格式一致,否則顯示不正常。
 第 38 行,高 16 位用於設定每行的畫素數,低 16 位用於設定行數,合併起來決定總傳輸次數。
 第 41-44 行,啟動傳輸,並等待傳輸完成。

 

使用舉例:
將兩個大小 128*128,顏色格式為 ARGB8888 的點陣圖混合後繪製到 LCD 起始座標為(24, 168)的區域,
輸出顏色格式配置為 RGB565。

1.  _DMA2D_AlphaBlendingBulk((uint32_t *)_aclufei, /* 前景層點陣圖地址 */
2.  0, /* 前景層行偏移 */
3.  (uint32_t *)_acsuolong, /* 背景層點陣圖地址 */
4.  0, /* 背景層行偏移 */
5.  (uint32_t *)(SDRAM_LCD_BUF1 + g_LcdWidth*168*2 + 24*2), /* 顯示起始地址(24, 168) */
6.  g_LcdWidth-128, /* 目標區行偏移 */
7.  128, /* 目標區長 */
8.  128); /* 目標區高 */


 第 1 行是前景層點陣圖首地址。
 第 2 行是點陣圖的行偏移,行偏移的意思就是一行結束到下一行開始的距離,單位畫素個數。由於整個
點陣圖都要繪製,所有行偏移就是 0。
 第 3 行是背景層點陣圖首地址。
 第 4 行是背景層行偏移。
 第 5 行,根據設定的起始座標,計算起始座標在 LCD 視訊記憶體中的具體位置。
SDRAM_LCD_BUF1 表示 LCD 視訊記憶體首地址。
g_LcdWidth*168*2 計算的是行數佔用的位元組數。
24*2 計算的是所在行的具體地址。
乘以 2 是因為 RGB565 顏色格式的 1 個畫素佔用兩個位元組。
  第 6 行,輸出行偏移的,由於輸出區需要的長度是 128,那麼行偏移就是 LCD 的長度減去 128。

 

/*
*********************************************************************************************************
*	函 數 名: _DMA2D_AlphaBlendingBulk
*	功能說明: 前景層和背景層的顏色混合
*	形    參: pColorFG      前景層源資料地址
*             OffLineSrcFG  前景層源資料行偏移
*             pColorBG      背景層源資料地址
*             OffLineSrcBG  背景層源資料行偏移
*             pColorDst     目標區地址
*             OffLineDst    目標區行偏移
*             xSize         目標區域的X軸大小,即每行畫素數
*             ySize         目標區域的Y軸大小,即行數
*	返 回 值: 無
*********************************************************************************************************
*/
static void _DMA2D_AlphaBlendingBulk(uint32_t * pColorFG,  
	                                 uint32_t OffLineSrcFG,
	                                 uint32_t * pColorBG,  
                                     uint32_t OffLineSrcBG,
                                     uint32_t * pColorDst, 
                                     uint32_t OffLineDst,
								     uint32_t xSize, 
                                     uint32_t ySize) 
{  
	/* DMA2D採用儲存器到儲存器模式, 這種模式前景層和背景層作為DMA2D輸入,且支援顏色格式轉換和顏色混合 */  
	DMA2D->CR      = 0x00020000UL | (1 << 9);
	DMA2D->FGMAR   = (uint32_t)pColorFG;
	DMA2D->BGMAR   = (uint32_t)pColorBG;
	DMA2D->OMAR    = (uint32_t)pColorDst;
	DMA2D->FGOR    = OffLineSrcFG;
	DMA2D->BGOR    = OffLineSrcBG;
	DMA2D->OOR     = OffLineDst;

	/* 前景層,背景層採用ARGB8888格式,輸出區採用RGB565格式 */
	DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
	DMA2D->BGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
	DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_RGB565;
	DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;

	/* 啟動傳輸 */
	DMA2D->CR   |= DMA2D_CR_START;   

	/* 等待DMA2D傳輸完成 */
	while (DMA2D->CR & DMA2D_CR_START) {} 
}

5  模式 5:儲存器到儲存器模式,帶顏色格式轉換和混合,前景色是固定的

此函式用於在指定位置顯示 ARGB8888 格式點陣圖。
 第 24 行,DMA2D 採用儲存器到儲存器模式, 這種模式把前景層和背景層作為 DMA2D 輸入,且支
持顏色格式轉換和顏色混合。
 第 25 行,設定前景層資料首地址。
 第 26 行,設定背景層資料首地址,這裡是把輸出區中的資料作為背景層。
 第 27 行,設定輸出儲存器首地址。
 第 28 行,設定前景層行偏移。
 第 29 行,設定背景層行偏移。

 第 30 行,設定輸出區行偏移。
 第 33-35 行,前景層顏色格式是 LTDC_PIXEL_FORMAT_ARGB8888,即點陣圖的顏色格式。背景層和
輸出區顏色格式可配置。另外注意,如果是輸出到 LCD 視訊記憶體,那麼輸出顏色格式要與 LCD 顏色格式
一致,否則顯示不正常。
 第 36 行,高 16 位用於設定每行的畫素數,低 16 位用於設定行數,合併起來決定總傳輸次數。
 第 39-42 行,啟動傳輸,並等待傳輸完成。

 

使用舉例:
將大小 128*128,顏色格式為 ARGB8888 的點陣圖繪製到 LCD 起始座標為(176, 20)的區域,輸出顏色
格式配置為 RGB565。

1.  _DMA2D_DrawAlphaBitmap((void *)(SDRAM_LCD_BUF1 + g_LcdWidth*20*2 + 176*2), /* 顯示起始地址(176, 20) */
2.  (void *)_aclufei, /* 點陣圖地址 */
3.  128, /* 點陣圖長 */
4.  128, /* 點陣圖高 */
5.  0, /* 點陣圖行偏移 */
6.  g_LcdWidth-128, /* 目標區行偏移 */
7.  LTDC_PIXEL_FORMAT_RGB565); /* 目標區顏色格式 */


 第 1 行,根據設定的起始座標,計算起始座標在 LCD 視訊記憶體中的具體位置。
SDRAM_LCD_BUF1 表示 LCD 視訊記憶體首地址。
g_LcdWidth*20*2 計算的是行數佔用的位元組數。
176*2 計算的是所在行的具體地址。
乘以 2 是因為 RGB565 顏色格式的 1 個畫素佔用兩個位元組
 第 2 行是點陣圖首地址。
 第 5 行是點陣圖的行偏移,行偏移的意思就是一行結束到下一行開始的距離,單位畫素個數。由於整個
點陣圖都要繪製,所有行偏移就是 0。
 第 6 行,輸出行偏移的,由於輸出區需要的長度是 128,那麼行偏移就是 LCD 的長度減去 128。

 

/*
*********************************************************************************************************
*	函 數 名: _DMA2D_DrawAlphaBitmap
*	功能說明: ARGB8888格式點陣圖顯示
*	形    參: pDst        目標區地址
*             pSrc        源資料地址,即點陣圖首地址
*             xSize       目標區域的X軸大小,即每行畫素數
*             ySize       目標區域的Y軸大小,即行數
*             OffLineSrc  源資料行偏移
*             OffLineDst  目標區行偏移
*             PixelFormat 目標區顏色格式
*	返 回 值: 無
*********************************************************************************************************
*/
static void _DMA2D_DrawAlphaBitmap(void  * pDst, 
	                               void  * pSrc, 
								   uint32_t xSize, 
								   uint32_t ySize, 
								   uint32_t OffLineSrc, 
								   uint32_t OffLineDst, 
								   uint32_t PixelFormat) 
{
	/* DMA2D採用儲存器到儲存器模式, 這種模式前景層和背景層作為DMA2D輸入,且支援顏色格式轉換和顏色混合 */  
	DMA2D->CR      = 0x00020000UL | (1 << 9);
	DMA2D->FGMAR   = (uint32_t)pSrc;
	DMA2D->BGMAR   = (uint32_t)pDst;
	DMA2D->OMAR    = (uint32_t)pDst;
	DMA2D->FGOR    = OffLineSrc;
	DMA2D->BGOR    = OffLineDst;
	DMA2D->OOR     = OffLineDst;
	
	/* 前景層顏色格式是LTDC_PIXEL_FORMAT_ARGB8888,即點陣圖的顏色格式,背景層和輸出區顏色格式可配置 */
	DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
	DMA2D->BGPFCCR = PixelFormat;
	DMA2D->OPFCCR  = PixelFormat;
	DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;

	/* 啟動傳輸 */
	DMA2D->CR   |= DMA2D_CR_START;   

	/* 等待DMA2D傳輸完成 */
	while (DMA2D->CR & DMA2D_CR_START) {} 
}