STM32F4 DMA2D_R2M

图像处理的专门DMA

看一段示例代码

 1 /**
 2   * @brief  Displays a line.
 3   * @param Xpos: specifies the X position.
 4   * @param Ypos: specifies the Y position.
 5   * @param Length: line length.
 6   * @param Direction: line direction.
 7   *   This parameter can be one of the following values: Vertical or Horizontal.
 8   * @retval None
 9   */
10 void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction)
11 {
12   DMA2D_InitTypeDef      DMA2D_InitStruct;
13   
14   uint32_t  Xaddress = 0;
15   uint16_t Red_Value = 0, Green_Value = 0, Blue_Value = 0;
16   
17   Xaddress = CurrentFrameBuffer + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos);
18  
19   Red_Value = (0xF800 & CurrentTextColor) >> 11;
20   Blue_Value = 0x001F & CurrentTextColor;
21   Green_Value = (0x07E0 & CurrentTextColor) >> 5;
22 
23   /* Configure DMA2D */    
24   DMA2D_DeInit();  
25   DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;       
26   DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;      
27   DMA2D_InitStruct.DMA2D_OutputGreen = Green_Value;      
28   DMA2D_InitStruct.DMA2D_OutputBlue = Blue_Value;     
29   DMA2D_InitStruct.DMA2D_OutputRed = Red_Value;                
30   DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;                  
31   DMA2D_InitStruct.DMA2D_OutputMemoryAdd = Xaddress;                  
32   
33   if(Direction == LCD_DIR_HORIZONTAL)
34   {                                                      
35     DMA2D_InitStruct.DMA2D_OutputOffset = 0;                
36     DMA2D_InitStruct.DMA2D_NumberOfLine = 1;            
37     DMA2D_InitStruct.DMA2D_PixelPerLine = Length; 
38   }
39   else
40   {                                                            
41     DMA2D_InitStruct.DMA2D_OutputOffset = LCD_PIXEL_WIDTH - 1;                
42     DMA2D_InitStruct.DMA2D_NumberOfLine = Length;            
43     DMA2D_InitStruct.DMA2D_PixelPerLine = 1;  
44   }
45   
46   DMA2D_Init(&DMA2D_InitStruct);  
47   /* Start Transfer */ 
48   DMA2D_StartTransfer();  
49   /* Wait for CTC Flag activation */
50   while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)
51   {
52   }
53   
54 }
LCD_DrawLine

里面不好理解的是offset那块,其他统一模式设置看看手册即可,这个offset设置我们先看寄存器是哪个

/* Configure the line Offset */
DMA2D->OOR &= ~(uint32_t)DMA2D_OOR_LO;
DMA2D->OOR |= (DMA2D_InitStruct->DMA2D_OutputOffset);

寄存器定义:

再看代码那几句:

if(Direction == LCD_DIR_HORIZONTAL)
{
DMA2D_InitStruct.DMA2D_OutputOffset = 0;
DMA2D_InitStruct.DMA2D_NumberOfLine = 1;
DMA2D_InitStruct.DMA2D_PixelPerLine = Length;
}
else
{
DMA2D_InitStruct.DMA2D_OutputOffset = LCD_PIXEL_WIDTH - 1;
DMA2D_InitStruct.DMA2D_NumberOfLine = Length;
DMA2D_InitStruct.DMA2D_PixelPerLine = 1;
}

if里很明白,在指定位置没有offset画一条length长的线

else是画的竖线,所以每行只画一个点,画length条线,所以每行只画一个点,offset的值就是:LCD_PIXEL_WIDTH - 1

发现不同MODE有很多不同理解故深化一下看看初始化函数内部操作的哪些寄存器进一步理解

 1 /**
 2   * @brief  Initializes the DMA2D peripheral according to the specified parameters
 3   *         in the DMA2D_InitStruct.
 4   * @note   This function can be used only when the DMA2D is disabled.
 5   * @param  DMA2D_InitStruct: pointer to a DMA2D_InitTypeDef structure that contains
 6   *         the configuration information for the specified DMA2D peripheral.
 7   * @retval None
 8   */
 9 void DMA2D_Init(DMA2D_InitTypeDef* DMA2D_InitStruct)
10 {
11 
12   uint32_t outgreen = 0;
13   uint32_t outred   = 0;
14   uint32_t outalpha = 0;
15   uint32_t pixline  = 0;
16 
17   /* Check the parameters */
18   assert_param(IS_DMA2D_MODE(DMA2D_InitStruct->DMA2D_Mode));
19   assert_param(IS_DMA2D_CMODE(DMA2D_InitStruct->DMA2D_CMode));
20   assert_param(IS_DMA2D_OGREEN(DMA2D_InitStruct->DMA2D_OutputGreen));
21   assert_param(IS_DMA2D_ORED(DMA2D_InitStruct->DMA2D_OutputRed));
22   assert_param(IS_DMA2D_OBLUE(DMA2D_InitStruct->DMA2D_OutputBlue));
23   assert_param(IS_DMA2D_OALPHA(DMA2D_InitStruct->DMA2D_OutputAlpha));
24   assert_param(IS_DMA2D_OUTPUT_OFFSET(DMA2D_InitStruct->DMA2D_OutputOffset));
25   assert_param(IS_DMA2D_LINE(DMA2D_InitStruct->DMA2D_NumberOfLine));
26   assert_param(IS_DMA2D_PIXEL(DMA2D_InitStruct->DMA2D_PixelPerLine));
27 
28   /* Configures the DMA2D operation mode */
29   DMA2D->CR &= (uint32_t)CR_MASK;
30   DMA2D->CR |= (DMA2D_InitStruct->DMA2D_Mode);
31 
32   /* Configures the color mode of the output image */
33   DMA2D->OPFCCR &= ~(uint32_t)DMA2D_OPFCCR_CM;
34   DMA2D->OPFCCR |= (DMA2D_InitStruct->DMA2D_CMode);
35 
36   /* Configures the output color */
37 
38   if (DMA2D_InitStruct->DMA2D_CMode == DMA2D_ARGB8888)
39   {
40     outgreen = DMA2D_InitStruct->DMA2D_OutputGreen << 8;
41     outred = DMA2D_InitStruct->DMA2D_OutputRed << 16;
42     outalpha = DMA2D_InitStruct->DMA2D_OutputAlpha << 24;
43   }
44   else
45   
46     if (DMA2D_InitStruct->DMA2D_CMode == DMA2D_RGB888)
47     {
48       outgreen = DMA2D_InitStruct->DMA2D_OutputGreen << 8;
49       outred = DMA2D_InitStruct->DMA2D_OutputRed << 16;
50       outalpha = (uint32_t)0x00000000;
51     }
52      
53   else
54 
55     if (DMA2D_InitStruct->DMA2D_CMode == DMA2D_RGB565)
56     {
57       outgreen = DMA2D_InitStruct->DMA2D_OutputGreen << 5;
58       outred = DMA2D_InitStruct->DMA2D_OutputRed << 11;
59       outalpha = (uint32_t)0x00000000;
60     }
61 
62   else
63 
64     if (DMA2D_InitStruct->DMA2D_CMode == DMA2D_ARGB1555)
65     {  
66       outgreen = DMA2D_InitStruct->DMA2D_OutputGreen << 5;
67       outred = DMA2D_InitStruct->DMA2D_OutputRed << 10;
68       outalpha = DMA2D_InitStruct->DMA2D_OutputAlpha << 15;
69     }
70 
71   else /* DMA2D_CMode = DMA2D_ARGB4444 */
72   {
73     outgreen = DMA2D_InitStruct->DMA2D_OutputGreen << 4;
74     outred = DMA2D_InitStruct->DMA2D_OutputRed << 8;
75     outalpha = DMA2D_InitStruct->DMA2D_OutputAlpha << 12;
76   }  
77   DMA2D->OCOLR |= ((outgreen) | (outred) | (DMA2D_InitStruct->DMA2D_OutputBlue) | (outalpha));
78 
79   /* Configures the output memory address */
80   DMA2D->OMAR = (DMA2D_InitStruct->DMA2D_OutputMemoryAdd);
81 
82   /* Configure  the line Offset */
83   DMA2D->OOR &= ~(uint32_t)DMA2D_OOR_LO;
84   DMA2D->OOR |= (DMA2D_InitStruct->DMA2D_OutputOffset);
85 
86   /* Configure the number of line and pixel per line */
87   pixline = DMA2D_InitStruct->DMA2D_PixelPerLine << 16; 
88   DMA2D->NLR &= ~(DMA2D_NLR_NL | DMA2D_NLR_PL);
89   DMA2D->NLR |= ((DMA2D_InitStruct->DMA2D_NumberOfLine) | (pixline));
DMA2D_Init

DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;                       // DMA2D->CR         
DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;               // DMA2D->OPFCCR
DMA2D_InitStruct.DMA2D_OutputGreen = Green_Value;           //  DMA2D->OCOLR
DMA2D_InitStruct.DMA2D_OutputBlue = Blue_Value;               //   DMA2D->OCOLR
DMA2D_InitStruct.DMA2D_OutputRed = Red_Value;                //   DMA2D->OCOLR
DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;                    //     DMA2D->OCOLR
DMA2D_InitStruct.DMA2D_OutputMemoryAdd = Xaddress;    //      DMA2D->OMAR

DMA2D_InitStruct.DMA2D_OutputOffset = 0;                       //     DMA2D->OOR
DMA2D_InitStruct.DMA2D_NumberOfLine = 1;                     //      DMA2D->NLR
DMA2D_InitStruct.DMA2D_PixelPerLine = Length;                //      DMA2D->NLR

Register to Memory比较简单,设置模式与输出color format,然后就是输出的颜色值,输出的地址(此例子直接给LCD),输出的offset已经解释过

没有FG(foreground)和 BG(background) 直接输出image到Memory

原文地址:https://www.cnblogs.com/wwjdwy/p/4591700.html