你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32f7 DMA2D驱动(包含自己定义的GRAM相关操作)

[复制链接]
STMCU小助手 发布时间:2021-12-16 21:00
DMA2D可以加快图像填充,并且支持像素格式转换。

  1. /*************************************************************************************************************
  2. * 文件名                :        dma2d.c
  3. * 功能                        :        STM32F7 DMA2D驱动
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  5. * 创建时间                :        2019-10-29
  6. * 最后修改时间        :        2019-10-29
  7. * 详细:                        
  8. *************************************************************************************************************/        
  9. #include "dma2d.h"
  10. #include "SYSTEM.H"


  11. /*************************************************************************************************************************
  12. * 函数                        :        void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)
  13. * 功能                        :        DMA2D进行单色填充
  14. * 参数                        :        FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;
  15.                                         ColorMode:颜色模式;Color:颜色值
  16. * 返回                        :        无
  17. * 依赖                        :        底层宏定义
  18. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  19. * 时间                        :        2019-10-29
  20. * 最后修改时间         :         2019-10-30
  21. * 说明                        :        用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
  22. *************************************************************************************************************************/
  23. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)
  24. {
  25.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
  26.         DMA2D->CR = 0;                                                                //先停止DMA2D
  27.         DMA2D->IFCR |= 1<<1;                                                //清除传输完成标志
  28.         DMA2D->CR = DMA2D_MODE_REG<<16;                                 //寄存器到存储器模式
  29.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
  30.         DMA2D->OOR = OffsetX;                                                //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
  31.         DMA2D->OMAR = FGRAM_Addr;                                        //目的地址
  32.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
  33.         DMA2D->OCOLR = Color;                                                //输出颜色

  34.         DMA2D_Start();                                                                //开始传输
  35. }



  36. /*************************************************************************************************************************
  37. * 函数                        :        void DMA2D_WaitTransferComplete(u32 TimeOutMs)
  38. * 功能                        :        等待DMA2D传输完成
  39. * 参数                        :        TimeOutMs:超时时间
  40. * 返回                        :        无
  41. * 依赖                        :        底层宏定义
  42. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  43. * 时间                        :        2019-10-30
  44. * 最后修改时间         :         2019-10-30
  45. * 说明                        :        超时后会取消传输
  46. *************************************************************************************************************************/
  47. void DMA2D_WaitTransferComplete(u32 TimeOutMs)
  48. {
  49.         u32 timeout = 0;
  50.         
  51.         while((DMA2D->ISR & (1<<1)) == 0)        //等待传输完成
  52.         {
  53.                 timeout++;
  54.                 SYS_DelayMS(1);                                        //延时1ms
  55.                 if(timeout > TimeOutMs)
  56.                 {
  57.                         DMA2D_Abort();                                //终止传输
  58.                         break;                                                //超时退出
  59.                 }
  60.         }  
  61.         DMA2D->IFCR |= 1<<1;                                //清除传输完成标志         
  62. }

  63. /*************************************************************************************************************************
  64. * 函数                        :        void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)
  65. * 功能                        :        DMA2D进行矩形图形填充
  66. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
  67.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
  68.                                         ColorMode:颜色模式
  69. * 返回                        :        是否设置成功
  70. * 依赖                        :        底层宏定义
  71. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  72. * 时间                        :        2019-10-28
  73. * 最后修改时间         :         2019-10-28
  74. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
  75. *************************************************************************************************************************/
  76. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)
  77. {
  78.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
  79.         DMA2D->CR = 0;                                                                //先停止DMA2D
  80.         DMA2D->CR = DMA2D_MODE_MEM<<16;                                 //存储器到存储器模式
  81.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
  82.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
  83.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
  84.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移
  85.         DMA2D->FGPFCCR = ColorMode;                                        //源图像颜色格式
  86.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
  87.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
  88.         
  89.         DMA2D_Start();                                                                //开始传输
  90. }


  91. /*************************************************************************************************************************
  92. * 函数                        :        void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
  93.                                                 DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
  94. * 功能                        :        DMA2D进行矩形图形填充(会执行像素格式转换)
  95. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
  96.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
  97.                                         SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式
  98.                                         AlphaMode:alpha模式;Alpha:Alpha值;
  99. * 返回                        :        是否设置成功
  100. * 依赖                        :        底层宏定义
  101. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  102. * 时间                        :        2019-10-28
  103. * 最后修改时间         :         2019-10-28
  104. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
  105. *************************************************************************************************************************/
  106. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
  107.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
  108. {
  109.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
  110.         DMA2D->CR = 0;                                                                //先停止DMA2D
  111.         DMA2D->CR = DMA2D_MODE_MEM_PFC<<16;                        //存储器到存储器模式-激活PFC
  112.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
  113.         DMA2D->OPFCCR = DestColorMode;                                //输出颜色格式
  114.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
  115.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移
  116.         DMA2D->FGPFCCR =((u32)Alpha << 24) |  ((u32)AlphaMode << 16) | SourceColorMode;                        //源图像颜色格式
  117.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
  118.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
  119.         
  120.         DMA2D_Start();                                                                //开始传输
  121. }
复制代码
  1. /*************************************************************************************************************
  2. * 文件名                :        dma2d.H
  3. * 功能                        :        STM32F7 DMA2D驱动
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  5. * 创建时间                :        2019-10-29
  6. * 最后修改时间        :        2019-10-29
  7. * 详细:                        
  8. *************************************************************************************************************/        
  9. #ifndef __DMA2D_H_
  10. #define        __DMA2D_H_           
  11. #include "system.h"


  12. typedef enum
  13. {
  14.         DMA2D_MODE_MEM                =         0,                //存储器到存储器(仅限 FG前景色 获取)
  15.         DMA2D_MODE_MEM_PFC        =        1,                //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)
  16.         DMA2D_MODE_MEM_MIXED=        2,                //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)
  17.         DMA2D_MODE_REG                =        3,                //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)
  18. }DMA2D_MODE;

  19. //颜色模式
  20. typedef enum
  21. {
  22.         DMA2D_COLOR_ARGB8888         = 0,
  23.         DMA2D_COLOR_RGB888                 = 1,
  24.         DMA2D_COLOR_RGB565                 = 2,
  25.         /*DMA2D_COLOR_ARGB1555         = 3,
  26.         DMA2D_COLOR_ARGB4444         = 4,
  27.         DMA2D_COLOR_L8                         = 5,        //8 位 Luminance
  28.         DMA2D_COLOR_AL44                 = 6,        //4 位 Alpha,4 位 Luminance
  29.         DMA2D_COLOR_AL88                 = 7,        //8 位 Alpha,8 位 Luminance
  30.         DMA2D_COLOR_L4                         = 8,        //4 位 Luminance
  31.         DMA2D_COLOR_A8                         = 9,        //8 位 Alpha
  32.         DMA2D_COLOR_A4                         = 10,        //4 位 Alpha*/
  33. }DMA2D_COLOR_MODE;


  34. //Alpha 模式
  35. typedef enum
  36. {
  37.         DMA2D_ALPHA_NULL        =        0,//不修改前景层图像的 alpha 通道值
  38.         DMA2D_ALPHA_REPLACE        =        1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]
  39.         DMA2D_ALPHA_PRODUCT        =        2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积
  40. }DMA2D_ALPHA_MODE;


  41. __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;}                //终止传输
  42. __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;}                //挂起传输
  43. __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;}                //开始传输

  44. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color);        //DMA2D进行单色填充
  45. void DMA2D_WaitTransferComplete(u32 TimeOutMs);                                                                                                                                                        //等待DMA2D传输完成
  46. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充
  47. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
  48.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)
  49. #endif //__DMA2D_H_
复制代码
  1. /*************************************************************************************************************
  2. * 文件名                :        DMA2D_GRAM.c
  3. * 功能                        :        GRAM相关操作
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  5. * 创建时间                :        2019-10-30
  6. * 最后修改时间        :        2019-10-30
  7. * 详细:                        显存相关操作接口
  8. *************************************************************************************************************/        
  9. #include "dma2d.h"
  10. #include "DMA2D_GRAM.h"
  11. #include "SYSTEM.H"

  12. //基本接口
  13. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //32bit色彩GRAM显存画点
  14. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //24bit色彩GRAM显存画点
  15. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //16bit色彩GRAM显存画点


  16. //GRAM相关接口-16bit
  17. const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit =
  18. {
  19.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit,                        //GRAM显存画点(RGB565格式)
  20.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
  21.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
  22. };

  23. //GRAM相关接口-24bit
  24. const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit =
  25. {
  26.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit,                        //GRAM显存画点(RGB888格式)
  27.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
  28.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
  29. };

  30. //GRAM相关接口-32bit
  31. const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit =
  32. {
  33.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit,                        //GRAM显存画点(ARGB8888格式)
  34.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
  35.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
  36. };

  37. /*************************************************************************************************************************
  38. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
  39. * 功能                        :        GRAM句柄初始化(不会申请内存)
  40. * 参数                        :        pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式
  41. * 返回                        :        无
  42. * 依赖                        :        底层宏定义
  43. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  44. * 时间                        :        2019-10-30
  45. * 最后修改时间         :         2019-10-30
  46. * 说明                        :        初始化显存
  47. *************************************************************************************************************************/
  48. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
  49. {
  50.         while(pHandle == NULL)
  51.         {
  52.                 DEBUG("无效的句柄pHandle\r\n");
  53.                 SYS_DelayMS(500);
  54.         }
  55.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
  56.         pHandle->Width = Width;                                                        //GRAM宽度
  57.         pHandle->Height = Height;                                                //GRAM高度
  58.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
  59.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针
  60.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针
  61.         //像素模式
  62.         switch(ColorMode)
  63.         {
  64.                 case DMA2D_COLOR_ARGB8888 :
  65.                 {
  66.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
  67.                 }break;
  68.                 case DMA2D_COLOR_RGB888 :
  69.                 {
  70.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
  71.                 }break;
  72.                 default: //DMA2D_COLOR_RGB565
  73.                 {
  74.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
  75.                         ColorMode = DMA2D_COLOR_RGB565;
  76.                 }break;
  77.         }
  78.         
  79.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式
  80.         pHandle->InitStatusId = DMA_INIT_OK;                        //初始化成功
  81. }

  82. /*************************************************************************************************************************
  83. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)
  84. * 功能                        :        创建一个GRAM(会申请内存)
  85. * 参数                        :        Width:显存宽度;Height:显存高度;ColorMode:颜色模式
  86. * 返回                        :        NULL:失败;其他:GRAM句柄
  87. * 依赖                        :        底层宏定义
  88. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  89. * 时间                        :        2020-02-02
  90. * 最后修改时间         :         2020-02-02
  91. * 说明                        :        初始化显存
  92. *************************************************************************************************************************/
  93. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
  94. {
  95.         GRAM_HANDLE *pHandle = NULL;
  96.         u32 GRAM_Addr;
  97.         
  98.         pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE));        //为句柄申请内存
  99.         while(pHandle == NULL)
  100.         {
  101.                 DEBUG("无效的句柄pHandle\r\n");
  102.                 SYS_DelayMS(500);
  103.         }
  104.         
  105.         switch(ColorMode)
  106.         {
  107.                 case DMA2D_COLOR_ARGB8888 :
  108.                 {
  109.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存
  110.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
  111.                 }break;
  112.                 case DMA2D_COLOR_RGB888 :
  113.                 {
  114.                         GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height);                        //为显存分配内存
  115.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
  116.                 }break;
  117.                 default: //DMA2D_COLOR_RGB565
  118.                 {
  119.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height);        //为显存分配内存
  120.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
  121.                         ColorMode = DMA2D_COLOR_RGB565;
  122.                 }break;
  123.         }
  124.         
  125.         while(GRAM_Addr == NULL)
  126.         {
  127.                 DEBUG("显存申请内存失败\r\n");
  128.                 SYS_DelayMS(500);
  129.         }
  130.         
  131.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
  132.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式
  133.         pHandle->Width = Width;                                                        //GRAM宽度
  134.         pHandle->Height = Height;                                                //GRAM高度
  135.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
  136.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针
  137.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针
  138.         pHandle->InitStatusId = DMA_CREATE_OK;                        //创建成功
  139.         
  140.         return pHandle;
  141. }



  142. /*************************************************************************************************************************
  143. * 函数                        :        void GRAM_Delete(GRAM_HANDLE *pHandle)
  144. * 功能                        :        删除一个GRAM(会释放内存)
  145. * 参数                        :        pHandle:GRAM句柄
  146. * 返回                        :        无
  147. * 依赖                        :        底层宏定义
  148. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  149. * 时间                        :        2019-12-16
  150. * 最后修改时间         :         2019-12-16
  151. * 说明                        :        用于删除显存,释放内存
  152. *************************************************************************************************************************/
  153. void GRAM_Delete(GRAM_HANDLE *pHandle)
  154. {
  155.         if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)
  156.         {
  157.                 if(pHandle->GRAM_Addr != NULL)
  158.                 {
  159.                         GRAM_free((u8 *)pHandle->GRAM_Addr);                //释放显存内存
  160.                         pHandle->GRAM_Addr = NULL;
  161.                 }
  162.                 pHandle->InitStatusId = 0;
  163.                 GRAM_free(pHandle);                                                                //释放句柄内存
  164.                 pHandle = NULL;
  165.         }
  166. }


  167. /*************************************************************************************************************************
  168. * 函数                        :        void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
  169. * 功能                        :        32bit色彩GRAM显存画点
  170. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
  171. * 返回                        :        无
  172. * 依赖                        :        底层宏定义
  173. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  174. * 时间                        :        2019-10-30
  175. * 最后修改时间         :         2019-10-30
  176. * 说明                        :        在显存中绘制点
  177. *************************************************************************************************************************/
  178. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
  179. {
  180.         pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
  181. }


  182. /*************************************************************************************************************************
  183. * 函数                        :        void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
  184. * 功能                        :        24bit色彩GRAM显存画点
  185. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
  186. * 返回                        :        无
  187. * 依赖                        :        底层宏定义
  188. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  189. * 时间                        :        2019-10-30
  190. * 最后修改时间         :         2019-10-30
  191. * 说明                        :        在显存中绘制点
  192. *************************************************************************************************************************/
  193. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
  194. {
  195.         memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);
  196. }


  197. /*************************************************************************************************************************
  198. * 函数                        :        void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
  199. * 功能                        :        16bit色彩GRAM显存画点
  200. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
  201. * 返回                        :        无
  202. * 依赖                        :        底层宏定义
  203. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  204. * 时间                        :        2019-10-30
  205. * 最后修改时间         :         2019-10-30
  206. * 说明                        :        在显存中绘制点
  207. *************************************************************************************************************************/
  208. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
  209. {
  210.         pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
  211. }



  212. /*************************************************************************************************************************
  213. * 函数                        :        void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)        
  214. * 功能                        :        GRAM矩形填充(使用DMA2D)
  215. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色
  216. * 返回                        :        无
  217. * 依赖                        :        底层宏定义
  218. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  219. * 时间                        :        2019-10-30
  220. * 最后修改时间         :         2019-10-30
  221. * 说明                        :        采用DMA2D实现
  222. *************************************************************************************************************************/
  223. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)
  224. {
  225.         switch(pHandle->ColorMode)
  226.         {
  227.                 case DMA2D_COLOR_ARGB8888 :
  228.                 {
  229.                         DMA2D_FillColorToFGRAM((u32)&pHandle->pGRAM_32bit[(u32)sy * pHandle->Width + sx], ex-sx+1, ey-sy+1, pHandle->Width-(ex-sx+1), DMA2D_COLOR_ARGB8888, color);                //DMA2D进行单色填充
  230.                 }break;
  231.                 case DMA2D_COLOR_RGB888 :
  232.                 {
  233.                         DMA2D_FillColorToFGRAM((u32)&pHandle->pGRAM_24bit[((u32)sy * pHandle->Width + sx)*3], ex-sx+1, ey-sy+1, pHandle->Width-(ex-sx+1), DMA2D_COLOR_RGB888, color);        //DMA2D进行单色填充
  234.                 }break;
  235.                 case DMA2D_COLOR_RGB565 :
  236.                 {
  237.                         DMA2D_FillColorToFGRAM((u32)&pHandle->pGRAM_16bit[(u32)sy * pHandle->Width + sx], ex-sx+1, ey-sy+1, pHandle->Width-(ex-sx+1), DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充
  238.                 }break;
  239.                 default:return;
  240.         }
  241.         
  242.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                                                                //等待DMA2D传输完成
  243. }


  244. /*************************************************************************************************************************
  245. * 函数                        :        void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
  246. * 功能                        :        GRAM清屏(使用DMA2D)
  247. * 参数                        :        pHandle:GRAM句柄;color:需要填充的颜色
  248. * 返回                        :        无
  249. * 依赖                        :        底层宏定义
  250. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  251. * 时间                        :        2019-10-30
  252. * 最后修改时间         :         2019-10-30
  253. * 说明                        :        采用DMA2D实现
  254. *************************************************************************************************************************/
  255. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
  256. {
  257.         switch(pHandle->ColorMode)
  258.         {
  259.                 case DMA2D_COLOR_ARGB8888 :
  260.                 {
  261.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color);        //DMA2D进行单色填充
  262.                 }break;
  263.                 case DMA2D_COLOR_RGB888 :
  264.                 {
  265.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color);                //DMA2D进行单色填充
  266.                 }break;
  267.                 case DMA2D_COLOR_RGB565 :
  268.                 {
  269.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充
  270.                 }break;
  271.                 default:return;
  272.         }
  273.         SYS_DelayMS(5);
  274.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                //等待DMA2D传输完成
  275. }


  276. /*************************************************************************************************************************
  277. * 函数                        :        void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
  278.                                                 u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
  279. * 功能                        :        GRAM局部拷贝(支持Alpha)
  280. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
  281.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度
  282.                                         AlphaMode:alpha模式;Alpha:Alpha值;
  283. * 返回                        :        无
  284. * 依赖                        :        底层宏定义
  285. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  286. * 时间                        :        2020-02-02
  287. * 最后修改时间         :         2020-02-02
  288. * 说明                        :        不会检查GRAM大小,请确保GRAM
  289. *************************************************************************************************************************/
  290. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
  291. {
  292.         u32 SourceImageAddr;        //源图像地址(通过地址控制开始的X,Y坐标)
  293.         u32 DestGRAMAddr;                //目标GRAM地址(通过地址控制开始的X,Y坐标);
  294.         u32 PixelByteSize;                //像素字节大小
  295.         
  296.         if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL)
  297.         {
  298.                 DEBUG("无效的句柄,pDestHandle\r\n");
  299.                 return;
  300.         }
  301.         if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL)
  302.         {
  303.                 DEBUG("无效的句柄,pSourceHandle\r\n");
  304.                 return;
  305.         }
  306.         //源图像地址(通过地址控制开始的X,Y坐标) 计算
  307.         switch(pSourceHandle->ColorMode)
  308.         {
  309.                 case DMA2D_COLOR_ARGB8888 :
  310.                 {
  311.                         PixelByteSize = 4;
  312.                 }break;
  313.                 case DMA2D_COLOR_RGB888 :
  314.                 {
  315.                         PixelByteSize = 3;
  316.                 }break;
  317.                 default: //DMA2D_COLOR_RGB565
  318.                 {
  319.                         PixelByteSize = 2;
  320.                 }break;
  321.         }
  322.         SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize;        //计算源开始地址
  323.         
  324.         //目标图像地址(通过地址控制开始的X,Y坐标) 计算
  325.         switch(pDestHandle->ColorMode)
  326.         {
  327.                 case DMA2D_COLOR_ARGB8888 :
  328.                 {
  329.                         PixelByteSize = 4;
  330.                 }break;
  331.                 case DMA2D_COLOR_RGB888 :
  332.                 {
  333.                         PixelByteSize = 3;
  334.                 }break;
  335.                 default: //DMA2D_COLOR_RGB565
  336.                 {
  337.                         PixelByteSize = 2;
  338.                 }break;
  339.         }
  340.         DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize;        //计算目标开始地址
  341.         //进行拷贝
  342.         DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode,
  343.                 pDestHandle->ColorMode, AlphaMode, Alpha);                                                                                                        //DMA2D进行矩形图形填充(会执行像素格式转换)
  344.         DMA2D_WaitTransferComplete(200);                                                                                                                                //等待DMA2D传输完成
  345. }

  346. /*************************************************************************************************************************
  347. * 函数                        :        void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
  348.                                                 u16 Height)
  349. * 功能                        :        GRAM局部拷贝(不支持Alpha)
  350. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
  351.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度
  352. * 返回                        :        无
  353. * 依赖                        :        底层宏定义
  354. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  355. * 时间                        :        2020-02-02
  356. * 最后修改时间         :         2020-02-02
  357. * 说明                        :        不会检查GRAM大小,请确保GRAM
  358. *************************************************************************************************************************/
  359. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)
  360. {
  361.         GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);
  362. }
复制代码


  1. /*************************************************************************************************************
  2. * 文件名                :        DMA2D_GRAM.h
  3. * 功能                        :        GRAM相关操作
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  5. * 创建时间                :        2019-10-30
  6. * 最后修改时间        :        2019-10-30
  7. * 详细:                        显存相关操作接口
  8. *************************************************************************************************************/        
  9. #ifndef __DMA2D_GRAM_H_
  10. #define        __DMA2D_GRAM_H_           
  11. #include "system.h"
  12. #include "DMA2D.h"
  13. #include "SYSMalloc.h"

  14. //初始化状态id
  15. #define DMA_INIT_OK                0x1234423        //初始化成功(不可以释放)
  16. #define DMA_CREATE_OK        0x3643423        //创建成功(可以释放)

  17. //颜色模式
  18. typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;


  19. //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告)
  20. typedef struct
  21. {
  22.         void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //绘点函数
  23.         void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                        //填充
  24.         void (*pClear)(void *pHandle, u32 color);                                                                                //清屏
  25. }GDI_BasicInterface;


  26. //GRAM相关接口-16bit
  27. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;
  28. //GRAM相关接口-24bit
  29. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;
  30. //GRAM相关接口-32bit
  31. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;

  32. //所需的内存申请接口
  33. __inline void *GRAM_malloc(u32 size)
  34. {
  35.         return mymalloc(SRAMEX, size);                        //内存分配(外部调用)-使用外部SRAM
  36. }

  37. //所需的内存释放接口
  38. __inline void GRAM_free(void *ptr)
  39. {
  40.         myfree(SRAMEX, ptr);                                        //使用外部SRAM
  41. }


  42. //显存句柄
  43. typedef struct
  44. {
  45.         u32 InitStatusId;                                                                //初始化状态id
  46.         u32 GRAM_Addr;                                                                        //GRAM地址
  47.         DMA2D_COLOR_MODE ColorMode;                                                //GRAM显存像素格式
  48.         u16 Width;                                                                                //GRAM宽度
  49.         u16 Height;                                                                                //GRAM高度
  50.         u32 *pGRAM_32bit;                                                                //32bit颜色模式下显存指针
  51.         u8 *pGRAM_24bit;                                                                //24bit颜色模式下显存指针
  52.         u16 *pGRAM_16bit;                                                                //16bit颜色模式下显存指针
  53.         const GDI_BasicInterface *pBasicInterface;                //底层GDI接口
  54. }GRAM_HANDLE;

  55. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);        //GRAM句柄初始化(不会申请内存)
  56. void GRAM_Delete(GRAM_HANDLE *pHandle);                                                                                                                                        //删除一个GRAM(会释放内存)
  57. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                                                        //GRAM矩形填充(使用DMA2D)
  58. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color);                                                                                                                //GRAM清屏(使用DMA2D)
  59. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);                                                        //创建一个GRAM(会申请内存)
  60. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
  61.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);                        //GRAM局部拷贝(支持Alpha)
  62. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
  63.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height);                                                                                                        //GRAM局部拷贝(不支持Alpha)

  64. #endif //__DMA2D_GRAM_H_
复制代码
  1. /*************************************************************************************************************
  2. * 文件名                :        GDI.c
  3. * 功能                        :        图形设备接口(Graphics Device Interface)
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  5. * 创建时间                :        2019-11-02
  6. * 最后修改时间        :        2020-02-02
  7. * 详细                        :        STM32F7 图形设备接口
  8. *************************************************************************************************************/
  9. #include "system.h"
  10. #include "DMA2D.h"
  11. #include "stm32f7_ltdc.h"
  12. #include "DMA2D_GRAM.h"
  13. #include "GDI.h"

  14. //显示器Layer1 GRAM定义
  15. const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle =
  16. {
  17.         DMA_INIT_OK,
  18.         (u32) &g_LTDC_BUFF_RGB888[0],        //GRAM地址
  19.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
  20.         LTDC_WIDTH,                                                //GRAM宽度
  21.         LTDC_HEIGHT,                                        //GRAM高度
  22.         (u32 *)&g_LTDC_BUFF_RGB888[0],        //32bit颜色模式下显存指针
  23.         (u8 *)&g_LTDC_BUFF_RGB888[0],        //24bit颜色模式下显存指针
  24.         (u16 *)&g_LTDC_BUFF_RGB888[0],        //16bit颜色模式下显存指针
  25.         &cg_GDI_GRAM_Interface_32bit,
  26.         
  27. };

  28. //显示器Layer2 GRAM定义
  29. const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle =
  30. {
  31.         DMA_INIT_OK,
  32.         (u32) &g_LTDC_BUFF_RGB888[1],        //GRAM地址
  33.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
  34.         LTDC_WIDTH,                                                //GRAM宽度
  35.         LTDC_HEIGHT,                                        //GRAM高度
  36.         (u32 *)&g_LTDC_BUFF_RGB888[1],        //32bit颜色模式下显存指针
  37.         (u8 *)&g_LTDC_BUFF_RGB888[1],        //24bit颜色模式下显存指针
  38.         (u16 *)&g_LTDC_BUFF_RGB888[1],        //16bit颜色模式下显存指针
  39.         &cg_GDI_GRAM_Interface_32bit,
  40. };


  41. /*************************************************************************************************************************
  42. * 函数                        :        void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
  43. * 功能                        :        绘制空心圆
  44. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色
  45. * 返回                        :        无
  46. * 依赖                        :        画点函数
  47. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  48. * 时间                        :        2011-09-20
  49. * 最后修改时间         :         2019-11-02
  50. * 说明                        :         无
  51. *************************************************************************************************************************/
  52. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
  53. {
  54.         int a = 0,b = Radius;
  55.         int di;
  56.         di = 3 -(Radius << 1);           //判断下个点位置的标志

  57. #if(GDI_PARAMETER_CHECK)                        //参数检查
  58.         while(pHandle==NULL)
  59.         {
  60.                 DEBUG("无效的句柄 pHandle\r\n");
  61.                 SYS_DelayMS(1000);
  62.         }        
  63. #endif //GDI_PARAMETER_CHECK
  64.         
  65.         while(a <= b)
  66.         {
  67.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //3           
  68.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color);             //0           
  69.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color);             //1      
  70.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //7           
  71.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color);             //2            
  72.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color);             //4               
  73.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color);             //5
  74.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color);             //6
  75.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);            
  76.                 a ++;
  77.                 //使用Bresenham算法画圆     
  78.                 if(di<0)
  79.                         di += 4 * a + 6;                                                                                    
  80.                 else
  81.                 {
  82.                         di += 10 + 4 * (a - b);   
  83.                         b --;
  84.                 }                                                                                    
  85.         }                                                                                 
  86. }
  87.                                                                                                                                           

  88. /*************************************************************************************************************************
  89. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
  90. * 功能                        :        绘制直线(可以倾斜)
  91. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色
  92. * 返回                        :        无
  93. * 依赖                        :        画点函数
  94. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  95. * 时间                        :        2011-09-20
  96. * 最后修改时间         :         2019-11-02
  97. * 说明                        :         无
  98. *************************************************************************************************************************/
  99. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
  100. {
  101.         u16 t;
  102.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  103.         int incx,incy,uRow,uCol;
  104.         
  105. #if(GDI_PARAMETER_CHECK)                        //参数检查
  106.         while(pHandle==NULL)
  107.         {
  108.                 DEBUG("无效的句柄 pHandle\r\n");
  109.                 SYS_DelayMS(1000);
  110.         }        
  111. #endif //GDI_PARAMETER_CHECK        
  112.         
  113.         delta_x=ex-sx; //计算坐标增量
  114.         delta_y=ey-sy;
  115.         uRow=sx;
  116.         uCol=sy;
  117.         if(delta_x>0)incx=1; //设置单步方向
  118.         else if(delta_x==0)incx=0;//垂直线
  119.         else {incx=-1;delta_x=-delta_x;}
  120.         if(delta_y>0)incy=1;
  121.         else if(delta_y==0)incy=0;//水平线
  122.         else{incy=-1;delta_y=-delta_y;}
  123.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  124.         else distance=delta_y;
  125.         for(t=0;t<=distance+1;t++ )//画线输出
  126.         {  
  127.                 pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点
  128.                 xerr+=delta_x ;
  129.                 yerr+=delta_y ;                                                                                                
  130.                 if(xerr>distance)
  131.                 {
  132.                         xerr-=distance;
  133.                         uRow+=incx;
  134.                 }
  135.                 if(yerr>distance)
  136.                 {
  137.                         yerr-=distance;
  138.                         uCol+=incy;
  139.                 }
  140.         }  
  141. }


  142. /*************************************************************************************************************************
  143. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
  144. * 功能                        :        在指定位置画一个矩形
  145. * 参数                        :        pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色
  146. * 返回                        :        无
  147. * 依赖                        :        画线函数
  148. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  149. * 时间                        :        2011-09-20
  150. * 最后修改时间         :         2019-11-02
  151. * 说明                        :         无
  152. *************************************************************************************************************************/
  153. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)
  154. {
  155.         
  156. #if(GDI_PARAMETER_CHECK)                        //参数检查
  157.         while(pHandle==NULL)
  158.         {
  159.                 DEBUG("无效的句柄 pHandle\r\n");
  160.                 SYS_DelayMS(1000);
  161.         }        
  162. #endif //GDI_PARAMETER_CHECK
  163.         
  164.         GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);
  165.         GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);
  166.         GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);
  167.         GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);
  168. }                                                                           


  169. /*************************************************************************************************************************
  170. * 函数                        :        void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
  171. * 功能                        :        画一个2*2的大点
  172. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色
  173. * 返回                        :        无
  174. * 依赖                        :        画点函数
  175. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  176. * 时间                        :        2011-09-20
  177. * 最后修改时间         :         2019-11-02
  178. * 说明                        :         无
  179. *************************************************************************************************************************/
  180. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
  181. {        
  182. #if(GDI_PARAMETER_CHECK)                        //参数检查
  183.         while(pHandle==NULL)
  184.         {
  185.                 DEBUG("无效的句柄 pHandle\r\n");
  186.                 SYS_DelayMS(1000);
  187.         }        
  188. #endif //GDI_PARAMETER_CHECK
  189.         
  190.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                //中心点
  191.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);
  192.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);
  193.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color);                           
  194. }        
复制代码


  1. /*************************************************************************************************************
  2. * 文件名                :        GDI.h
  3. * 功能                        :        图形设备接口(Graphics Device Interface)
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  5. * 创建时间                :        2019-11-02
  6. * 最后修改时间        :        2020-02-02
  7. * 详细                        :        STM32F7 图形设备接口
  8. *************************************************************************************************************/
  9. #ifndef _GDI_H_
  10. #define _GDI_H_
  11. #include "system.h"
  12. #include "DMA2D_GRAM.h"

  13. #define GDI_PARAMETER_CHECK                1        //参数检查-主要检查指针
  14. #define GDI_DEBUG                                1        //调试输出

  15. #if GDI_DEBUG
  16.         #define GDI_debug(format,...)        uart_printf(format,##__VA_ARGS__)
  17. #else
  18.         #define GDI_debug(format,...)        /\
  19. /
  20. #endif        //GDI_DEBUG



  21. extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle;        //显示器Layer1 GRAM定义
  22. extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle;         //显示器Layer2 GRAM定义
  23.         
  24. #define LTDC_Layer1_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle)        //显示器GRAM 1
  25. #define LTDC_Layer2_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle)        //显示器GRAM 2

  26. //GDI相关API
  27. __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
  28. {        
  29.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                                                //画点
  30. }        
  31. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color);                        //绘制空心圆
  32. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color);                        //绘制直线(可以倾斜)
  33. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color);                //在指定位置画一个矩形
  34. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //画一个2*2的大点


  35. #endif /*_GDI_H_*/
复制代码

测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。

  1. FIL *pFile;
  2.                 FILE_ERROR mError;
  3.                 GRAM_HANDLE *pGramHandle;
  4.                
  5.                 pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565);        //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB565
  6.                 if(pGramHandle != NULL)
  7.                 {
  8.                         GRAM_Clear(pGramHandle, 0xff00);                                                //清除显存,防止读取失败了还是现实上一次的图片
  9.                         uart_printf("[OK]GRAM初始化成功\r\n");
  10.                         pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);
  11.                         if(pFile != NULL)
  12.                         {
  13.                                 uart_printf("[OK]打开文件成功\r\n");
  14.                                 if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中
  15.                                 {
  16.                                         uart_printf("[OK]读取文件成功\r\n");
  17.                                 }
  18.                                 else
  19.                                 {
  20.                                         uart_printf("读取文件错误:%d\r\n", mError);
  21.                                 }
  22.                         }
  23.                         else
  24.                         {
  25.                                 uart_printf("打开文件错误:%d\r\n", mError);
  26.                         }
  27.                         //将显存拷贝到屏幕中
  28.                         GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240);                        //GRAM局部拷贝
  29.                 }
复制代码



收藏 评论0 发布时间:2021-12-16 21:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版