硬汉嵌入式论坛

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

[DMA2D] DMA2D的不同颜色格式数据转换,貌似对缓冲地址也有字节对齐需求

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-2-3 11:16:25 | 显示全部楼层 |阅读模式


下面这个操作改成4字节对齐正常了。

  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: _DMA_Index2ColorBulk
  4. *        功能说明: 通过DMA2D,将当前显示屏的颜色数据转换为emWin的32位ARGB颜色数据。
  5. *        形    参: pIndex       显示屏颜色地址
  6. *             pColor       转换成适用于emWin的颜色地址
  7. *             NumItems     转换的颜色数量
  8. *             SizeOfIndex  未使用
  9. *             PixelFormat  显示屏当前使用的颜色格式
  10. *        返 回 值: 无
  11. *********************************************************************************************************
  12. */
  13. static void _DMA_Index2ColorBulk(void * pIndex, LCD_COLOR * pColor, U32 NumItems, U8 SizeOfIndex, U32 PixelFormat)
  14. {
  15. #if (GUI_USE_ARGB)
  16.     uint32_t blkCnt;
  17.     uint32_t *ptr1 = (uint32_t *)pColor;
  18.     uint32_t *ptr2 = (uint32_t *)_pBuffer_DMA2D;
  19.    
  20.     /* 配置DMA2D */
  21.         DMA2D->CR      = 0x00010000UL | (1 << 9);
  22.         DMA2D->FGMAR   = (U32)pIndex;
  23.         DMA2D->OMAR    = (U32)_pBuffer_DMA2D;
  24.         DMA2D->FGOR    = 0;
  25.         DMA2D->OOR     = 0;
  26.         DMA2D->FGPFCCR = PixelFormat;
  27.                                            
  28.     DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_ARGB8888;   
  29.                                              
  30.         DMA2D->NLR     = (U32)(NumItems << 16) | 1;

  31.         /* 启动传输 */
  32.         DMA2D->CR   |= DMA2D_CR_START;

  33.         /* 等待DMA2D传输完成 */
  34.         while (DMA2D->CR & DMA2D_CR_START) {}
  35.    
  36.     /* 将数据从_pBuffer_DMA2D复制到pColor */
  37.     blkCnt = NumItems / 0x4U;
  38.         
  39.     while (blkCnt > 0U)
  40.         {
  41.         *ptr1++ = *ptr2++;
  42.         *ptr1++ = *ptr2++;
  43.         *ptr1++ = *ptr2++;
  44.         *ptr1++ = *ptr2++;
  45.                 blkCnt--;
  46.         }
  47.    
  48.     blkCnt = NumItems % 0x4U;
  49.    
  50.     while (blkCnt > 0U)
  51.     {
  52.         *ptr1++ = *ptr2++;
  53.         blkCnt--;
  54.     }     
  55. #else
  56.     uint32_t blkCnt;
  57.     uint32_t *ptr1 = (uint32_t *)pColor;
  58.     uint32_t *ptr2 = (uint32_t *)_pBuffer_DMA2D;
  59.    
  60.     /* 配置DMA2D */
  61.         DMA2D->CR      = 0x00010000UL | (1 << 9);
  62.         DMA2D->FGMAR   = (U32)pIndex;
  63.         DMA2D->OMAR    = (U32)_pBuffer_DMA2D;
  64.         DMA2D->FGOR    = 0;
  65.         DMA2D->OOR     = 0;
  66.         DMA2D->FGPFCCR = PixelFormat;
  67.                                            
  68.     DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_ARGB8888
  69.                      | (DMA2D_INVERTED_ALPHA << 20)
  70.                                          | (DMA2D_RB_SWAP << 21);   
  71.                                              
  72.         DMA2D->NLR     = (U32)(NumItems << 16) | 1;

  73.         /* 启动传输 */
  74.         DMA2D->CR   |= DMA2D_CR_START;

  75.         /* 等待DMA2D传输完成 */
  76.         while (DMA2D->CR & DMA2D_CR_START) {}
  77.    
  78.     /* 将数据从_pBuffer_DMA2D复制到pColor */
  79.     blkCnt = NumItems / 0x4U;
  80.         
  81.     while (blkCnt > 0U)
  82.         {
  83.         *ptr1++ = *ptr2++;
  84.         *ptr1++ = *ptr2++;
  85.         *ptr1++ = *ptr2++;
  86.         *ptr1++ = *ptr2++;
  87.                 blkCnt--;
  88.         }
  89.    
  90.     blkCnt = NumItems % 0x4U;
  91.    
  92.     while (blkCnt > 0U)
  93.     {
  94.         *ptr1++ = *ptr2++;
  95.         blkCnt--;
  96.     }   
  97. #endif
  98. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 12:08 , Processed in 0.222990 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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