zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    程序员面试中有几大法则
    css 页面重绘和回流(重排)以及优化
    (一)Windows下安装RabbitMQ服务
    NOT IN 和 OR 的SQL语句优化
    java更改图片格式,,更改图片大小,并实现多线程上传图片。
    数据库根据坐标查找附近的店铺
    Spring MVC接收提交文件图片的两种方式
    搜索引擎选择: Elasticsearch与Solr
    redis
    浅谈分布式事务
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/4591700.html
Copyright © 2011-2022 走看看