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

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

[复制链接]
STMCU小助手 发布时间:2021-12-16 21:00
DMA2D可以加快图像填充,并且支持像素格式转换。
3 _& N' {) M. b# V9 y; i1 S  V( a4 D& ?
  1. /*************************************************************************************************************
    1 \: u7 ^( S2 f) f% i' Z8 ~9 P; z
  2. * 文件名                :        dma2d.c3 U/ n  V) O2 e) U% q
  3. * 功能                        :        STM32F7 DMA2D驱动
    4 t5 B" }$ J" k4 ]
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    . ?  L  i3 |) l2 {9 F! T  m( g" K
  5. * 创建时间                :        2019-10-293 m; i# C: @# L/ U  C4 D$ H! Z
  6. * 最后修改时间        :        2019-10-29
    ! q- ]& L8 {# X: y
  7. * 详细:                        
    3 [7 V: x  E" q3 k4 E( i
  8. *************************************************************************************************************/        # ]) q$ W( N4 X' }2 M0 [5 `
  9. #include "dma2d.h"6 T$ y+ g$ K, h9 X/ w  H, L! O
  10. #include "SYSTEM.H"
    3 _5 c, F6 Q" {- `# p5 c3 \

  11. 6 `2 a% E# g: N. a+ Y; ?+ H+ W

  12. . n& m( A8 W; ?& H; K
  13. /*************************************************************************************************************************6 T/ C  O* {. n) u. b
  14. * 函数                        :        void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)
    : {4 s" L2 [3 j, R3 T6 b+ y6 U
  15. * 功能                        :        DMA2D进行单色填充
      b0 v, M) Z  B; E
  16. * 参数                        :        FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;- k0 k5 `$ j* H% T* w
  17.                                         ColorMode:颜色模式;Color:颜色值
    , M: U6 Q& N$ l; [3 I2 r* v
  18. * 返回                        :        无
    ; _8 D2 f* E5 ?  s) o' a
  19. * 依赖                        :        底层宏定义
    3 @: J. L* z3 ?8 ^
  20. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>0 v$ T0 q7 L- j1 L  \4 J% a
  21. * 时间                        :        2019-10-29
    & p2 E; x8 l0 w  k8 B2 }
  22. * 最后修改时间         :         2019-10-30
    2 v0 T2 m8 I- F! G3 N
  23. * 说明                        :        用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    ! u- t0 {. S* F0 q1 m2 \
  24. *************************************************************************************************************************/. |6 b) f! t# y) A
  25. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)
    0 g  U$ }; ~- t6 P& c
  26. {5 l. ?: B  k# `5 m" R  x! w
  27.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    # [- X+ n6 }8 Y8 X0 r
  28.         DMA2D->CR = 0;                                                                //先停止DMA2D1 z2 E+ ]0 D/ B
  29.         DMA2D->IFCR |= 1<<1;                                                //清除传输完成标志 * v1 e5 p! Q( S0 f
  30.         DMA2D->CR = DMA2D_MODE_REG<<16;                                 //寄存器到存储器模式
    + w9 Z* t" O+ m' q
  31.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
    . o5 I; q- R2 n: R, o: R9 X7 N
  32.         DMA2D->OOR = OffsetX;                                                //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充8 i  w' A( a% d4 G1 m9 x+ R
  33.         DMA2D->OMAR = FGRAM_Addr;                                        //目的地址. e( r- P& K- g  Q0 v
  34.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    0 A* O7 z  H1 ?8 y5 h
  35.         DMA2D->OCOLR = Color;                                                //输出颜色2 h/ s; |! ~% y6 `, ]. ~
  36.   |: m* W  M+ @) u& a, w
  37.         DMA2D_Start();                                                                //开始传输' u; b) Q8 R/ y4 \% }9 m0 l
  38. }' z9 q% e8 E5 Z
  39. ) O7 f# ^0 l1 J: n

  40. # l2 w8 H" v+ d9 F, z

  41. # O. ?! S% X) j) n: S
  42. /*************************************************************************************************************************
    % F) O8 C- Z6 o
  43. * 函数                        :        void DMA2D_WaitTransferComplete(u32 TimeOutMs)
    ) g1 j1 _2 l5 P
  44. * 功能                        :        等待DMA2D传输完成
    ' ^( X" K/ F6 h: i9 K
  45. * 参数                        :        TimeOutMs:超时时间/ p! E% i( B. G+ k5 S
  46. * 返回                        :        无
    2 j- p" z( t, v4 @6 M, z' V
  47. * 依赖                        :        底层宏定义
    # [& w2 H- m3 r/ O# t% v- L
  48. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>3 F7 f4 E4 r4 d9 `9 m, ^" H; A
  49. * 时间                        :        2019-10-30
    ( |3 F' E( P& F% M4 h
  50. * 最后修改时间         :         2019-10-30
    & Y! q6 ?% [( z  m6 R' {" c
  51. * 说明                        :        超时后会取消传输1 _  V' ^) Y& y2 V
  52. *************************************************************************************************************************/8 @  z3 P2 @) K; U5 ~+ u
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs)! S) n  \: I1 q! w  t
  54. {
    * O# @& V% `2 D6 Q* I) n7 G
  55.         u32 timeout = 0;
    . B0 o) ?9 @" `+ r' O  p# H
  56.         
    ) B/ q4 |( |, A
  57.         while((DMA2D->ISR & (1<<1)) == 0)        //等待传输完成5 e, d: g0 _2 g
  58.         {; v6 g% H' B9 _  q- D1 ?3 U1 Y2 t
  59.                 timeout++;9 J0 Y" U7 Z) z1 [; M
  60.                 SYS_DelayMS(1);                                        //延时1ms( [" `6 _% z% o' [: F9 k  o
  61.                 if(timeout > TimeOutMs)( ]- b$ I4 U* p
  62.                 {+ T  y. T6 k6 q& m  e
  63.                         DMA2D_Abort();                                //终止传输% I' T9 x3 o, W
  64.                         break;                                                //超时退出
    " T$ m  ~: A5 M( ^( P. A! T
  65.                 }
    . u$ q6 \( p. N1 d' e8 B
  66.         }  
    - x/ J; }  h* p9 S0 ?1 _. _
  67.         DMA2D->IFCR |= 1<<1;                                //清除传输完成标志         
    8 g  {# F2 }8 ]; D
  68. }8 u$ j$ E* w( s5 ?7 o

  69. 7 [# N( O5 w9 d
  70. /*************************************************************************************************************************
    3 _  D  M2 k# o3 M- N# V2 f5 H
  71. * 函数                        :        void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)5 X! \( S5 ]9 G" N
  72. * 功能                        :        DMA2D进行矩形图形填充
    & \% k3 k2 E: Y' L9 k( p( K
  73. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);# l0 e9 x/ q0 U
  74.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    - s5 m7 d) g& }! F
  75.                                         ColorMode:颜色模式+ L# |  f  B( N
  76. * 返回                        :        是否设置成功( C: X* s+ f  }
  77. * 依赖                        :        底层宏定义
    $ w% X/ q' u4 I/ U6 X4 i
  78. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 w8 \: n6 n6 l3 m4 O! v
  79. * 时间                        :        2019-10-28; B( ?' N( K( q3 p! N  M
  80. * 最后修改时间         :         2019-10-28
    + J' t) ~) C2 ^2 r( Z, h7 r) f
  81. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    ) n5 t2 S$ b5 S9 c
  82. *************************************************************************************************************************/' w8 ?! |. _3 ~& O" p8 e7 w
  83. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)( A( I# M" O: y
  84. {9 l7 K2 |- O& u% F4 w9 p4 j
  85.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟: w  a5 R) n# v2 J* R9 s
  86.         DMA2D->CR = 0;                                                                //先停止DMA2D
    , `, Q6 O" D6 c9 G8 v8 v) P$ h% b
  87.         DMA2D->CR = DMA2D_MODE_MEM<<16;                                 //存储器到存储器模式" x' V/ t% Y. J
  88.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    9 A6 K. w1 G5 O! C, w  ~
  89.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式+ B8 J5 y& p" C/ B
  90.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
    $ o  m, f7 n5 n8 T% n: E' Z
  91.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移 , ~" N- N$ F+ n$ @* E
  92.         DMA2D->FGPFCCR = ColorMode;                                        //源图像颜色格式
    - O2 m: P( M* M, K$ g( p6 P/ r
  93.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    + P2 v& G$ b4 H% D. `
  94.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
    ; X% g" @+ j5 m& q, g
  95.         
    8 x" ^3 ~" c( ?6 y: C5 \0 M# X. Y
  96.         DMA2D_Start();                                                                //开始传输
    & ?( O4 P6 Y& [5 D
  97. }/ x# _3 ~' G+ e8 Y

  98. 5 ~) c: u. m: E( B* _
  99. ) l. \/ O  c" o- R
  100. /*************************************************************************************************************************/ l% D2 B% [, w, y
  101. * 函数                        :        void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, $ z6 J5 F8 X+ B+ L" X1 u
  102.                                                 DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    8 G9 G; r- Z  Z5 }# H$ R
  103. * 功能                        :        DMA2D进行矩形图形填充(会执行像素格式转换). X% a  t# c! h, C4 m
  104. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);9 m' x1 H$ u7 {+ L8 C  C  s! B
  105.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    4 z6 Y! m) ?! T5 g1 n0 }
  106.                                         SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式
    7 }( G( N- r* \8 {: F
  107.                                         AlphaMode:alpha模式;Alpha:Alpha值;; t+ q/ ^# M6 ^3 |
  108. * 返回                        :        是否设置成功) E; [- Z8 F( C$ v4 v) m
  109. * 依赖                        :        底层宏定义, G2 r7 V5 @. g" {0 x/ d
  110. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>: U, n4 C) e# ?
  111. * 时间                        :        2019-10-288 W0 ^0 z7 h! t( n" o; B0 ~/ v5 @
  112. * 最后修改时间         :         2019-10-28- x1 B* y7 j3 a- ?# f- y
  113. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束' W; ~" L' h2 X' z$ t6 H* H7 I
  114. *************************************************************************************************************************// p5 N2 ^$ Q7 G; U% z( n& W
  115. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    $ l' u6 v% q0 h( J9 B6 s. I3 W
  116.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    ( o9 Z$ d1 K- ~  K2 u1 a8 U" D  [: J
  117. {
    * C2 D$ n/ G9 n
  118.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟$ q) m  t& j4 F: f1 {
  119.         DMA2D->CR = 0;                                                                //先停止DMA2D
    $ ]7 _# q1 c- W9 `
  120.         DMA2D->CR = DMA2D_MODE_MEM_PFC<<16;                        //存储器到存储器模式-激活PFC
    3 @; T% n7 b9 [& s. I
  121.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数' J. ^4 g1 Q$ _
  122.         DMA2D->OPFCCR = DestColorMode;                                //输出颜色格式6 I) U. m) f6 \: g6 u' K! L# E
  123.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
    & _) r1 x( v4 x) c" x
  124.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移
    2 N- I+ e& R* t9 w. Y. G! m, S
  125.         DMA2D->FGPFCCR =((u32)Alpha << 24) |  ((u32)AlphaMode << 16) | SourceColorMode;                        //源图像颜色格式! w% u7 r& b6 Q9 M
  126.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充! l. `2 Z) n8 Y5 p
  127.         DMA2D->FGMAR = SourceImageAddr;                                //源地址* x) t0 _  `8 e; f1 L& _7 e( }
  128.         
    6 i; f' j/ e( @  ]+ u" T: h. V  m  R
  129.         DMA2D_Start();                                                                //开始传输
    ) K* j* f% j& T# `
  130. }
复制代码
  1. /*************************************************************************************************************
    . a3 D9 j6 i' {; a: x2 `3 G4 c
  2. * 文件名                :        dma2d.H
    " m, M  R8 N3 H9 n9 j' S' G
  3. * 功能                        :        STM32F7 DMA2D驱动; ^7 ~5 a: i) t
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>9 U  a: u! U4 I0 j
  5. * 创建时间                :        2019-10-291 M( L2 s3 o! i& {2 a/ q# m9 Z' B9 a/ j
  6. * 最后修改时间        :        2019-10-29
    2 q" r! _* m; l# e6 ^! v6 b
  7. * 详细:                        # d; S, _. ~9 L
  8. *************************************************************************************************************/        
    # n7 Z$ m8 I/ Z! F! m+ n, ^2 f( @
  9. #ifndef __DMA2D_H_/ M' \  N4 @4 ]# e' r
  10. #define        __DMA2D_H_           3 u7 O% v( w  l; _) I# `# Q
  11. #include "system.h"9 _$ ^  x' p, K0 r
  12. 9 g  L) S5 c, V4 H

  13. * B  ~! ~' Z. X4 X# P7 d
  14. typedef enum
    , {/ ^* d: K( s- Q
  15. {& N' u* t; c3 s" A, N( x
  16.         DMA2D_MODE_MEM                =         0,                //存储器到存储器(仅限 FG前景色 获取)# @& H6 p/ {$ J0 n* P/ G
  17.         DMA2D_MODE_MEM_PFC        =        1,                //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)( y- W3 C1 V% o& i+ x. ?
  18.         DMA2D_MODE_MEM_MIXED=        2,                //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)
    3 p* ?! B1 n9 o6 F( l5 s
  19.         DMA2D_MODE_REG                =        3,                //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)
    / `! K' P; g6 m8 ]
  20. }DMA2D_MODE;* }2 j* W9 J: y- Q7 E$ Y  ?

  21. 8 {, O9 v& B2 L
  22. //颜色模式
    . J- f4 c9 |0 C* H7 |& t
  23. typedef enum
    / n; B, h( ^! |* c& V, y
  24. {
    5 {8 }  u  P( ?! D, k
  25.         DMA2D_COLOR_ARGB8888         = 0,
    / P% y' m" b+ D* R7 J
  26.         DMA2D_COLOR_RGB888                 = 1,  }* y. g2 M+ T
  27.         DMA2D_COLOR_RGB565                 = 2,
    ) t8 w" f, s8 h
  28.         /*DMA2D_COLOR_ARGB1555         = 3,! f3 w6 \2 M1 L8 o
  29.         DMA2D_COLOR_ARGB4444         = 4,! {  d* u) n0 K0 t
  30.         DMA2D_COLOR_L8                         = 5,        //8 位 Luminance2 G7 w0 C3 f3 X( }6 X3 c5 U
  31.         DMA2D_COLOR_AL44                 = 6,        //4 位 Alpha,4 位 Luminance
    & j) E6 Y/ D- i9 P) N1 u
  32.         DMA2D_COLOR_AL88                 = 7,        //8 位 Alpha,8 位 Luminance
    ( `% c7 u+ i6 w
  33.         DMA2D_COLOR_L4                         = 8,        //4 位 Luminance
    - R. H2 H4 c, F4 W0 v: D0 G5 V8 v  B
  34.         DMA2D_COLOR_A8                         = 9,        //8 位 Alpha4 S7 n- J  L+ ~+ }2 H' n
  35.         DMA2D_COLOR_A4                         = 10,        //4 位 Alpha*/
    0 {8 X; U, W/ G" r
  36. }DMA2D_COLOR_MODE;
    7 v3 @& e/ P5 P

  37. ) Y: C- r' _8 Z2 d. i5 B
  38. 1 n4 R9 A* S2 Y2 U
  39. //Alpha 模式: g( o7 y7 t) Y5 h
  40. typedef enum/ w0 a0 ]: e5 J: F/ l  N9 g3 N' P4 G; l
  41. {. |( V" f# i7 h9 j4 ^
  42.         DMA2D_ALPHA_NULL        =        0,//不修改前景层图像的 alpha 通道值
    6 ]8 T3 K( K: f9 X3 Q
  43.         DMA2D_ALPHA_REPLACE        =        1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]& ~* N% L; F* a% \( g1 B6 n
  44.         DMA2D_ALPHA_PRODUCT        =        2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积
    " D+ Y# r* a4 h$ w7 d, M
  45. }DMA2D_ALPHA_MODE;
    1 j0 n! X) E) n, H' Q# y

  46. . x( K  @. O# i+ ~5 b
  47. 4 @. c3 @, H: v0 i) \' G0 c
  48. __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;}                //终止传输" P' f; a- Q6 ^- i, Y9 n6 ]' L
  49. __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;}                //挂起传输1 A* A7 o8 K  y2 n5 Z9 |
  50. __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;}                //开始传输
    $ o8 r( l8 g* w5 z! m% d! U

  51. + C- c  |# s7 G9 q! p) Y  ^+ _
  52. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color);        //DMA2D进行单色填充
    3 f$ I+ {7 Y% [8 [- S6 K& L' x
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs);                                                                                                                                                        //等待DMA2D传输完成
    6 S' @+ t* t3 K) I1 ]2 S
  54. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充1 w7 N2 L8 Z2 f5 n
  55. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, ( E9 K9 o, m, {
  56.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)
    ; y, u- O# s' H: x; r# n6 y
  57. #endif //__DMA2D_H_
复制代码
  1. /*************************************************************************************************************: F0 G" _0 {0 }8 O+ l2 g. i1 Q7 m
  2. * 文件名                :        DMA2D_GRAM.c3 L* w* Z  h  G
  3. * 功能                        :        GRAM相关操作! A. f5 C0 d& y4 Q# V
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    - @& h, f2 f' o" D2 d4 p+ e; ?
  5. * 创建时间                :        2019-10-30' w. G: [1 x5 z$ P0 ?/ H
  6. * 最后修改时间        :        2019-10-30: i% ^5 N8 @' N3 A9 D0 _# B, F
  7. * 详细:                        显存相关操作接口3 D; L' V" c* q7 G$ F4 z
  8. *************************************************************************************************************/        
    ; o' {3 }! s3 p1 Y. G
  9. #include "dma2d.h"
    5 _  f0 u. _6 b" v' i4 k5 k
  10. #include "DMA2D_GRAM.h"- K  n1 U2 w8 k# b; E
  11. #include "SYSTEM.H"
    2 F0 t) ~9 n0 D! ^
  12. 5 a) m* |) I4 o8 Z; o
  13. //基本接口
    9 x0 E6 q) J9 l0 b: [/ L
  14. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //32bit色彩GRAM显存画点
    : S) ?& q. ~9 Q5 y
  15. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //24bit色彩GRAM显存画点7 D# U( Z% v; z0 H
  16. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //16bit色彩GRAM显存画点' v9 U# v: Z$ G

  17. . s6 A8 x+ B/ _

  18.   h! q; i% @: L( b& f, @* L, g3 ]; S" n
  19. //GRAM相关接口-16bit# `1 d, D& N; `2 P* v
  20. const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit =   U* Y6 s6 X7 Q0 v1 p
  21. {
    3 d" d6 r  Y& t. g7 _0 s
  22.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit,                        //GRAM显存画点(RGB565格式)* u' P  D1 S6 H: G6 l9 l
  23.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    , A! g- I. J" b' I5 c" V& z
  24.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
      Q8 U# E+ n- n# s5 F6 P1 T
  25. };! D6 B! t  k# Y( t

  26. 9 w! Z0 a7 s5 a3 i* O
  27. //GRAM相关接口-24bit
    + D- F: M7 Y. K5 j' Y( m& H$ d! C
  28. const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit =
    & L9 ]0 ]1 Z) q
  29. {
    , X% e5 E3 D% o
  30.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit,                        //GRAM显存画点(RGB888格式)
    1 C& C8 Y' L7 @; [! J4 j
  31.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充) C8 M/ p! j9 `2 d1 n$ r
  32.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    7 s9 j6 [5 b- P& E6 g. y$ r# N! z" {
  33. };
    4 ]! y$ P7 `* O3 g
  34. & j% s  S  r5 j4 l7 i
  35. //GRAM相关接口-32bit
    - `) W; z! j& i4 P+ N0 m
  36. const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit =
    & Z# k3 N! ~; i: e9 l" a& Q/ q1 \
  37. {: u/ N. w' c. P: b0 J
  38.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit,                        //GRAM显存画点(ARGB8888格式)
    4 ?5 [! l0 e" Q2 s
  39.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    ' n$ d  N" c- A  P1 k
  40.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    + B7 ?" Q$ s: M6 F4 x' g( b
  41. };& ]( I* \$ D4 P: z4 W

  42. : _, d: q. O0 o. o) M2 O" I
  43. /*************************************************************************************************************************
    / {; {; r0 ]$ p4 r
  44. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    0 c% _/ R2 }9 M2 \
  45. * 功能                        :        GRAM句柄初始化(不会申请内存)
    ; ]' K8 I: t! P! e! M# a; [
  46. * 参数                        :        pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式
    % G" y+ G( Q1 K" d: C1 v0 B
  47. * 返回                        :        无
    4 S( w3 B. u% \: U: Q  o
  48. * 依赖                        :        底层宏定义
    # c6 ^( ?5 M& a  f9 j+ Z0 M$ A
  49. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a># s7 j+ p# G* D5 ~
  50. * 时间                        :        2019-10-30
    6 `; K9 q) o& L! P# l! A# T) q
  51. * 最后修改时间         :         2019-10-30
    5 N: @& P& X6 @5 ~: t' D
  52. * 说明                        :        初始化显存) o1 |1 G& ]9 S5 h0 q( u
  53. *************************************************************************************************************************/) L2 f9 `# ~0 Y. c
  54. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    . Y+ x; j& c6 S+ w
  55. {
    ( v' R& n* X- }* n5 I( D
  56.         while(pHandle == NULL)! ^" V6 i8 U$ f
  57.         {
    $ s3 U' {2 }" ?( `; }
  58.                 DEBUG("无效的句柄pHandle\r\n");1 ]6 A- @5 U. J
  59.                 SYS_DelayMS(500);
    ; O6 B2 m3 P# t) x' H: q+ k, ^
  60.         }
    ) T& Z) @% \  h3 e& h- n
  61.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址8 ~& u' y( C* N( N7 `# E
  62.         pHandle->Width = Width;                                                        //GRAM宽度
    8 Z3 e7 f% c: H. D
  63.         pHandle->Height = Height;                                                //GRAM高度$ E- ]+ i- x3 Z' X# T# [8 g  [
  64.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
    & i8 Q5 F1 V0 t8 J3 g; b5 n
  65.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针
    2 ~2 K% F) b3 r- V
  66.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针
    6 [5 `3 F5 l2 L
  67.         //像素模式
    3 f8 ^, f! ^3 d8 e8 }! D
  68.         switch(ColorMode)
    & _" G2 h9 q, y2 c& H7 I9 F/ P
  69.         {6 d' Q/ y! ^$ b& Q6 N% Y
  70.                 case DMA2D_COLOR_ARGB8888 :
    & e4 @, J1 J/ Q6 E
  71.                 {
      z/ R% g5 i, w6 Z% w' }
  72.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;2 W2 m7 j: ?* g; l, q
  73.                 }break;
    , W. H6 g0 {' @. ]9 a  P
  74.                 case DMA2D_COLOR_RGB888 :
    ; i' \" t8 @$ ]; w$ \$ }  T
  75.                 {5 O0 N" j' E8 I! i' T3 M
  76.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
    ; y/ T2 p4 p* V, t1 y# G
  77.                 }break;' B, W3 W, U: S* r0 W  @3 O6 Y
  78.                 default: //DMA2D_COLOR_RGB565
    , x8 C8 q0 t$ G, [2 g% g( ]
  79.                 {
    * K, _- X5 h6 `9 M* F; T# c2 p
  80.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
    * M4 F  A9 E5 A8 O
  81.                         ColorMode = DMA2D_COLOR_RGB565;
      y/ Q3 s! I8 K  z9 e& u6 w$ h3 {
  82.                 }break;
    * N+ y3 W9 o3 C) \
  83.         }: q% w. j% A) ]% L4 i2 h
  84.         * `# p) k! u& e: z
  85.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式
    8 L5 p% |, J" x% ]* Z
  86.         pHandle->InitStatusId = DMA_INIT_OK;                        //初始化成功
    + S% X/ R/ \5 A, K8 p# [2 P
  87. }
    ! _* x9 O' g6 L5 }. I: w
  88. 3 F' R, H4 P$ d* X
  89. /*************************************************************************************************************************
    * j# w. S9 {2 O* x% [
  90. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)
    # b3 s. T* G" I1 ?2 W  C4 w
  91. * 功能                        :        创建一个GRAM(会申请内存)
    2 Z: w9 W% f  T, R
  92. * 参数                        :        Width:显存宽度;Height:显存高度;ColorMode:颜色模式
    8 b- u1 W( J) p% N: S0 z
  93. * 返回                        :        NULL:失败;其他:GRAM句柄
    ) z) X0 Q6 S2 [9 a5 b' n% {5 r
  94. * 依赖                        :        底层宏定义; F  Z3 h* p8 B. q
  95. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    / I2 b0 c' e, i6 H7 ]
  96. * 时间                        :        2020-02-02
    ( J2 s, T) S, Y/ f8 K
  97. * 最后修改时间         :         2020-02-027 l5 P$ a1 z3 G0 f6 }+ l5 ~  s
  98. * 说明                        :        初始化显存
    - r: ~! c- F+ E! E; V4 @
  99. *************************************************************************************************************************/
    ; ?* b4 Z2 T6 w% _% S
  100. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)( S8 l6 u/ J5 `" y5 ?
  101. {* S: ]; c) Y; u" X, m
  102.         GRAM_HANDLE *pHandle = NULL;- C' f, u8 ?2 ]
  103.         u32 GRAM_Addr;
    ; H) K) v2 f/ V& o4 B" Q. ]
  104.         6 s7 u# U6 p1 ~* Y8 M$ `: j2 n
  105.         pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE));        //为句柄申请内存  W5 b5 E# Y6 D( S
  106.         while(pHandle == NULL)4 `# o6 ~4 x+ o; d: ~* o
  107.         {: _" t3 y+ S1 |& c5 X' I# ]8 t7 C
  108.                 DEBUG("无效的句柄pHandle\r\n");: a2 D7 n7 n! S! z" A
  109.                 SYS_DelayMS(500);9 R* _9 y6 q1 \: K1 f( ]0 _$ f7 j( |
  110.         }
    % V4 h8 m1 n2 i0 m! z' i, Q! t
  111.         - }3 B! E# o2 N2 o- _
  112.         switch(ColorMode)
    / v  r* |0 x/ h- Q) U0 n2 h
  113.         {9 s  v, x- X2 i6 F% T( e  `% B
  114.                 case DMA2D_COLOR_ARGB8888 :" R' ^3 V6 i/ _7 _
  115.                 {
    0 k+ C+ _6 e4 W8 I, r  ?
  116.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存& k0 Z$ F7 ~) s% i3 W) h
  117.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;6 E% T6 W8 c7 s; L
  118.                 }break;& D* E( h$ }$ |# N  F' g  g7 P) f& p
  119.                 case DMA2D_COLOR_RGB888 :
    4 S: C  i8 Q) J
  120.                 {7 f$ T2 P: R) K# M8 b
  121.                         GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height);                        //为显存分配内存
    6 ?( j" i4 U! o. u& \
  122.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
    7 @/ u: s# H8 V) }+ k" r: a
  123.                 }break;
    6 k3 R! h: t' [$ M
  124.                 default: //DMA2D_COLOR_RGB565
    5 g9 e* W" Y" _5 y% _
  125.                 {4 \0 h5 ^* @, n
  126.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height);        //为显存分配内存  |, q: J' G6 x6 _( s' i" O' w
  127.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;# c8 N9 V. a! o. n- j: k+ j$ P  ?# A
  128.                         ColorMode = DMA2D_COLOR_RGB565;" S$ b, }! c$ y1 Y. [# Y0 O
  129.                 }break;
    + \9 f! i2 T/ J% \2 I% {, N; j
  130.         }9 {) P  u6 y* Y+ ?' o% M& F9 b/ z
  131.         # J& `2 |. V5 t+ D' ?$ g( v
  132.         while(GRAM_Addr == NULL)
    : P5 t5 L) T' B8 R, a# k; S
  133.         {
    * t+ r1 H0 j3 S: m: U* @
  134.                 DEBUG("显存申请内存失败\r\n");
    1 ~& i9 D- t! @
  135.                 SYS_DelayMS(500);* r" r; Y$ ^( i5 |/ j. X/ ]
  136.         }
    * y( g" Z+ c4 ~+ F) N
  137.         + @. p/ w- {) ]4 R( `# [
  138.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址+ M& c4 i' U, ?7 R
  139.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式* L; x- q! h8 s$ L3 p3 p6 S
  140.         pHandle->Width = Width;                                                        //GRAM宽度$ J4 ^+ ~# I/ M6 Z
  141.         pHandle->Height = Height;                                                //GRAM高度: l2 k/ s% v6 k6 h- ?: e2 e( i1 b7 \
  142.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
    1 y4 g6 s. c. P' {( G+ n
  143.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针
    8 f* s0 w) R5 v8 O
  144.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针7 X: }9 v* K) w- m: Q' K( ]1 l
  145.         pHandle->InitStatusId = DMA_CREATE_OK;                        //创建成功
    5 a; Q- E! s- t5 z
  146.         : \* x7 r6 D8 T, h3 V
  147.         return pHandle;& B- j* i, @% C1 I% ]9 c; V! k
  148. }
    % W8 c# _, g' M8 P9 }2 J$ Y
  149. ; ?2 i8 f( D+ f+ [8 S- `' p) P
  150. 8 b! G, `; s$ ~
  151. ' @$ Q& b! s. c
  152. /*************************************************************************************************************************0 e' G6 p( \' s# b
  153. * 函数                        :        void GRAM_Delete(GRAM_HANDLE *pHandle)' p, X8 M1 o( b7 @% @" f
  154. * 功能                        :        删除一个GRAM(会释放内存)
    2 B9 t, m/ c! O: y/ q
  155. * 参数                        :        pHandle:GRAM句柄
    8 l$ h+ `3 D( }; N& S3 t  a9 |
  156. * 返回                        :        无
    + u% P5 P- Q  q, w7 t
  157. * 依赖                        :        底层宏定义
    " y* P- |5 x) A" y% [  P. I, E
  158. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    8 q* i0 [6 e3 l8 O% C7 H& O
  159. * 时间                        :        2019-12-16
    . R- G: \. g; C% w: B4 d4 T
  160. * 最后修改时间         :         2019-12-164 W: w3 @. R2 P7 b
  161. * 说明                        :        用于删除显存,释放内存5 c8 a; Y+ b0 _) y6 z, ]! q$ ^
  162. *************************************************************************************************************************/
    9 ]& A1 w$ p0 ]8 k
  163. void GRAM_Delete(GRAM_HANDLE *pHandle): {% B7 r) k+ t# S% k  \( y/ H
  164. {( ~! v- `9 J! Q3 Z' c
  165.         if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)' f% ?* `- \6 D- I9 N8 m; v
  166.         {
    7 _" d- g9 y, T
  167.                 if(pHandle->GRAM_Addr != NULL)1 u. r9 _7 Y* Y( |4 F
  168.                 {
    + x( M! J# V$ r* Z5 h, t
  169.                         GRAM_free((u8 *)pHandle->GRAM_Addr);                //释放显存内存
    " _0 q* J6 p0 S; F& j
  170.                         pHandle->GRAM_Addr = NULL;3 Z4 G9 p; ]; O* z
  171.                 }! ~* f1 X: n; H% y; J! k
  172.                 pHandle->InitStatusId = 0;8 Z* I- J. d# `3 R. c1 P
  173.                 GRAM_free(pHandle);                                                                //释放句柄内存( W; z& K/ d  o  T" D6 ?
  174.                 pHandle = NULL;# T  C5 X  E# |4 n; D2 Z9 A, ^
  175.         }" }( ~. }! m7 n7 Z5 R0 O" W
  176. }
    / r+ z2 ]+ f; L3 h

  177. 5 v3 e( a  `- u, k9 p

  178. 2 v( C4 j/ O3 ]6 N' `
  179. /*************************************************************************************************************************9 a- z# u! H  d( \& L6 {
  180. * 函数                        :        void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)2 o; |3 M2 Y, p* y  F5 I* R( W
  181. * 功能                        :        32bit色彩GRAM显存画点8 |9 P# [- F& w1 _5 j. R$ _* r
  182. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色9 ^) c3 `( ^- r+ [0 e& D  m/ j
  183. * 返回                        :        无
    ) Y' k7 W; v0 W; q) I8 m- w; Z3 o1 v' R
  184. * 依赖                        :        底层宏定义) G4 e/ m8 I9 h
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>- z# m* G, b/ Q3 p
  186. * 时间                        :        2019-10-302 `# N' S# u$ c: h3 \2 b0 Z* }" \7 @
  187. * 最后修改时间         :         2019-10-306 ~/ g" P5 f7 E0 d2 X6 }8 p
  188. * 说明                        :        在显存中绘制点/ S5 f% u" a/ u3 H3 T
  189. *************************************************************************************************************************/! u* t( Q, a! B2 L+ L
  190. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    - L4 p% l& l9 P5 \
  191. {
    ' D. j" I' l5 a/ L+ D
  192.         pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
    $ x+ a' M* V* i4 g
  193. }
    ' g. Z5 P, T7 d5 d
  194. ! T( c/ s, K5 i% B- \& r
  195. 2 u( g# ^: k" C9 h
  196. /*************************************************************************************************************************
    * j- h) H3 O) |5 z) T
  197. * 函数                        :        void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)- ?/ I% ?9 J$ v( u
  198. * 功能                        :        24bit色彩GRAM显存画点
    7 i, [0 P' @8 s% u" }- h
  199. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    5 s) D9 }) U- p7 P
  200. * 返回                        :        无
    + o+ r! l: V* ~; B8 A: u# G
  201. * 依赖                        :        底层宏定义( r/ i$ Q* m- o6 |% F6 u
  202. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>, Z# h+ c, S) T( R) w
  203. * 时间                        :        2019-10-30
    ; I8 b: q* a( A; T7 D1 c
  204. * 最后修改时间         :         2019-10-30
    ' c1 s$ \' s# ]/ ?% {" N
  205. * 说明                        :        在显存中绘制点
    . Z. h" e0 s5 ]+ \: r$ \; Y
  206. *************************************************************************************************************************/
    ) R" D' C' m. u7 H
  207. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    4 y* [( X5 i2 C3 r9 k" T- H
  208. {
    : B  @4 O" M2 G  b# i$ z2 V- f
  209.         memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);0 i3 M% `$ P* D% ?
  210. }
    " p, }1 Y! H" u

  211. ( Z! A! i8 [! f" p3 k5 l

  212. $ H9 x6 ]1 }# ^0 U* ]
  213. /*************************************************************************************************************************
    3 b# [5 w" g, o  q+ X/ y
  214. * 函数                        :        void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)% X- b5 s5 \+ e. v. b) ]
  215. * 功能                        :        16bit色彩GRAM显存画点
    4 V& l( S; W! u! [
  216. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    ) q, E3 t0 b. }) ~9 _. [. ~6 Z
  217. * 返回                        :        无
    8 s, {1 r- r: o% E, e
  218. * 依赖                        :        底层宏定义
    : N% Z+ E: w4 U
  219. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>0 l2 g$ |, {# z
  220. * 时间                        :        2019-10-30
    " g) y9 C1 H( X5 v$ J
  221. * 最后修改时间         :         2019-10-30. M. `  J& n+ e
  222. * 说明                        :        在显存中绘制点
    ' B: F2 d7 X% R3 q& f0 f' t
  223. *************************************************************************************************************************/4 \# N+ r/ S% r! _' O9 G7 S
  224. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)) W) Z0 o/ P! {, Y( a0 @3 d: F' Q0 H
  225. {
    3 W8 K! W* p9 B
  226.         pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;+ [5 i" ~9 R* L
  227. }
      m. z* ^! ]9 r0 x
  228. ) A) F% t* A; |1 |$ }% e- L' g
  229. , P3 l& L: X+ l: t
  230. 2 l9 v; V# v; T+ I0 g
  231. /*************************************************************************************************************************
    ; \  a9 J, ^1 U
  232. * 函数                        :        void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)        % v6 M( Z& Y$ ^2 W# O+ z# F) y- }
  233. * 功能                        :        GRAM矩形填充(使用DMA2D)
    / a" [: v1 g1 H9 J- x, ~
  234. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色6 k9 R/ {$ A& I, {" g- Z
  235. * 返回                        :        无8 A& l0 E# G  L5 `
  236. * 依赖                        :        底层宏定义
    1 i3 u& M( R& q* S8 \' ]. a
  237. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    / n2 M; r3 ~6 b! P0 B  {
  238. * 时间                        :        2019-10-30
    # L) E- G* R! [: O) d- \' G, q2 D
  239. * 最后修改时间         :         2019-10-30
    7 h, _6 ~2 }2 V+ U1 m
  240. * 说明                        :        采用DMA2D实现
    , u( e* `9 ~1 O7 G
  241. *************************************************************************************************************************/
    - @% I6 k4 S  h) g8 i( d2 F% y
  242. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)6 x, f; V7 Y- A6 n
  243. {# Q  ~7 ]1 H* c* B! n
  244.         switch(pHandle->ColorMode)
    * _% G) V3 |  ]+ l- @
  245.         {
    1 T' U# F/ V% B: p5 `" o* y
  246.                 case DMA2D_COLOR_ARGB8888 :/ I4 J: \# O# b6 b) @
  247.                 {
    8 D3 U1 ^+ k% E# Q# u/ i2 H7 @% T
  248.                         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进行单色填充/ }5 H7 X( y8 T$ w( C. v. @# v( v) c
  249.                 }break;, h! |4 W6 X9 }% j' U* W
  250.                 case DMA2D_COLOR_RGB888 :
    2 r# N2 r) Z; v8 L- }4 c$ b
  251.                 {
    ( i8 K5 s  W9 [$ i
  252.                         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进行单色填充
    . D' b/ T; e4 k
  253.                 }break;
    + y1 ?$ e: C3 l1 r0 v0 J9 R3 L
  254.                 case DMA2D_COLOR_RGB565 :, q( }3 c/ o2 O) Y) g
  255.                 {
    ) C% O* S$ b3 U. N9 T% q
  256.                         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进行单色填充
    0 z1 y# J$ K: o- k4 z2 O; u
  257.                 }break;
    ' q  J" s1 G5 p6 ^  X
  258.                 default:return;2 i3 j+ {; X: T4 r9 I
  259.         }- z; Z+ v; A5 ]
  260.         ; T0 c4 X& w% u' Q) K9 L
  261.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                                                                //等待DMA2D传输完成
    1 n, F' Q4 I/ y2 E- V
  262. }$ v9 z; `2 M4 B' v$ v3 [' Y

  263. ' ^; o3 A! ~* q0 ]6 ~

  264. 4 J1 P0 P1 s9 w1 e7 `
  265. /*************************************************************************************************************************
    + M# ], i$ b8 S3 g$ H! V7 N
  266. * 函数                        :        void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)2 ~8 ?5 f, V$ ]6 p
  267. * 功能                        :        GRAM清屏(使用DMA2D)0 H- J$ p3 w4 r3 l" }  F. q
  268. * 参数                        :        pHandle:GRAM句柄;color:需要填充的颜色* g( V$ e: a/ ]) M- G
  269. * 返回                        :        无* R: j% t) {) U# c/ M. ]( ]6 g1 \
  270. * 依赖                        :        底层宏定义) Z1 R: [5 y4 G7 `* A4 d, X
  271. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    . g1 Q* _( o+ c9 L* y0 @4 M
  272. * 时间                        :        2019-10-30" u6 c& F2 Z: x& Q+ v
  273. * 最后修改时间         :         2019-10-30
    6 M( u; u7 [" ^# t( A3 q
  274. * 说明                        :        采用DMA2D实现# t3 I' m. t* j* p1 W$ ]6 u2 C. h
  275. *************************************************************************************************************************/
    9 P% V; E* f$ f- d/ w# c) G% n
  276. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color); \+ S% J3 E6 F- H1 U0 z# {9 ]/ x
  277. {
    ; V4 X! p  i9 i: f6 j; Z0 O/ Y% F
  278.         switch(pHandle->ColorMode)
    ; |; u& {& x, J9 {! V3 \
  279.         {# F$ p. O" g: }$ L( d/ i
  280.                 case DMA2D_COLOR_ARGB8888 :
    / M; w; h' k/ Y* X
  281.                 {
    $ C% q; [5 s& l. |( H
  282.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color);        //DMA2D进行单色填充; f- I7 U& S. |% ]
  283.                 }break;* T5 s9 G5 s! l9 C
  284.                 case DMA2D_COLOR_RGB888 :7 n$ D! B1 @5 c) z, T
  285.                 {
    3 z; T3 h# j% }9 M' Y& q
  286.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color);                //DMA2D进行单色填充- {. M3 t6 G9 Z. f0 V# K8 L- ^, P+ p
  287.                 }break;
    ! Q6 H- e; R, T# N  ]5 \! W0 p
  288.                 case DMA2D_COLOR_RGB565 :
    # g4 K4 y; a( {9 o5 L% \
  289.                 {  n8 C  o0 x/ i4 b- r. ?# g# Z
  290.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充7 D9 b: t  {8 @8 t7 p9 l
  291.                 }break;
    5 H5 \; @& x  v( f
  292.                 default:return;
    # @1 G+ N( B8 Z) G1 n
  293.         }7 F! j* N& d5 n
  294.         SYS_DelayMS(5);/ w- q/ d& d% t8 C1 ^- Q
  295.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                //等待DMA2D传输完成0 ?. A: H( h9 c! e3 d
  296. }
    7 y5 y/ L3 J3 Q9 G6 E) z
  297. # u- I/ C9 ]3 c5 V+ d' i( N" ?
  298. , c( x3 n. l& p8 i6 `
  299. /*************************************************************************************************************************
    5 {9 W* ~% t" @# A
  300. * 函数                        :        void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
    . \' m2 m0 K+ }1 ~6 j
  301.                                                 u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)# D" P: {. _0 ^. [" {: C2 y
  302. * 功能                        :        GRAM局部拷贝(支持Alpha). {% b! e8 S! I) \  B* G
  303. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
    7 O$ }$ [; g" W
  304.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度5 s. W  L& k, ^# ^6 n
  305.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    . y" q/ Y% W8 |8 n+ S) @
  306. * 返回                        :        无
    ) O" F; A- u! Z
  307. * 依赖                        :        底层宏定义1 A/ `$ ], ^8 R- F3 i% R
  308. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    4 t- m$ L# |2 I; L- G8 O0 E3 p
  309. * 时间                        :        2020-02-024 t. s+ k4 K5 x! v3 C  z! S
  310. * 最后修改时间         :         2020-02-02
    6 p/ u4 Q7 I3 n- R/ }' t
  311. * 说明                        :        不会检查GRAM大小,请确保GRAM
    9 _1 d& d' r& E
  312. *************************************************************************************************************************/
    1 Z* |' {" m, s2 \% B$ y
  313. 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)8 [; ~+ c) x) Z! Y( [
  314. {
    $ }3 o0 l1 B% C
  315.         u32 SourceImageAddr;        //源图像地址(通过地址控制开始的X,Y坐标)% n* F  P9 N- ^% s  R* E) c7 n' n8 O
  316.         u32 DestGRAMAddr;                //目标GRAM地址(通过地址控制开始的X,Y坐标);
    ) z' p) D% S4 Y, M
  317.         u32 PixelByteSize;                //像素字节大小
    # e9 s% O. x9 C
  318.         
    4 Z# g1 e0 Z! z
  319.         if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL). Z* z: U5 l0 f$ }8 l
  320.         {
    8 B& ^' n" N+ d( w; H4 k( Q
  321.                 DEBUG("无效的句柄,pDestHandle\r\n");3 y+ r: p) q; u) A2 T; a
  322.                 return;$ C; D- o3 P; g. S/ ^! Z
  323.         }4 x. f( t  v) o0 B
  324.         if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL)
    ; y6 k4 t( Y- H: u: i5 x
  325.         {7 ]. s% a& O! M+ Y- A
  326.                 DEBUG("无效的句柄,pSourceHandle\r\n");
    ; R0 `' n6 G$ Z, r) ~% j
  327.                 return;; x" U$ c, a# Y* e, ^
  328.         }
    1 G2 [* T0 X: U9 x( _( P. o
  329.         //源图像地址(通过地址控制开始的X,Y坐标) 计算
    8 G3 o' W# i$ @/ U2 r
  330.         switch(pSourceHandle->ColorMode)
    ( G. y; p7 u1 x* O" G4 X
  331.         {
    9 x0 N! }2 P4 F' y
  332.                 case DMA2D_COLOR_ARGB8888 :
    # U. r; }9 _; y+ m/ s4 M2 @
  333.                 {* D4 }! d! t/ o) M. \- o- u/ {
  334.                         PixelByteSize = 4;) i  {# `" ^( n1 E% \, x
  335.                 }break;1 I+ z6 o3 K: K6 T1 e
  336.                 case DMA2D_COLOR_RGB888 :
      @; C+ o1 `9 T3 F; e1 M; Q
  337.                 {
    + P9 R- V/ Y+ J
  338.                         PixelByteSize = 3;8 I$ L" ?& F& n
  339.                 }break;# _) A7 r6 V, ~
  340.                 default: //DMA2D_COLOR_RGB5650 f5 _" y# _: F' W" z1 Q: T0 ], n
  341.                 {& `0 @- j$ N" T4 \' L
  342.                         PixelByteSize = 2;
    " }/ @4 q+ g( q+ D* r
  343.                 }break;
    ( x" v1 u& X6 q. G
  344.         }$ f" g( s, p9 X* |% G3 \- h
  345.         SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize;        //计算源开始地址  g- _! U: l6 g+ L/ Q9 c
  346.         4 b% l, r' @6 y: K) I/ K& ?# N
  347.         //目标图像地址(通过地址控制开始的X,Y坐标) 计算
    7 |8 e% c1 C+ {" _- }/ @1 J
  348.         switch(pDestHandle->ColorMode): `9 v* h, d: i* _, r
  349.         {( i7 ]: M+ m! s+ @6 s8 O
  350.                 case DMA2D_COLOR_ARGB8888 :
    - [3 o3 i8 \: {) E6 H7 V( B
  351.                 {/ Z+ {* ~2 x. j. _
  352.                         PixelByteSize = 4;
    / I* e( ^/ y" R) M& ?
  353.                 }break;
    8 b& L! x! x/ \9 M
  354.                 case DMA2D_COLOR_RGB888 :
    9 R% X' @  `: i, f
  355.                 {
    ' i) ^! Z0 L" m1 j/ Z
  356.                         PixelByteSize = 3;& d9 Y6 j& C8 `. z- I" p
  357.                 }break;
    8 h9 A' I  z9 e& U- Z' g0 l
  358.                 default: //DMA2D_COLOR_RGB565
    7 {4 v1 W9 G2 c# J
  359.                 {$ d+ }1 @: _& \* J' k
  360.                         PixelByteSize = 2;% o" u# @3 \0 ]4 J$ D5 b
  361.                 }break;9 ~, c+ G3 Y: [0 R( j
  362.         }( ]! E+ z" b, I+ g6 L3 j5 E( o
  363.         DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize;        //计算目标开始地址
    , ], N' H1 L+ J* }( X# I/ B
  364.         //进行拷贝
    ' `, Z8 Q' a5 c: p
  365.         DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode,
    7 |/ @$ ]4 n; X. t" [; y4 Y5 e
  366.                 pDestHandle->ColorMode, AlphaMode, Alpha);                                                                                                        //DMA2D进行矩形图形填充(会执行像素格式转换)" G7 P9 {7 G0 k1 i7 V
  367.         DMA2D_WaitTransferComplete(200);                                                                                                                                //等待DMA2D传输完成
    / ^3 {6 M( C& p8 ]
  368. }
    ) E0 r( z  Z* }* l5 O0 M. z! \

  369. + f( g0 c: P" E, C, H: l+ z- _- Z
  370. /*************************************************************************************************************************+ f& i3 J% u0 N- V- m
  371. * 函数                        :        void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, 4 M, K& U) D( l+ o, M4 n; q
  372.                                                 u16 Height)* ]" r4 ~) i" z5 h$ `% S
  373. * 功能                        :        GRAM局部拷贝(不支持Alpha)
    ( G. l6 \8 j: W$ ]
  374. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
    - ^" U5 z# b& W
  375.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度
    5 Q8 ]! k% ~0 |
  376. * 返回                        :        无
    $ g5 o, f; p0 H+ H0 s
  377. * 依赖                        :        底层宏定义! h6 {" T+ N& i5 V" j* @4 W7 p5 e
  378. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    % n# V2 j1 C& G. V
  379. * 时间                        :        2020-02-02
    4 a& o) ~" f+ q- ?0 F1 g
  380. * 最后修改时间         :         2020-02-02
    8 D; u% B) b! b: X
  381. * 说明                        :        不会检查GRAM大小,请确保GRAM
    9 {# L& f! R; a
  382. *************************************************************************************************************************/
    3 L4 I& \& W8 F, q( p
  383. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)
    # ]* x1 u) i8 M- t2 g. S
  384. {
    ( h, O/ {( b6 h( p1 m
  385.         GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);6 Q- X, b, }* k# Q  ~* O
  386. }
复制代码
" v* u3 i$ E2 C; b
7 d  Y# `: P% O5 s
  1. /*************************************************************************************************************0 ?5 {) O* g+ Y. r" w
  2. * 文件名                :        DMA2D_GRAM.h
    * O2 |. h! u# W) Q6 Y
  3. * 功能                        :        GRAM相关操作
    : }0 ~( m& Z/ [/ F2 o- B# s& J# b
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    & `( H# n$ e+ P! y; Q
  5. * 创建时间                :        2019-10-30
    ( d$ N( ?+ a2 ]  T9 b
  6. * 最后修改时间        :        2019-10-30
    5 v- C6 O6 b: E  F8 P/ K
  7. * 详细:                        显存相关操作接口& Y. ^" U* |' r$ H/ d- c) |
  8. *************************************************************************************************************/        7 v. d7 Y+ Y6 S
  9. #ifndef __DMA2D_GRAM_H_
    ' K5 {, H5 q5 Z) o/ `' P
  10. #define        __DMA2D_GRAM_H_           3 W. |& k: x; u! f- ~$ [. S2 |% K
  11. #include "system.h"
    3 T& a" K5 H) q- p
  12. #include "DMA2D.h"
    ; z6 {6 N1 x3 l& g* h
  13. #include "SYSMalloc.h"
    / D8 |5 o7 G- M2 R* U# }! P

  14. ; `$ k( w8 r- ~. T; k& M
  15. //初始化状态id5 M; f8 c( O0 }3 P0 C
  16. #define DMA_INIT_OK                0x1234423        //初始化成功(不可以释放)4 B4 \; J# l% ]6 B4 ^( ]3 S
  17. #define DMA_CREATE_OK        0x3643423        //创建成功(可以释放)
    # l* N! q" x0 S  k
  18. / B. H8 j% ]2 |: m: i
  19. //颜色模式# W! y. N) O# u  ~1 }
  20. typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;
    $ e( q- j5 g6 T
  21. 6 }# V. d1 B( Q* V7 |+ t

  22. $ t* }- }' r5 D9 q" J3 \2 _4 n
  23. //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告)% @5 }+ G6 N5 t- A% h3 c* g
  24. typedef struct4 o- M2 ~8 ?( A$ |2 W
  25. {$ S& A+ y" W3 N7 Y
  26.         void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //绘点函数
    , @. n# w: P) e/ v% i
  27.         void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                        //填充
    + t$ S0 ^: r  L
  28.         void (*pClear)(void *pHandle, u32 color);                                                                                //清屏' q% I, j4 i- {) Y- o$ l
  29. }GDI_BasicInterface;
    / P& b- q# F" G, x/ H6 o- x
  30. ' _! @6 q, R/ f% }% Q, D4 s

  31. 5 l+ A" M+ S* X; D* u- @9 G, k
  32. //GRAM相关接口-16bit
    0 x4 }3 M3 K' a8 r" q; l9 z
  33. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;
    0 K% w& r3 `, p3 G9 q
  34. //GRAM相关接口-24bit$ ^1 X" k: K: l# v9 |/ \
  35. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;
    : q4 U2 z, T' n( T2 n0 D
  36. //GRAM相关接口-32bit, M  k/ w! n& f" F" y
  37. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;
    ) n# |2 C: I, g; R0 B

  38. # ~# x# X! }8 u, }. g0 S
  39. //所需的内存申请接口
    2 m, Q; D; P  [( I- I$ W0 S! O
  40. __inline void *GRAM_malloc(u32 size)
    ' S4 m2 V$ l; R, ?6 k1 V' k2 x1 G" e
  41. {5 A2 d! |8 P3 f' D/ R( ]
  42.         return mymalloc(SRAMEX, size);                        //内存分配(外部调用)-使用外部SRAM
    7 n! r. T2 W# H. M" X
  43. }" [! x( A+ b' k# B/ z' X  h) c
  44. : |9 Z0 k, \, w& p: v6 u6 V
  45. //所需的内存释放接口- Y. M: d; a. T7 Y
  46. __inline void GRAM_free(void *ptr)
    : u; F( {' y* O) ~) t
  47. {
    . X/ m0 W) [: `" F5 Y9 n
  48.         myfree(SRAMEX, ptr);                                        //使用外部SRAM
    + V) Q! S5 F: \1 I2 P1 g
  49. }
    " z4 r( Z: ?4 I$ _' k% P' |" r
  50. & [0 _7 b6 R8 Z6 ~( J; y

  51. 7 D  o% N2 f9 [6 C2 p3 v
  52. //显存句柄0 R. o7 u5 M+ |% b5 z( I
  53. typedef struct3 j7 L  V$ O. w; d. ~& @$ k" u* w7 o% _( I
  54. {( U' [# F8 t: S' B- a: A* i
  55.         u32 InitStatusId;                                                                //初始化状态id$ M2 e' R7 Y* ]% {2 r
  56.         u32 GRAM_Addr;                                                                        //GRAM地址: N2 j* q1 R  R) j7 z, Z) I3 b. D
  57.         DMA2D_COLOR_MODE ColorMode;                                                //GRAM显存像素格式: ]  i4 ^9 Y* ^9 _( ^* R- z
  58.         u16 Width;                                                                                //GRAM宽度7 N2 E$ C9 N! u2 @
  59.         u16 Height;                                                                                //GRAM高度
    " v0 M7 H, L6 X" X
  60.         u32 *pGRAM_32bit;                                                                //32bit颜色模式下显存指针- v+ R0 m, G5 N& {9 H* U% u. b
  61.         u8 *pGRAM_24bit;                                                                //24bit颜色模式下显存指针/ q' \" _6 U$ K1 F
  62.         u16 *pGRAM_16bit;                                                                //16bit颜色模式下显存指针
      t$ S% F) z+ W* z6 Z- f0 [; m
  63.         const GDI_BasicInterface *pBasicInterface;                //底层GDI接口
    , R& k' `$ Z* Z7 D
  64. }GRAM_HANDLE;
    1 R( l+ @( f( M9 F0 V3 j0 c
  65. * m- q) z: C. C, H/ S# |- G5 K
  66. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);        //GRAM句柄初始化(不会申请内存)' M# R4 T+ R7 L' c3 A& c2 l
  67. void GRAM_Delete(GRAM_HANDLE *pHandle);                                                                                                                                        //删除一个GRAM(会释放内存)% Y( ?  k' K) }  @6 _* I
  68. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                                                        //GRAM矩形填充(使用DMA2D)0 R) j1 \9 [1 c) k6 ^5 e
  69. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color);                                                                                                                //GRAM清屏(使用DMA2D)
    2 ?: \: v- ?0 ~2 q* i- P0 P
  70. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);                                                        //创建一个GRAM(会申请内存)
    . W+ `- B* w4 `/ _3 q3 X6 `
  71. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
    ) [* h5 n2 W* _4 n1 t# S
  72.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);                        //GRAM局部拷贝(支持Alpha)8 j5 W5 b2 X' K2 ?8 U, T- D
  73. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, 0 e$ C" h0 q" Q: F
  74.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height);                                                                                                        //GRAM局部拷贝(不支持Alpha)
    " d% Y9 a; t4 p
  75. ) m4 L% h( z- w
  76. #endif //__DMA2D_GRAM_H_
复制代码
  1. /*************************************************************************************************************4 L0 d* J( h; d& j
  2. * 文件名                :        GDI.c, N" H* o& v' A1 ?* [3 y  j$ i3 S' {
  3. * 功能                        :        图形设备接口(Graphics Device Interface)+ m$ a8 K) b5 E/ [2 ^% K
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>  [; t8 B8 c9 _* {* [  h% \
  5. * 创建时间                :        2019-11-02$ [3 b+ |! I+ r1 V7 [& U
  6. * 最后修改时间        :        2020-02-02
    * y8 S! j9 A. q& t& I
  7. * 详细                        :        STM32F7 图形设备接口; [+ t, m) Q% Z+ O) Y) Z
  8. *************************************************************************************************************/
    - O' q/ D& e( O# q
  9. #include "system.h"- ?# V) ]4 B; ~2 W) e, n- Z9 ~
  10. #include "DMA2D.h"
    * ~6 P) ^/ N( f0 n$ i
  11. #include "stm32f7_ltdc.h") @  x. q3 f1 a0 D+ W: t+ a
  12. #include "DMA2D_GRAM.h"
    9 G- z* q2 K/ M
  13. #include "GDI.h"
    ( f1 g% \# b! B2 E3 f: |: W

  14. & S& ?/ M" r( v2 \0 a2 L) X' ^* x' O
  15. //显示器Layer1 GRAM定义
    ( J2 x! _2 H) j( ]7 }# h
  16. const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle = + o' h( b- M( y4 u. x) x* v
  17. {9 K" A( Z$ C! h; o3 V
  18.         DMA_INIT_OK,) M! }8 D  G/ @- q7 _" Q. l4 L
  19.         (u32) &g_LTDC_BUFF_RGB888[0],        //GRAM地址
    * o9 S, y& d8 B
  20.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    2 L# Q! p+ w8 e8 B
  21.         LTDC_WIDTH,                                                //GRAM宽度3 `1 }4 b! ?" H, d
  22.         LTDC_HEIGHT,                                        //GRAM高度8 M* z  H7 y7 Y* P3 c
  23.         (u32 *)&g_LTDC_BUFF_RGB888[0],        //32bit颜色模式下显存指针+ m4 L: b+ m8 ^' Q; n9 ?
  24.         (u8 *)&g_LTDC_BUFF_RGB888[0],        //24bit颜色模式下显存指针7 Y' Z& u0 N) a. M
  25.         (u16 *)&g_LTDC_BUFF_RGB888[0],        //16bit颜色模式下显存指针4 d3 x- ~9 Z; }: R# y) A8 |
  26.         &cg_GDI_GRAM_Interface_32bit,
    + w9 J" f- y; w9 U8 L* R
  27.         / A$ I' u- D/ B! R( H0 V2 ?
  28. };2 C" ]5 {1 h1 D- T" r9 e+ x; r7 {
  29. / p8 L" R. l( Z7 g6 [& ]% H8 C
  30. //显示器Layer2 GRAM定义
    0 A! Y' H  ]. j7 ~" b! s5 I
  31. const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle = 4 ]0 d/ M% A# K0 n
  32. {) w$ u1 I4 t( w- @; c
  33.         DMA_INIT_OK,& g% Z. T' T4 L: s1 ?2 U7 ]" B
  34.         (u32) &g_LTDC_BUFF_RGB888[1],        //GRAM地址
    ( I# z* M9 }) o7 }1 r
  35.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    $ D  Z4 R9 R! V. d  r
  36.         LTDC_WIDTH,                                                //GRAM宽度
    # e. B# E; H6 c7 A, B
  37.         LTDC_HEIGHT,                                        //GRAM高度
    8 z% s5 x  k7 W
  38.         (u32 *)&g_LTDC_BUFF_RGB888[1],        //32bit颜色模式下显存指针! t$ c& d3 {- C5 B
  39.         (u8 *)&g_LTDC_BUFF_RGB888[1],        //24bit颜色模式下显存指针
    & V, c5 h1 ~. ^+ [( i5 |6 g
  40.         (u16 *)&g_LTDC_BUFF_RGB888[1],        //16bit颜色模式下显存指针
    9 E, e! U  F4 ]8 w+ Q5 o, y
  41.         &cg_GDI_GRAM_Interface_32bit,
    ( U- s- |- @" x# U# P: |( k
  42. };2 C5 j9 `$ v) t' J/ E( D4 V
  43. " {5 N' \3 `6 E! o) C

  44. 4 V( n% m" C* G( ^6 g% U
  45. /*************************************************************************************************************************
    2 K, ?$ W' M3 F7 t  I% n
  46. * 函数                        :        void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
    ; ]% D6 p$ a& H3 Q
  47. * 功能                        :        绘制空心圆4 V  z1 E' i* v" P- S0 Y- [4 v
  48. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色
    - z8 y* d8 `. X8 U# V( I3 t7 n0 d
  49. * 返回                        :        无
    % e2 I- m9 q, N7 a9 B
  50. * 依赖                        :        画点函数: v0 F" b, U! m$ t5 K6 ~( }. C
  51. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    0 d5 n; @- T' w8 |% B& m
  52. * 时间                        :        2011-09-20
    3 G8 ]2 m- O) X- c% c
  53. * 最后修改时间         :         2019-11-02% {6 q2 `/ n* C+ F/ Z& j
  54. * 说明                        :         无" g! A: p- z1 ^6 E1 V' N7 r$ ?
  55. *************************************************************************************************************************/
    8 O# q, a  u- c, F9 U
  56. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
    1 `$ Q7 d3 P% |
  57. {3 g3 A. S0 L; f' {- I
  58.         int a = 0,b = Radius;
    + L3 i; u+ f0 W4 m; S2 A
  59.         int di;
    2 \6 x5 i4 v: M% t
  60.         di = 3 -(Radius << 1);           //判断下个点位置的标志
    ; R" y, B# g: R9 u: p
  61. ! k9 r, e% A) D
  62. #if(GDI_PARAMETER_CHECK)                        //参数检查7 L' @! d- |8 f
  63.         while(pHandle==NULL)
    / w0 X- {2 x" E9 y$ y) Y
  64.         {0 C9 G" L7 |8 ~2 l+ |' O' o( ?
  65.                 DEBUG("无效的句柄 pHandle\r\n");
    4 r$ T- I+ ~" d
  66.                 SYS_DelayMS(1000);+ }. N7 z: q9 t) D$ F5 Y
  67.         }        
    6 I/ U: e/ A: _) N1 L2 ]
  68. #endif //GDI_PARAMETER_CHECK; A5 W( Y- W0 s$ V3 i" K& U
  69.         
    , W& P/ P5 _& B( B
  70.         while(a <= b)8 F8 l1 U6 l# w& @% k! j
  71.         {
    ( S9 ^1 f: F! ~8 ?4 l; n% y
  72.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //3           # E# }& @+ {0 B1 H. E# C$ c
  73.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color);             //0           2 X' O! c' n% h9 Q0 j/ F' h, Q
  74.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color);             //1      
    + I2 ?8 }, P  X1 n- s; A
  75.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //7           
    8 N9 ~* _& v: A7 G
  76.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color);             //2             7 l4 \7 ?' E: s1 l5 i
  77.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color);             //4               " x+ z! @9 k9 p4 J+ \
  78.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color);             //5
    : E5 D9 Y% \; O, n; w
  79.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color);             //6
    2 v6 ~, z" |- q, t7 j5 F; h( ?3 n
  80.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);             " }8 r. l+ _- O
  81.                 a ++;+ ^& P+ L0 b# z4 }1 [" m
  82.                 //使用Bresenham算法画圆     : F( v( }% T& C0 H' O' _6 N
  83.                 if(di<0)$ [6 R4 L+ e5 X
  84.                         di += 4 * a + 6;                                                                                    
    # Q  [/ B$ O& o  _" e6 E
  85.                 else
    $ u7 }  L0 m5 X
  86.                 {+ g3 r+ K  a3 R8 ?8 o5 a8 N
  87.                         di += 10 + 4 * (a - b);   
    % ?5 I. S! t% r' y, q9 Q* `
  88.                         b --;
    ; ?+ X5 P" b: B! a8 p3 r
  89.                 }                                                                                      R) O7 d% z( L3 m3 h3 H
  90.         }                                                                                 
    & ^6 M) a  d6 l3 n/ f5 g
  91. }, D9 n0 k$ P7 r$ j1 i. f' I
  92.                                                                                                                                           
    8 B# l' `) T8 H2 B
  93. ) U+ v. l& u$ g. Z1 w
  94. /*************************************************************************************************************************
    4 b) `1 Y/ \0 _! n% c6 G: i2 n
  95. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)* b0 B6 j( C  H
  96. * 功能                        :        绘制直线(可以倾斜)( ]. k' e* |$ p; C, F
  97. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色
    ) e0 Z( i+ B2 H* \; ~& S! Y
  98. * 返回                        :        无# O+ t2 I7 O, }0 Y' X
  99. * 依赖                        :        画点函数, a1 l! @- N# i* S
  100. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    - A/ P5 T* a% L
  101. * 时间                        :        2011-09-20
    1 {6 O# j$ F4 j; M5 o# H
  102. * 最后修改时间         :         2019-11-02- x* v) q+ j$ E1 {% Y& }
  103. * 说明                        :         无0 p3 a) _3 x& |9 {# a
  104. *************************************************************************************************************************/* }" D/ d( K: o$ Z
  105. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    , t) v' Q+ m* |" Y7 G! F
  106. {: C$ o8 w3 B* k
  107.         u16 t; " ^* g$ r' _+ D% F( p. C/ ]2 b
  108.         int xerr=0,yerr=0,delta_x,delta_y,distance;
    , v" M) n) d% o& S" b3 h- S' c
  109.         int incx,incy,uRow,uCol;
    + o- u2 F$ P/ j3 ]9 d" n
  110.         . \9 A2 ~& c* b, B
  111. #if(GDI_PARAMETER_CHECK)                        //参数检查+ {& \, A* g6 u: ?0 W4 b3 Y$ t( V
  112.         while(pHandle==NULL)3 _; m& X/ U  ?6 [* J
  113.         {
    7 R% Q; t$ X+ C2 k4 }
  114.                 DEBUG("无效的句柄 pHandle\r\n");
    # ^4 R( {+ h; C. \$ `1 a
  115.                 SYS_DelayMS(1000);; h8 j. K8 @" h( z: S
  116.         }        % C$ Q; q  e" ^
  117. #endif //GDI_PARAMETER_CHECK        
    6 h! \6 X" v# x% `
  118.         5 o. p" q( q7 t, v9 m' Y
  119.         delta_x=ex-sx; //计算坐标增量
    ; R" |+ D8 L0 B+ j$ V3 l# |
  120.         delta_y=ey-sy; ! B- }5 }  j1 f! z3 T1 s7 U
  121.         uRow=sx;
    ' u5 x% G* L9 H( A( [8 ^
  122.         uCol=sy;
    . J3 a7 H0 X. l' p1 B' n
  123.         if(delta_x>0)incx=1; //设置单步方向 " q2 B) ?" U( p$ ~5 O
  124.         else if(delta_x==0)incx=0;//垂直线
    2 x- @( s; L0 J. y  s8 a
  125.         else {incx=-1;delta_x=-delta_x;} ( e; V  i# Y0 I; W: s# @
  126.         if(delta_y>0)incy=1;
    4 n; C. u+ K6 d
  127.         else if(delta_y==0)incy=0;//水平线
    * f$ Q( C4 {3 ^
  128.         else{incy=-1;delta_y=-delta_y;}
    ' m- H6 C% U4 r1 d+ j; o- s. Z+ A
  129.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 5 g" i4 s& s  {
  130.         else distance=delta_y; 7 \- R' g8 S. r
  131.         for(t=0;t<=distance+1;t++ )//画线输出 4 d- R0 ^) P+ k- ^# B0 u. R
  132.         {  * Q' m' Q! s) q7 p# d0 X
  133.                 pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点 * [8 }* d/ F4 J; B- ]. L
  134.                 xerr+=delta_x ;
    6 {2 l# D- u/ J& }3 r& C4 r
  135.                 yerr+=delta_y ;                                                                                                 - v& X, D! {0 X7 R
  136.                 if(xerr>distance)
    1 h) x8 K: z( k# Q) A
  137.                 { ! ~! `, U# N; O
  138.                         xerr-=distance; - r3 R7 S! Y: y2 B1 D* _# i
  139.                         uRow+=incx; ; b( T# @3 z5 f2 w
  140.                 }
    ; ^+ t( u" R5 r/ k5 P3 B" F( G" I
  141.                 if(yerr>distance)
    1 M5 Z* N5 D  V0 Z/ c2 t7 r9 |3 m
  142.                 { 3 B( L2 M& s% A  y& Q6 k8 _0 `! _
  143.                         yerr-=distance; + [# c7 W6 R  C( x3 j3 T" f. n
  144.                         uCol+=incy; 7 }, h# s5 j0 [5 o8 ?+ j) Q9 `
  145.                 }
    # i8 D! W8 Z0 T7 X, e) W  Q
  146.         }  
    * y8 o/ E2 @! ~  W" M; a3 D8 ]) o
  147. }9 ]/ Y2 L* d  I
  148. / P" X: k6 N5 |

  149. , Z3 R) g) G5 A4 {7 `
  150. /*************************************************************************************************************************
    4 z2 S- C0 ?9 H
  151. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    * T: E" k" `- q" _5 X( R
  152. * 功能                        :        在指定位置画一个矩形$ D) _! }& j: Q; m6 R( d
  153. * 参数                        :        pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色
    ( ?0 h7 ^8 V  Z9 l9 @! O
  154. * 返回                        :        无
    8 y7 Y: }2 ^! B6 M+ ?! \4 K: Q
  155. * 依赖                        :        画线函数- j! y: [$ ~3 S1 \
  156. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    % z) z* ]3 p9 r: }
  157. * 时间                        :        2011-09-20
    5 r/ Z$ ]* i; m; Z$ }
  158. * 最后修改时间         :         2019-11-02+ a; E$ h+ q) _& ^4 N+ y6 H7 Q
  159. * 说明                        :         无+ J4 s6 e  }7 c/ f/ \
  160. *************************************************************************************************************************/! A' _9 }. q; x" L; h; r7 o
  161. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)
    6 e0 U9 M! s3 Y: O- m& ], ]
  162. {/ B0 q# w: q, k! C' z
  163.           C) n$ D; L$ E) X: j# b7 w
  164. #if(GDI_PARAMETER_CHECK)                        //参数检查
    ( }% D" O% g; j1 Y+ T
  165.         while(pHandle==NULL)! [; U9 ]$ F& h
  166.         {
    ) w+ V, D* o4 {6 B/ }3 M; [
  167.                 DEBUG("无效的句柄 pHandle\r\n");; \2 p/ I% ~  m
  168.                 SYS_DelayMS(1000);7 L5 W% n7 m( g( `/ P% i( W
  169.         }        
    . Z; X) V5 w8 T! s
  170. #endif //GDI_PARAMETER_CHECK
      [) u! O# I2 Y+ i
  171.         
    $ X4 t$ _! m$ D
  172.         GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);
    : j$ x6 C+ w% ]6 b6 h
  173.         GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);: B2 ?, ]8 K$ s8 [- c& T5 r7 O
  174.         GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);
    1 ]; S6 N7 e! f( G6 j- Q
  175.         GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);' d' H2 `2 ~# Q3 y# |3 @2 x
  176. }                                                                           
      l8 i# Z. X; q* d' `' Q
  177. ! B3 C4 A1 S: k

  178. ( y7 F) t( r0 v2 P
  179. /*************************************************************************************************************************) s- |# V' @/ y& z2 J
  180. * 函数                        :        void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)% X  D# O- T1 e# y  Y, W. G
  181. * 功能                        :        画一个2*2的大点
    " d  q9 O$ D4 G
  182. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色9 U8 _, F( t0 ?3 e; v+ ]
  183. * 返回                        :        无7 C9 O/ c6 W  w  I9 v  J
  184. * 依赖                        :        画点函数
      Z5 L8 i' H% _- p3 e" c
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>! `0 [# D5 [8 O
  186. * 时间                        :        2011-09-20& t2 e' p, d. `+ J# @6 V" }# I
  187. * 最后修改时间         :         2019-11-02! o5 }5 [3 _* Z! @# \1 u
  188. * 说明                        :         无
    0 B6 e: L) p; d! U; ^
  189. *************************************************************************************************************************/
    & ~; m, `4 s4 ]" ]
  190. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)2 t7 l6 I: g# i% [
  191. {        3 c" ]5 |5 }& F1 P: n2 \
  192. #if(GDI_PARAMETER_CHECK)                        //参数检查! ]2 r% J( o# E( Y. B+ F
  193.         while(pHandle==NULL)
    8 ]* Y5 c6 W0 Q4 l' O% l! Y- o1 K- I
  194.         {
    1 J6 a$ R) q+ P* g# m: {
  195.                 DEBUG("无效的句柄 pHandle\r\n");1 R/ }. C- ]( f! J
  196.                 SYS_DelayMS(1000);
    $ X( w3 s4 t3 h& V7 _% w
  197.         }        . i+ z) u$ H) R0 w1 }. e5 R0 `
  198. #endif //GDI_PARAMETER_CHECK
    2 s% m$ ~. T" s1 o0 Q* Y' e
  199.         
    - r) ?# x/ A% `2 S2 S; [" Z9 c
  200.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                //中心点
    4 H/ C  V. N  r. i8 R# \, p
  201.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);
    1 A( n: _5 [! A$ w  U  u* b
  202.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);
    1 E1 c( n, @9 T) [. I& ], w. M( Y
  203.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color);                           " w4 ^5 H6 S+ j+ W4 |% o
  204. }        
复制代码

( p1 B0 ^) d! R" Z# ^9 F8 C: i; O( w& ?* U5 L
  1. /*************************************************************************************************************
    ' n3 V! j, @6 ]( \
  2. * 文件名                :        GDI.h
    - b& X+ y! c; h* m
  3. * 功能                        :        图形设备接口(Graphics Device Interface)7 Q) z& w$ t  h
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>: o/ y4 J: o; _; {0 y& ~
  5. * 创建时间                :        2019-11-025 |6 I. z+ V3 f( z$ e0 v
  6. * 最后修改时间        :        2020-02-02
    - b  j& ^1 A9 g1 d1 r- w, q
  7. * 详细                        :        STM32F7 图形设备接口
    3 \5 R# j0 t4 t* T
  8. *************************************************************************************************************/
    7 Q! L/ |$ U) m0 X& X2 I3 n
  9. #ifndef _GDI_H_
    7 I7 l# C2 Q- ^& V6 E& x9 c
  10. #define _GDI_H_
    : y# Z/ E) |% }7 d6 A5 E
  11. #include "system.h"* F0 D1 t: J( n! _( A. S
  12. #include "DMA2D_GRAM.h"
    ( @( a3 Z2 D# x+ B* O; J! X

  13. 7 }4 z3 ^8 T2 L' j( j
  14. #define GDI_PARAMETER_CHECK                1        //参数检查-主要检查指针/ @' ~+ K5 e1 ^- k9 i% f- `7 p6 p
  15. #define GDI_DEBUG                                1        //调试输出
    . x' P. @3 P( V5 C. c

  16. ) W: a. q% e+ q/ g8 {
  17. #if GDI_DEBUG
    + H  x' r8 b; S' F
  18.         #define GDI_debug(format,...)        uart_printf(format,##__VA_ARGS__)8 P3 [! p, }1 V2 C6 H) O
  19. #else+ W' S( g7 k2 z8 z  j5 @
  20.         #define GDI_debug(format,...)        /\
    4 H- C7 ~2 R- \* p+ N
  21. /$ r6 M+ s" t  }
  22. #endif        //GDI_DEBUG6 J6 n3 ~# z. t4 s

  23. " O# o: Q+ L1 m0 m0 a

  24. % `) N& Q3 J: Y8 J5 h/ b- R

  25. 5 U6 R3 s: _% u  p% ^9 `" N  A) e% W
  26. extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle;        //显示器Layer1 GRAM定义' m- f1 `7 e* f
  27. extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle;         //显示器Layer2 GRAM定义% Q; {" a6 i  C: @! R) o- ^; T
  28.         $ I( s" Y  Q) D1 k( M
  29. #define LTDC_Layer1_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle)        //显示器GRAM 1  o5 S7 [6 V" ^9 ^
  30. #define LTDC_Layer2_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle)        //显示器GRAM 2) N& d6 `# w# a- {9 A! g

  31. 3 |1 @0 d$ N1 g' ?  p
  32. //GDI相关API/ d# J- j/ D( Z* x
  33. __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    : v( b4 T2 N* `$ J+ a, O
  34. {        3 B5 Y0 t+ D) u6 L
  35.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                                                //画点
    ! i1 ^! z, f0 V& d$ C3 c
  36. }        . J7 H% `0 u! w) j2 m) @$ z/ ]+ @
  37. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color);                        //绘制空心圆3 E5 E: G2 p4 l$ Q
  38. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color);                        //绘制直线(可以倾斜)
    ; u6 L* g. V0 P4 h
  39. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color);                //在指定位置画一个矩形
    ' O/ A8 u: W+ u/ P) U" l$ U
  40. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //画一个2*2的大点
    4 i* z# r0 X( z  \9 j+ \  P
  41. 0 g4 _. u# W8 G( C; Q' L; ~
  42. * Z) U+ z% p6 K8 |. L3 ]8 y
  43. #endif /*_GDI_H_*/
复制代码
; A' M& b# t/ m2 C
测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。
* g/ }8 a) r" ]5 t4 r, Z+ N7 z" f/ A( F, G5 I, k
  1. FIL *pFile;/ v) [6 R2 G3 K9 ]: p. P
  2.                 FILE_ERROR mError;: x/ C. m- I) a: I7 c  N8 \9 T# \2 h3 R
  3.                 GRAM_HANDLE *pGramHandle;
    ! Z/ A* S0 Q6 x. Q: L  o
  4.                 8 d# x) [2 c1 r. e+ b. J4 Y' C5 t
  5.                 pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565);        //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB565. E" p) t( A6 e% ]( E
  6.                 if(pGramHandle != NULL)
    - v0 z9 K; [- b  E/ c9 Z) B! f% \  |
  7.                 {
    / `. Z3 D- `! {& M, D
  8.                         GRAM_Clear(pGramHandle, 0xff00);                                                //清除显存,防止读取失败了还是现实上一次的图片+ ?0 q& f/ N5 W* p
  9.                         uart_printf("[OK]GRAM初始化成功\r\n");
    7 N% q: d0 g' Z! E" d; q7 ~2 H
  10.                         pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);, e$ s% D. R1 d  w3 X& k
  11.                         if(pFile != NULL)3 q+ G; G( N, r: P
  12.                         {& k9 H2 f1 ~4 Q9 J
  13.                                 uart_printf("[OK]打开文件成功\r\n");
    ! ?, {6 S+ T8 V9 F
  14.                                 if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中
    " n+ S3 r$ u6 R6 x* {. @: f
  15.                                 {
    3 @8 a/ x' d3 ^: D* {  V- k% \
  16.                                         uart_printf("[OK]读取文件成功\r\n");5 W; q8 A' }0 i/ P
  17.                                 }3 i8 M! N2 `# D( Y. W( Z- }
  18.                                 else
    % e) R! ^0 P8 W
  19.                                 {
    6 c: S$ b' C$ ^8 ~* ~# M( y
  20.                                         uart_printf("读取文件错误:%d\r\n", mError);
    ' j, b- h* C  H% V* b: J
  21.                                 }+ P1 O& K* P: e$ N% @
  22.                         }3 h; w' t! s: g7 N$ L
  23.                         else% V$ ~( E) q2 }9 `5 }  F' B. T! b
  24.                         {3 F2 K# E3 O  `1 ~7 d/ I! y, s; c! ]
  25.                                 uart_printf("打开文件错误:%d\r\n", mError);$ G' r$ a- V  ?; b& q2 r
  26.                         }& L5 N6 @* b) R; J1 X
  27.                         //将显存拷贝到屏幕中
    $ ^2 h; \% ~3 J8 {
  28.                         GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240);                        //GRAM局部拷贝
    3 ]$ g. M& ~0 Y+ l
  29.                 }
复制代码
4 g- X' U/ |5 }% D: X7 ^0 n5 e8 M
% q2 K4 k4 [! Q

8 B; S) U! V( q0 e& Y" N- z' U. Z2 z
收藏 评论0 发布时间:2021-12-16 21:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版