硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3413|回复: 2
收起左侧

[JPEG] 整理了一个STM32H7的寄存器方式YCbCr转RGB函数并DMA2D到显示屏,支持采样比4:4:4,4:2:2和4:2:0

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-5-1 01:01:15 | 显示全部楼层 |阅读模式
使用时注意第62行的g_LcdWidth是表示显示屏的宽度
以及输出是RGB565格式还是ARGB8888格式。




  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: DMA2D_Copy_YCbCr_To_RGB
  4. *        功能说明: YCbCr转RGB输出
  5. *        形    参: pSrc:    数据源地址
  6. *                  pDst:    数据目的地址
  7. *                  x:       X轴首地址
  8. *                  y:       Y轴首地址
  9. *                  xsize:   目的区域的X轴大小,即每行像素数
  10. *                  ysize:   目的区域的Y轴大小,即行数
  11. *                  PixelFormat:   目标区颜色格式
  12. *                  ChromaSampling : YCbCr Chroma sampling : 4:2:0, 4:2:2 or 4:4:4  
  13. *        返 回 值: 无
  14. *********************************************************************************************************
  15. */
  16. static void DMA2D_Copy_YCbCr_To_RGB(uint32_t *pSrc,
  17.                                     uint32_t *pDst,
  18.                                     uint16_t x,
  19.                                     uint16_t y,
  20.                                     uint16_t xsize,
  21.                                     uint16_t ysize,
  22.                                     uint32_t PixelFormat,
  23.                                     uint32_t ChromaSampling)
  24. {   
  25.         uint32_t cssMode = DMA2D_CSS_420;
  26.         uint32_t inputLineOffset = 0;  
  27.         uint32_t destination = 0;
  28.         
  29.         /* 处理输入行偏移 */
  30.         if(ChromaSampling == JPEG_420_SUBSAMPLING)
  31.         {
  32.                 cssMode = DMA2D_CSS_420;

  33.                 inputLineOffset = xsize % 16;
  34.                 if(inputLineOffset != 0)
  35.                 {
  36.                         inputLineOffset = 16 - inputLineOffset;
  37.                 }   
  38.         }
  39.         else if(ChromaSampling == JPEG_444_SUBSAMPLING)
  40.         {
  41.                 cssMode = DMA2D_NO_CSS;

  42.                 inputLineOffset = xsize % 8;
  43.                 if(inputLineOffset != 0)
  44.                 {
  45.                         inputLineOffset = 8 - inputLineOffset;
  46.                 }   
  47.         }
  48.         else if(ChromaSampling == JPEG_422_SUBSAMPLING)
  49.         {
  50.                 cssMode = DMA2D_CSS_422;

  51.                 inputLineOffset = xsize % 16;
  52.                 if(inputLineOffset != 0)
  53.                 {
  54.                         inputLineOffset = 16 - inputLineOffset;
  55.                 }      
  56.         }  
  57.   
  58.         /* 输出地址,特别注意末尾乘以2的对RGB565,如果输出格式是ARGB8888,需要乘以4 */
  59.         destination = (uint32_t)pDst + ((y * g_LcdWidth) + x) * 2;
  60.          
  61.   
  62.         /* DMA2D采用存储器到存储器模式,并且执行FPC颜色格式转换, 这种模式是前景层作为DMA2D输入 */  
  63.         DMA2D->CR      = 0x00010000UL | (1 << 9);
  64.         DMA2D->OOR     = g_LcdWidth - xsize;
  65.         
  66.         /* 输出格式 */
  67.         DMA2D->OPFCCR  = PixelFormat
  68.                          | (DMA2D_REGULAR_ALPHA << 20)
  69.                          | (DMA2D_RB_REGULAR << 21);  
  70.         
  71.         /* 前景层输入格式 */        
  72.         DMA2D->FGPFCCR = DMA2D_INPUT_YCBCR
  73.                          | (DMA2D_REPLACE_ALPHA << 16)
  74.                          | (DMA2D_REGULAR_ALPHA << 20)
  75.                          | (DMA2D_RB_REGULAR << 21)   
  76.                          | (0xFFU << 24)              
  77.                          | (cssMode << 18);               

  78.         DMA2D->FGOR    = inputLineOffset;
  79.         DMA2D->NLR     = (uint32_t)(xsize << 16) | (uint16_t)ysize;      
  80.         DMA2D->OMAR    = (uint32_t)destination;
  81.         DMA2D->FGMAR   = (uint32_t)pSrc;  

  82.         /* 启动传输 */
  83.         DMA2D->CR   |= DMA2D_CR_START;   

  84.         /* 等待DMA2D传输完成 */
  85.         while (DMA2D->CR & DMA2D_CR_START) {}
  86. }
复制代码



评分

参与人数 1金币 +20 收起 理由
missfox + 20 很给力!

查看全部评分

回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2019-5-1 13:55:46 | 显示全部楼层
cool,非常有用,标记下
回复

使用道具 举报

0

主题

84

回帖

84

积分

初级会员

积分
84
发表于 2019-10-18 17:26:32 | 显示全部楼层
学习下,,,,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 13:49 , Processed in 0.155202 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表