打印
[应用相关]

请教下 ,使用dma2d的透明功能改如何设置 ?

[复制链接]
238|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2021-4-9 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DMA, AN, ui, rc, ST, TI
请教下 ,使用dma2d的透明功能改如何设置 ?

配置函数如下

static void BMP_DMA2D_ConverBuffer(uint32_t *pSrc, uint32_t *pDst,
                                    uint16_t _usX, uint16_t _usY,
                                    uint16_t _usWidth, uint16_t _usHeight,
                                    uint32_t InputColorMode, uint32_t OutputColorMode)
{  
  
  uint32_t source ;
  uint32_t destination = 0;
  
    uint16_t  OutputOffset = 0;     // 行偏移
    uint16_t  NumberOfLine = 0;     // 行数,表示我们显示的数据需要的行数
    uint16_t  PixelPerLine = 0;        // 每行像素数, 每行需要显示多少个像素点   
  
  __IO uint32_t  XaddrPutPixel = 0;
  source      = (uint32_t)pSrc;
  destination = (uint32_t)pDst;

  XaddrPutPixel = (BYTES_PER_PIXEL * (uint32_t)((_usY * LCD_PIXEL_WIDTH) + (_usX)));
  OutputOffset =  LCD_PIXEL_WIDTH - _usWidth;
  NumberOfLine =  _usHeight ;
  PixelPerLine =  _usWidth  ;  
  
  __HAL_RCC_DMA2D_FORCE_RESET();             // 强制复位
  __HAL_RCC_DMA2D_RELEASE_RESET();           // 释放复位
  
  DMA2D->CR     &= ~DMA2D_CR_START;    // 停止dma2d
  
  DMA2D_Handle.Init.Mode          = DMA2D_M2M_PFC;  
  DMA2D_Handle.Init.OutputOffset  = OutputOffset;         //OutputOffset;
  DMA2D_Handle.Init.AlphaInverted = DMA2D_REGULAR_ALPHA;  // No Output Alpha Inversion
  DMA2D_Handle.LayerCfg[1].AlphaMode = DMA2D_REPLACE_ALPHA;
  DMA2D_Handle.LayerCfg[1].InputAlpha = 0xFF;   
   
  DMA2D_Handle.Init.RedBlueSwap   = DMA2D_RB_REGULAR;
  
  DMA2D_Handle.XferCpltCallback  = NULL;
  
  DMA2D_Handle.LayerCfg[1].InputColorMode = InputColorMode;   // 输入颜色模式
  DMA2D_Handle.Init.ColorMode             = OutputColorMode;  // 输出颜色模式

  DMA2D_Handle.LayerCfg[1].InputOffset = 0;
  DMA2D_Handle.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR; /* No ForeGround Red a Blue swap */  
  DMA2D_Handle.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA; /* No ForeGround Alpha inversion */
  DMA2D_Handle.Instance          = DMA2D;
   
  if(HAL_DMA2D_Init(&DMA2D_Handle) == HAL_OK)
  {
    if(HAL_DMA2D_ConfigLayer(&DMA2D_Handle, 1) == HAL_OK)
    {
      uint32_t timeout = 0;

          if (HAL_DMA2D_Start(&DMA2D_Handle, source, destination + XaddrPutPixel, PixelPerLine, NumberOfLine ) == HAL_OK)
          {
            while((DMA2D->ISR & (DMA2D_FLAG_TC)) == 0)      //等待传输完成
            {
              timeout++;
              if(timeout > 0X1FFFFF) break;          //超时退出
            }  

            __HAL_DMA2D_CLEAR_FLAG(&DMA2D_Handle, DMA2D_FLAG_TC | DMA2D_FLAG_CTC);
            DMA2D_Handle.State = HAL_DMA2D_STATE_READY;   
            __HAL_UNLOCK(&DMA2D_Handle);                     
            
          }
    }
  }
}

使用特权

评论回复
沙发
onlycook| | 2021-4-9 14:44 | 只看该作者

我看你已经把alpha功能已经打开了,你只要设置一下具体的alpha值就好了.
DMA2D_Handle.LayerCfg[1].InputAlpha = 0xFF;     -->这是完全不透明呀..

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1501

主题

4497

帖子

6

粉丝