zoukankan      html  css  js  c++  java
  • STM32F4 DMA2D_M2M_PFC

    此例程为STM324x9I_EVAL:DCMI_CaptureMode,使用的stm32f4xx_hal_driver,

    At each camera line event, the line is converted to ARGB8888 pixel format
    and transferred to LCD_FRAME_BUFFER using DMA2D.

    这里仅记录例程中DMA2D这段,Camera RGB565格式 LCD RGB888

     1 /**
     2   * @brief  Converts a line to an ARGB8888 pixel format.
     3   * @param  pSrc: Pointer to source buffer
     4   * @param  pDst: Output color
     5   * @param  xSize: Buffer width
     6   * @param  ColorMode: Input color mode   
     7   * @retval None
     8   */
     9 static void LCD_LL_ConvertLineToARGB8888(void *pSrc, void *pDst)
    10 { 
    11   /* Enable DMA2D clock */
    12   __HAL_RCC_DMA2D_CLK_ENABLE();
    13   
    14   /* Configure the DMA2D Mode, Color Mode and output offset */
    15   hdma2d_eval.Init.Mode         = DMA2D_M2M_PFC;
    16   hdma2d_eval.Init.ColorMode    = DMA2D_ARGB8888;
    17   hdma2d_eval.Init.OutputOffset = 0;     
    18   
    19   /* Foreground Configuration */
    20   hdma2d_eval.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
    21   hdma2d_eval.LayerCfg[1].InputAlpha = 0xFF;
    22   hdma2d_eval.LayerCfg[1].InputColorMode = CM_RGB565;
    23   hdma2d_eval.LayerCfg[1].InputOffset = 0;
    24   
    25   hdma2d_eval.Instance = DMA2D; 
    26   
    27   /* DMA2D Initialization */
    28   if(HAL_DMA2D_Init(&hdma2d_eval) == HAL_OK) 
    29   {
    30     if(HAL_DMA2D_ConfigLayer(&hdma2d_eval, 1) == HAL_OK) 
    31     {
    32       if (HAL_DMA2D_Start(&hdma2d_eval, (uint32_t)pSrc, (uint32_t)pDst, BSP_LCD_GetXSize(), 1) == HAL_OK)
    33       {
    34         /* Polling For DMA transfer */  
    35         HAL_DMA2D_PollForTransfer(&hdma2d_eval, 10);
    36       }
    37     }
    38   }
    39   else
    40   {
    41     /* FatFs Initialization Error */
    42     Error_Handler();
    43   }
    44 }
    LCD_LL_ConvertLineToARGB8888

    分析初始化中代码:static DMA2D_HandleTypeDef hdma2d_eval;

     1 typedef struct __DMA2D_HandleTypeDef
     2 {
     3   DMA2D_TypeDef               *Instance;                                                    /*!< DMA2D Register base address       */
     4 
     5   DMA2D_InitTypeDef           Init;                                                         /*!< DMA2D communication parameters    */ 
     6 
     7   void                        (* XferCpltCallback)(struct __DMA2D_HandleTypeDef * hdma2d);  /*!< DMA2D transfer complete callback  */
     8 
     9   void                        (* XferErrorCallback)(struct __DMA2D_HandleTypeDef * hdma2d); /*!< DMA2D transfer error callback     */
    10 
    11   DMA2D_LayerCfgTypeDef       LayerCfg[MAX_DMA2D_LAYER];                                    /*!< DMA2D Layers parameters           */  
    12 
    13   HAL_LockTypeDef             Lock;                                                         /*!< DMA2D Lock                        */  
    14 
    15   __IO HAL_DMA2D_StateTypeDef State;                                                        /*!< DMA2D transfer state              */
    16 
    17   __IO uint32_t               ErrorCode;                                                    /*!< DMA2D Error code                  */  
    18 } DMA2D_HandleTypeDef;
    DMA2D_HandleTypeDef
     1 typedef struct
     2 {
     3   __IO uint32_t CR;            /*!< DMA2D Control Register,                         Address offset: 0x00 */
     4   __IO uint32_t ISR;           /*!< DMA2D Interrupt Status Register,                Address offset: 0x04 */
     5   __IO uint32_t IFCR;          /*!< DMA2D Interrupt Flag Clear Register,            Address offset: 0x08 */
     6   __IO uint32_t FGMAR;         /*!< DMA2D Foreground Memory Address Register,       Address offset: 0x0C */
     7   __IO uint32_t FGOR;          /*!< DMA2D Foreground Offset Register,               Address offset: 0x10 */
     8   __IO uint32_t BGMAR;         /*!< DMA2D Background Memory Address Register,       Address offset: 0x14 */
     9   __IO uint32_t BGOR;          /*!< DMA2D Background Offset Register,               Address offset: 0x18 */
    10   __IO uint32_t FGPFCCR;       /*!< DMA2D Foreground PFC Control Register,          Address offset: 0x1C */
    11   __IO uint32_t FGCOLR;        /*!< DMA2D Foreground Color Register,                Address offset: 0x20 */
    12   __IO uint32_t BGPFCCR;       /*!< DMA2D Background PFC Control Register,          Address offset: 0x24 */
    13   __IO uint32_t BGCOLR;        /*!< DMA2D Background Color Register,                Address offset: 0x28 */
    14   __IO uint32_t FGCMAR;        /*!< DMA2D Foreground CLUT Memory Address Register,  Address offset: 0x2C */
    15   __IO uint32_t BGCMAR;        /*!< DMA2D Background CLUT Memory Address Register,  Address offset: 0x30 */
    16   __IO uint32_t OPFCCR;        /*!< DMA2D Output PFC Control Register,              Address offset: 0x34 */
    17   __IO uint32_t OCOLR;         /*!< DMA2D Output Color Register,                    Address offset: 0x38 */
    18   __IO uint32_t OMAR;          /*!< DMA2D Output Memory Address Register,           Address offset: 0x3C */
    19   __IO uint32_t OOR;           /*!< DMA2D Output Offset Register,                   Address offset: 0x40 */
    20   __IO uint32_t NLR;           /*!< DMA2D Number of Line Register,                  Address offset: 0x44 */
    21   __IO uint32_t LWR;           /*!< DMA2D Line Watermark Register,                  Address offset: 0x48 */
    22   __IO uint32_t AMTCR;         /*!< DMA2D AHB Master Timer Configuration Register,  Address offset: 0x4C */
    23   uint32_t      RESERVED[236]; /*!< Reserved, 0x50-0x3FF */
    24   __IO uint32_t FGCLUT[256];   /*!< DMA2D Foreground CLUT,                          Address offset:400-7FF */
    25   __IO uint32_t BGCLUT[256];   /*!< DMA2D Background CLUT,                          Address offset:800-BFF */
    26 } DMA2D_TypeDef;
    DMA2D_TypeDef
     1 /** 
     2   * @brief DMA2D Init structure definition
     3   */
     4 typedef struct
     5 {
     6   uint32_t             Mode;               /*!< configures the DMA2D transfer mode.
     7                                                 This parameter can be one value of @ref DMA2D_Mode */
     8 
     9   uint32_t             ColorMode;          /*!< configures the color format of the output image.
    10                                                 This parameter can be one value of @ref DMA2D_Color_Mode */
    11 
    12   uint32_t             OutputOffset;       /*!< Specifies the Offset value. 
    13                                                 This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. */ 
    14 } DMA2D_InitTypeDef;
    DMA2D_InitTypeDef

    /* Configure the DMA2D Mode, Color Mode and output offset */
    hdma2d_eval.Init.Mode = DMA2D_M2M_PFC;                    //DMA2D_CR        DMA2D模式
    hdma2d_eval.Init.ColorMode = DMA2D_ARGB8888;          //DMA2D_OPFCCR 输出颜色模式
    hdma2d_eval.Init.OutputOffset = 0;                               //DMA2D_OOR

    这三个在上一篇中已经分析过这三个参数在HAL_DMA2D_Init(&hdma2d_eval)中执行

     1 /**
     2   * @brief  Initializes the DMA2D according to the specified
     3   *         parameters in the DMA2D_InitTypeDef and create the associated handle.
     4   * @param  hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains
     5   *                 the configuration information for the DMA2D.
     6   * @retval HAL status
     7   */
     8 HAL_StatusTypeDef HAL_DMA2D_Init(DMA2D_HandleTypeDef *hdma2d)
     9 { 
    10   uint32_t tmp = 0;
    11 
    12   /* Check the DMA2D peripheral state */
    13   if(hdma2d == NULL)
    14   {
    15      return HAL_ERROR;
    16   }
    17 
    18   /* Check the parameters */
    19   assert_param(IS_DMA2D_ALL_INSTANCE(hdma2d->Instance));
    20   assert_param(IS_DMA2D_MODE(hdma2d->Init.Mode));
    21   assert_param(IS_DMA2D_CMODE(hdma2d->Init.ColorMode));
    22   assert_param(IS_DMA2D_OFFSET(hdma2d->Init.OutputOffset));
    23 
    24   if(hdma2d->State == HAL_DMA2D_STATE_RESET)
    25   {
    26     /* Allocate lock resource and initialize it */
    27     hdma2d->Lock = HAL_UNLOCKED;
    28     /* Init the low level hardware */
    29     HAL_DMA2D_MspInit(hdma2d);
    30   }
    31   
    32   /* Change DMA2D peripheral state */
    33   hdma2d->State = HAL_DMA2D_STATE_BUSY;  
    34 
    35 /* DMA2D CR register configuration -------------------------------------------*/
    36   /* Get the CR register value */
    37   tmp = hdma2d->Instance->CR;
    38 
    39   /* Clear Mode bits */
    40   tmp &= (uint32_t)~DMA2D_CR_MODE;
    41 
    42   /* Prepare the value to be wrote to the CR register */
    43   tmp |= hdma2d->Init.Mode;
    44 
    45   /* Write to DMA2D CR register */
    46   hdma2d->Instance->CR = tmp;
    47 
    48 /* DMA2D OPFCCR register configuration ---------------------------------------*/
    49   /* Get the OPFCCR register value */
    50   tmp = hdma2d->Instance->OPFCCR;
    51 
    52   /* Clear Color Mode bits */
    53   tmp &= (uint32_t)~DMA2D_OPFCCR_CM;
    54 
    55   /* Prepare the value to be wrote to the OPFCCR register */
    56   tmp |= hdma2d->Init.ColorMode;
    57 
    58   /* Write to DMA2D OPFCCR register */
    59   hdma2d->Instance->OPFCCR = tmp;
    60 
    61 /* DMA2D OOR register configuration ------------------------------------------*/  
    62   /* Get the OOR register value */
    63   tmp = hdma2d->Instance->OOR;
    64 
    65   /* Clear Offset bits */
    66   tmp &= (uint32_t)~DMA2D_OOR_LO;
    67 
    68   /* Prepare the value to be wrote to the OOR register */
    69   tmp |= hdma2d->Init.OutputOffset;
    70 
    71   /* Write to DMA2D OOR register */
    72   hdma2d->Instance->OOR = tmp;
    73 
    74   /* Update error code */
    75   hdma2d->ErrorCode = HAL_DMA2D_ERROR_NONE;
    76 
    77   /* Initialize the DMA2D state*/
    78   hdma2d->State  = HAL_DMA2D_STATE_READY;
    79 
    80   return HAL_OK;
    81 }
    HAL_DMA2D_Init

    hdma2d_eval.Instance = DMA2D; 

     DMA2D_TypeDef               *Instance; 

    #define DMA2D               ((DMA2D_TypeDef *)DMA2D_BASE)

    这里是指向DMA2D的寄存器

     1 /** 
     2   * @brief DMA2D Layer structure definition
     3   */
     4 typedef struct
     5 {
     6   uint32_t             InputOffset;       /*!< configures the DMA2D foreground offset.
     7                                                This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. */
     8 
     9   uint32_t             InputColorMode;    /*!< configures the DMA2D foreground color mode . 
    10                                                This parameter can be one value of @ref DMA2D_Input_Color_Mode */
    11 
    12   uint32_t             AlphaMode;         /*!< configures the DMA2D foreground alpha mode. 
    13                                                This parameter can be one value of @ref DMA2D_ALPHA_MODE */
    14 
    15   uint32_t             InputAlpha;        /*!< Specifies the DMA2D foreground alpha value and color value in case of A8 or A4 color mode. 
    16                                                This parameter must be a number between Min_Data = 0x00000000 and Max_Data = 0xFFFFFFFF 
    17                                                in case of A8 or A4 color mode (ARGB). 
    18                                                Otherwise, This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF.*/
    19 
    20 } DMA2D_LayerCfgTypeDef;
    DMA2D_LayerCfgTypeDef

    /* Foreground Configuration */
    hdma2d_eval.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;     //DMA2D_FGPFCCR
    hdma2d_eval.LayerCfg[1].InputAlpha = 0xFF;                                       //DMA2D_FGPFCCR
    hdma2d_eval.LayerCfg[1].InputColorMode = CM_RGB565;                   //DMA2D_FGPFCCR
    hdma2d_eval.LayerCfg[1].InputOffset = 0;                                           //DMA2D_FGOR

    前景色的配置,由摄像头输入,配置了透明度和颜色模式与偏移

    设置函数:HAL_DMA2D_ConfigLayer(&hdma2d_eval, 1)

      1 /**
      2   * @brief  Configure the DMA2D Layer according to the specified
      3   *         parameters in the DMA2D_InitTypeDef and create the associated handle.
      4   * @param  hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains
      5   *                 the configuration information for the DMA2D.
      6   * @param  LayerIdx: DMA2D Layer index.
      7   *                   This parameter can be one of the following values:
      8   *                   0(background) / 1(foreground)
      9   * @retval HAL status
     10   */
     11 HAL_StatusTypeDef HAL_DMA2D_ConfigLayer(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx)
     12 { 
     13   DMA2D_LayerCfgTypeDef *pLayerCfg = &hdma2d->LayerCfg[LayerIdx];
     14   
     15   uint32_t tmp = 0;
     16   
     17   /* Process locked */
     18   __HAL_LOCK(hdma2d);
     19   
     20   /* Change DMA2D peripheral state */
     21   hdma2d->State = HAL_DMA2D_STATE_BUSY; 
     22   
     23   /* Check the parameters */
     24   assert_param(IS_DMA2D_LAYER(LayerIdx));  
     25   assert_param(IS_DMA2D_OFFSET(pLayerCfg->InputOffset));  
     26   if(hdma2d->Init.Mode != DMA2D_R2M)
     27   {  
     28     assert_param(IS_DMA2D_INPUT_COLOR_MODE(pLayerCfg->InputColorMode));
     29     if(hdma2d->Init.Mode != DMA2D_M2M)
     30     {
     31       assert_param(IS_DMA2D_ALPHA_MODE(pLayerCfg->AlphaMode));
     32     }
     33   }
     34   
     35   /* Configure the background DMA2D layer */
     36   if(LayerIdx == 0)
     37   {
     38     /* DMA2D BGPFCR register configuration -----------------------------------*/
     39     /* Get the BGPFCCR register value */
     40     tmp = hdma2d->Instance->BGPFCCR;
     41     
     42     /* Clear Input color mode, alpha value and alpha mode bits */
     43     tmp &= (uint32_t)~(DMA2D_BGPFCCR_CM | DMA2D_BGPFCCR_AM | DMA2D_BGPFCCR_ALPHA); 
     44     
     45     if ((pLayerCfg->InputColorMode == CM_A4) || (pLayerCfg->InputColorMode == CM_A8))
     46     {
     47       /* Prepare the value to be wrote to the BGPFCCR register */
     48       tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | ((pLayerCfg->InputAlpha) & 0xFF000000));
     49     }
     50     else
     51     {
     52       /* Prepare the value to be wrote to the BGPFCCR register */
     53       tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | (pLayerCfg->InputAlpha << 24));
     54     }
     55     
     56     /* Write to DMA2D BGPFCCR register */
     57     hdma2d->Instance->BGPFCCR = tmp; 
     58     
     59     /* DMA2D BGOR register configuration -------------------------------------*/  
     60     /* Get the BGOR register value */
     61     tmp = hdma2d->Instance->BGOR;
     62     
     63     /* Clear colors bits */
     64     tmp &= (uint32_t)~DMA2D_BGOR_LO; 
     65     
     66     /* Prepare the value to be wrote to the BGOR register */
     67     tmp |= pLayerCfg->InputOffset;
     68     
     69     /* Write to DMA2D BGOR register */
     70     hdma2d->Instance->BGOR = tmp;
     71     
     72     if ((pLayerCfg->InputColorMode == CM_A4) || (pLayerCfg->InputColorMode == CM_A8))
     73     {
     74       /* Prepare the value to be wrote to the BGCOLR register */
     75       tmp |= ((pLayerCfg->InputAlpha) & 0x00FFFFFF);
     76     
     77       /* Write to DMA2D BGCOLR register */
     78       hdma2d->Instance->BGCOLR = tmp;
     79     }    
     80   }
     81   /* Configure the foreground DMA2D layer */
     82   else
     83   {
     84     /* DMA2D FGPFCR register configuration -----------------------------------*/
     85     /* Get the FGPFCCR register value */
     86     tmp = hdma2d->Instance->FGPFCCR;
     87     
     88     /* Clear Input color mode, alpha value and alpha mode bits */
     89     tmp &= (uint32_t)~(DMA2D_FGPFCCR_CM | DMA2D_FGPFCCR_AM | DMA2D_FGPFCCR_ALPHA); 
     90     
     91     if ((pLayerCfg->InputColorMode == CM_A4) || (pLayerCfg->InputColorMode == CM_A8))
     92     {
     93       /* Prepare the value to be wrote to the FGPFCCR register */
     94       tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | ((pLayerCfg->InputAlpha) & 0xFF000000));
     95     }
     96     else
     97     {
     98       /* Prepare the value to be wrote to the FGPFCCR register */
     99       tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | (pLayerCfg->InputAlpha << 24));
    100     }
    101     
    102     /* Write to DMA2D FGPFCCR register */
    103     hdma2d->Instance->FGPFCCR = tmp; 
    104     
    105     /* DMA2D FGOR register configuration -------------------------------------*/  
    106     /* Get the FGOR register value */
    107     tmp = hdma2d->Instance->FGOR;
    108     
    109     /* Clear colors bits */
    110     tmp &= (uint32_t)~DMA2D_FGOR_LO; 
    111     
    112     /* Prepare the value to be wrote to the FGOR register */
    113     tmp |= pLayerCfg->InputOffset;
    114     
    115     /* Write to DMA2D FGOR register */
    116     hdma2d->Instance->FGOR = tmp;
    117    
    118     if ((pLayerCfg->InputColorMode == CM_A4) || (pLayerCfg->InputColorMode == CM_A8))
    119     {
    120       /* Prepare the value to be wrote to the FGCOLR register */
    121       tmp |= ((pLayerCfg->InputAlpha) & 0x00FFFFFF);
    122     
    123       /* Write to DMA2D FGCOLR register */
    124       hdma2d->Instance->FGCOLR = tmp;
    125     }   
    126   }    
    127   /* Initialize the DMA2D state*/
    128   hdma2d->State  = HAL_DMA2D_STATE_READY;
    129   
    130   /* Process unlocked */
    131   __HAL_UNLOCK(hdma2d);  
    132   
    133   return HAL_OK;
    134 }
    HAL_DMA2D_ConfigLayer

     可以看到FG和BG是输入数据源,所以这些是对输入数据的设置

     1 /**
     2   * @brief  Start the DMA2D Transfer.
     3   * @param  hdma2d:     pointer to a DMA2D_HandleTypeDef structure that contains
     4   *                     the configuration information for the DMA2D.  
     5   * @param  pdata:      Configure the source memory Buffer address if 
     6   *                     the memory to memory or memory to memory with pixel format 
     7   *                     conversion DMA2D mode is selected, and configure 
     8   *                     the color value if register to memory DMA2D mode is selected.
     9   * @param  DstAddress: The destination memory Buffer address.
    10   * @param  Width:      The width of data to be transferred from source to destination.
    11   * @param  Height:      The height of data to be transferred from source to destination.
    12   * @retval HAL status
    13   */
    14 HAL_StatusTypeDef HAL_DMA2D_Start(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width,  uint32_t Height)
    15 {
    16   /* Process locked */
    17   __HAL_LOCK(hdma2d);
    18 
    19   /* Change DMA2D peripheral state */
    20   hdma2d->State = HAL_DMA2D_STATE_BUSY;
    21 
    22   /* Check the parameters */
    23   assert_param(IS_DMA2D_LINE(Height));
    24   assert_param(IS_DMA2D_PIXEL(Width));
    25 
    26   /* Disable the Peripheral */
    27   __HAL_DMA2D_DISABLE(hdma2d);
    28 
    29   /* Configure the source, destination address and the data size */
    30   DMA2D_SetConfig(hdma2d, pdata, DstAddress, Width, Height);
    31 
    32   /* Enable the Peripheral */
    33   __HAL_DMA2D_ENABLE(hdma2d);
    34 
    35   return HAL_OK;
    36 }
    HAL_DMA2D_Start
     1 /**
     2   * @brief  Set the DMA2D Transfer parameter.
     3   * @param  hdma2d:     pointer to a DMA2D_HandleTypeDef structure that contains
     4   *                     the configuration information for the specified DMA2D.  
     5   * @param  pdata:      The source memory Buffer address
     6   * @param  DstAddress: The destination memory Buffer address
     7   * @param  Width:      The width of data to be transferred from source to destination.
     8   * @param  Height:     The height of data to be transferred from source to destination.
     9   * @retval HAL status
    10   */
    11 static void DMA2D_SetConfig(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, uint32_t Height)
    12 {  
    13   uint32_t tmp = 0;
    14   uint32_t tmp1 = 0;
    15   uint32_t tmp2 = 0;
    16   uint32_t tmp3 = 0;
    17   uint32_t tmp4 = 0;
    18   
    19   tmp = Width << 16;
    20   
    21   /* Configure DMA2D data size */
    22   hdma2d->Instance->NLR = (Height | tmp);
    23   
    24   /* Configure DMA2D destination address */
    25   hdma2d->Instance->OMAR = DstAddress;
    26  
    27   /* Register to memory DMA2D mode selected */
    28   if (hdma2d->Init.Mode == DMA2D_R2M)
    29   {    
    30     tmp1 = pdata & DMA2D_OCOLR_ALPHA_1;
    31     tmp2 = pdata & DMA2D_OCOLR_RED_1;
    32     tmp3 = pdata & DMA2D_OCOLR_GREEN_1;
    33     tmp4 = pdata & DMA2D_OCOLR_BLUE_1;
    34     
    35     /* Prepare the value to be wrote to the OCOLR register according to the color mode */
    36     if (hdma2d->Init.ColorMode == DMA2D_ARGB8888)
    37     {
    38       tmp = (tmp3 | tmp2 | tmp1| tmp4);
    39     }
    40     else if (hdma2d->Init.ColorMode == DMA2D_RGB888)
    41     {
    42       tmp = (tmp3 | tmp2 | tmp4);  
    43     }
    44     else if (hdma2d->Init.ColorMode == DMA2D_RGB565)
    45     {
    46       tmp2 = (tmp2 >> 19);
    47       tmp3 = (tmp3 >> 10);
    48       tmp4 = (tmp4 >> 3 );
    49       tmp  = ((tmp3 << 5) | (tmp2 << 11) | tmp4); 
    50     }
    51     else if (hdma2d->Init.ColorMode == DMA2D_ARGB1555)
    52     { 
    53       tmp1 = (tmp1 >> 31);
    54       tmp2 = (tmp2 >> 19);
    55       tmp3 = (tmp3 >> 11);
    56       tmp4 = (tmp4 >> 3 );      
    57       tmp  = ((tmp3 << 5) | (tmp2 << 10) | (tmp1 << 15) | tmp4);    
    58     } 
    59     else /* DMA2D_CMode = DMA2D_ARGB4444 */
    60     {
    61       tmp1 = (tmp1 >> 28);
    62       tmp2 = (tmp2 >> 20);
    63       tmp3 = (tmp3 >> 12);
    64       tmp4 = (tmp4 >> 4 );
    65       tmp  = ((tmp3 << 4) | (tmp2 << 8) | (tmp1 << 12) | tmp4);
    66     }    
    67     /* Write to DMA2D OCOLR register */
    68     hdma2d->Instance->OCOLR = tmp;
    69   } 
    70   else /* M2M, M2M_PFC or M2M_Blending DMA2D Mode */
    71   {
    72     /* Configure DMA2D source address */
    73     hdma2d->Instance->FGMAR = pdata;
    74   }
    75 }
    DMA2D_SetConfig

    /* Configure DMA2D data size */

    tmp = Width << 16;
    hdma2d->Instance->NLR = (Height | tmp);

    /* Configure DMA2D destination address */
    hdma2d->Instance->OMAR = DstAddress;

    /* Configure DMA2D source address */

    hdma2d->Instance->FGMAR = pdata;

    这里设置两边memory的地址与行数也就是数据量

    DMA2D_NLR 与DMA2D_OMAR 前面一章介绍过

    整个初始化流程结束,主要设置了output,源地址是FG

    最后设置传输:

      1 /**
      2   * @brief  Polling for transfer complete or CLUT loading.
      3   * @param  hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains
      4   *                 the configuration information for the DMA2D. 
      5   * @param  Timeout: Timeout duration
      6   * @retval HAL status
      7   */
      8 HAL_StatusTypeDef HAL_DMA2D_PollForTransfer(DMA2D_HandleTypeDef *hdma2d, uint32_t Timeout)
      9 {
     10   uint32_t tmp, tmp1;
     11   uint32_t tickstart = 0;
     12 
     13   /* Polling for DMA2D transfer */
     14   if((hdma2d->Instance->CR & DMA2D_CR_START) != 0)
     15   {
     16    /* Get tick */
     17    tickstart = HAL_GetTick();
     18 
     19     while(__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_TC) == RESET)
     20     {
     21       tmp  = __HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_CE);
     22       tmp1 = __HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_TE);
     23 
     24       if((tmp != RESET) || (tmp1 != RESET))
     25       {
     26         /* Clear the transfer and configuration error flags */
     27         __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CE);
     28         __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TE);
     29 
     30         /* Change DMA2D state */
     31         hdma2d->State= HAL_DMA2D_STATE_ERROR;
     32 
     33         /* Process unlocked */
     34         __HAL_UNLOCK(hdma2d);
     35         
     36         return HAL_ERROR;
     37       }
     38       /* Check for the Timeout */
     39       if(Timeout != HAL_MAX_DELAY)
     40       {
     41         if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
     42         {
     43           /* Process unlocked */
     44           __HAL_UNLOCK(hdma2d);
     45         
     46           /* Update error code */
     47           hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT;
     48 
     49           /* Change the DMA2D state */
     50           hdma2d->State= HAL_DMA2D_STATE_TIMEOUT;
     51           
     52           return HAL_TIMEOUT;
     53         }
     54       }        
     55     }
     56   }
     57   /* Polling for CLUT loading */
     58   if((hdma2d->Instance->FGPFCCR & DMA2D_FGPFCCR_START) != 0)
     59   {
     60     /* Get tick */
     61     tickstart = HAL_GetTick();
     62    
     63     while(__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_CTC) == RESET)
     64     {
     65       if((__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_CAE) != RESET))
     66       {      
     67         /* Clear the transfer and configuration error flags */
     68         __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CAE);
     69         
     70         /* Change DMA2D state */
     71         hdma2d->State= HAL_DMA2D_STATE_ERROR;
     72         
     73         return HAL_ERROR;      
     74       }      
     75       /* Check for the Timeout */
     76       if(Timeout != HAL_MAX_DELAY)
     77       {
     78         if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
     79         {
     80           /* Update error code */
     81           hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT;
     82     
     83           /* Change the DMA2D state */
     84           hdma2d->State= HAL_DMA2D_STATE_TIMEOUT;
     85           
     86           return HAL_TIMEOUT;
     87         }
     88       }      
     89     }
     90   }
     91   /* Clear the transfer complete flag */
     92   __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TC);
     93   
     94   /* Clear the CLUT loading flag */
     95   __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CTC);  
     96   
     97   /* Change DMA2D state */
     98   hdma2d->State = HAL_DMA2D_STATE_READY;
     99   
    100   /* Process unlocked */
    101   __HAL_UNLOCK(hdma2d);
    102   
    103   return HAL_OK;
    104 }
    HAL_DMA2D_PollForTransfer

    #define DMA2D_FLAG_CE                     DMA2D_ISR_CEIF /*!< Configuration Error Interrupt Flag */
    #define DMA2D_FLAG_CTC                   DMA2D_ISR_CTCIF /*!< C-LUT Transfer Complete Interrupt Flag */
    #define DMA2D_FLAG_CAE                   DMA2D_ISR_CAEIF /*!< C-LUT Access Error Interrupt Flag */
    #define DMA2D_FLAG_TW                    DMA2D_ISR_TWIF /*!< Transfer Watermark Interrupt Flag */
    #define DMA2D_FLAG_TC                     DMA2D_ISR_TCIF /*!< Transfer Complete Interrupt Flag */
    #define DMA2D_FLAG_TE                     DMA2D_ISR_TEIF /*!< Transfer Error Interrupt Flag */

  • 相关阅读:
    键盘输入thisisunsafe
    vscode
    iterm2 rz sz
    homebrew镜像更换
    mac
    homebrew下载不成功
    shutil:高层文件操作
    tempfile:临时文件系统对象
    linecache:读取文本文件的指定内容
    fnmatch:Unix式glob模式匹配,简单场景下可以代替正则
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/4604820.html
Copyright © 2011-2022 走看看