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

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

[复制链接]
STMCU小助手 发布时间:2021-12-16 21:00
DMA2D可以加快图像填充,并且支持像素格式转换。
9 b5 S, G- z$ J, k* R
+ L' w% s" f/ d, @) N
  1. /*************************************************************************************************************
    " g% A) O  X- Z% W8 l9 B4 R0 X3 ^
  2. * 文件名                :        dma2d.c
    ' h; \+ N: b# z5 R
  3. * 功能                        :        STM32F7 DMA2D驱动
    , u/ R6 s( X2 Q/ n% M5 f( Y* o. e
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ' z4 k% C+ h+ f3 [! k7 I: B
  5. * 创建时间                :        2019-10-29: Z( P$ d2 p0 M/ s% ~
  6. * 最后修改时间        :        2019-10-29% x  w4 T. W; T2 u- y
  7. * 详细:                        $ N- ^9 s5 l3 R' v5 y  j- M0 c
  8. *************************************************************************************************************/        
    / i, Y; g  r9 V8 x0 {3 _2 I; \% R
  9. #include "dma2d.h"3 Q9 l: Q9 N$ c
  10. #include "SYSTEM.H"
    , r7 B# d4 `3 o9 d2 n, M
  11. " F" G9 x0 I, n4 G! e: E: l0 t
  12. $ j/ R+ x) A: h
  13. /*************************************************************************************************************************! _1 ?2 a5 w# p3 x2 T, n4 R4 o
  14. * 函数                        :        void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)7 X, I0 ^$ M; X% t# o, l* I; a
  15. * 功能                        :        DMA2D进行单色填充( ?' c% T2 ]( F6 M0 K7 d
  16. * 参数                        :        FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;
    9 m! |* T6 ~, p' d
  17.                                         ColorMode:颜色模式;Color:颜色值5 e9 f2 E' [# ?1 y1 B# y. e- q
  18. * 返回                        :        无0 H2 @8 O) ?' Q. K! K" c8 O' I6 L
  19. * 依赖                        :        底层宏定义( x9 X  \0 q6 {0 K9 R  K# ]0 h% e
  20. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ) i  Q4 C: C' q5 Z1 P% l
  21. * 时间                        :        2019-10-29
    ) L9 z0 e& i) Q2 H1 E
  22. * 最后修改时间         :         2019-10-30. S& m& H0 ^  M8 ^. }6 x  `
  23. * 说明                        :        用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    1 G" k9 l2 `5 l
  24. *************************************************************************************************************************/% C2 U  q' Q3 \6 `7 W; r
  25. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color), @$ D( r: ?: s" h0 U! k7 v" _8 R5 u( |! ]
  26. {* x( z, ?, O2 U$ I8 U8 e& `
  27.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟. ]* `+ g3 S( H& {, z
  28.         DMA2D->CR = 0;                                                                //先停止DMA2D
    ( K! Y, K- A* Z; M" W! l* y  d9 A
  29.         DMA2D->IFCR |= 1<<1;                                                //清除传输完成标志 3 j3 y! F! ~2 V! ]
  30.         DMA2D->CR = DMA2D_MODE_REG<<16;                                 //寄存器到存储器模式
    * T" a3 t2 s) f2 s
  31.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
    + f! `; t7 T# T# j& G
  32.         DMA2D->OOR = OffsetX;                                                //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充9 ]$ }. }' m5 u# T
  33.         DMA2D->OMAR = FGRAM_Addr;                                        //目的地址
    % K( Q" V+ i1 v
  34.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    3 F! k2 T) `6 S8 i, Y) _0 u; ~" I
  35.         DMA2D->OCOLR = Color;                                                //输出颜色
    0 @( \# t' [0 K  ]
  36. 8 v$ k& t- J* j3 o
  37.         DMA2D_Start();                                                                //开始传输2 @" h1 J, [, P
  38. }
    7 c, \1 A' l# ?+ w
  39. 9 e7 Y) p$ P7 c6 I0 n9 w' T* h

  40. 7 @! V" l' l' ]& j; E# F$ v
  41. - X: H/ U0 `+ F, x
  42. /*************************************************************************************************************************6 D& Q  U7 q7 F( F; j# Y+ U3 h
  43. * 函数                        :        void DMA2D_WaitTransferComplete(u32 TimeOutMs)% o( q6 X# X  t" s1 O
  44. * 功能                        :        等待DMA2D传输完成) J; j7 u* b. o. x
  45. * 参数                        :        TimeOutMs:超时时间
    * A6 i  C! f) ?5 k3 D
  46. * 返回                        :        无2 _. }3 F# j. x' O( g: A( y
  47. * 依赖                        :        底层宏定义
    5 U9 c- e( j! f) _6 \0 }
  48. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    & S7 S" C" `- m. i4 u  \& \' x9 Z9 `6 e
  49. * 时间                        :        2019-10-30
    ) r1 I! @$ ]/ I6 T, E% V
  50. * 最后修改时间         :         2019-10-30
    ) J8 o; |$ {& i5 r; d9 k
  51. * 说明                        :        超时后会取消传输
      c: n# v' C) k3 s9 n0 }1 Y8 u
  52. *************************************************************************************************************************/; ^+ p1 ?' Y$ j, h7 g4 l
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs)/ F- O6 R6 R( R9 G1 }5 `
  54. {! D. M" \* F9 V/ S( Z
  55.         u32 timeout = 0;) A& X5 h( F3 ^1 |
  56.         
    9 p  F8 x9 Y7 C
  57.         while((DMA2D->ISR & (1<<1)) == 0)        //等待传输完成
    ' A& Y2 m: `7 U+ H
  58.         {9 s% V1 m9 E, R& q' A& [
  59.                 timeout++;
    . n  g; G  t' _0 V8 N
  60.                 SYS_DelayMS(1);                                        //延时1ms
    ) ^" f* l' p! Q
  61.                 if(timeout > TimeOutMs)
    ( f& G* v/ r- f$ Q- E9 \- D( q* d& y9 w% f
  62.                 {
    ! M; D+ H& w6 s0 y
  63.                         DMA2D_Abort();                                //终止传输
    3 j+ Q6 u% E8 j
  64.                         break;                                                //超时退出+ ~0 C" |' `2 W1 x8 m) V2 m2 M  O
  65.                 }) q7 W. Y; O3 G: p
  66.         }  ! m* p: `8 E- A0 [! h0 {' v  J3 C
  67.         DMA2D->IFCR |= 1<<1;                                //清除传输完成标志         
    3 r2 U3 |9 f- m6 P
  68. }* U/ |7 D* x! q( O

  69. - n+ |& a# I, \3 G
  70. /************************************************************************************************************************** ~1 ]% q& z9 ^! W( C
  71. * 函数                        :        void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)1 l$ B, c2 W' z: r# d# u0 M& ]
  72. * 功能                        :        DMA2D进行矩形图形填充
    9 H. j1 ?% o, A# {" w9 p( H6 S; Q
  73. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);# V' k9 G: h, @0 n
  74.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
      y" x$ I6 N# K
  75.                                         ColorMode:颜色模式
    3 h2 A6 y$ z+ F2 U8 U$ p/ U
  76. * 返回                        :        是否设置成功8 T. Y( l6 [+ C6 A
  77. * 依赖                        :        底层宏定义7 z8 \- ]7 ?3 L$ \  Z+ i. m4 u& {
  78. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>7 n* a: I- R# [
  79. * 时间                        :        2019-10-28
    0 o2 A7 K' b9 j4 _# g% {; r
  80. * 最后修改时间         :         2019-10-28
    $ {6 {  n) g+ P+ h
  81. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    5 E9 E! c) N* @# ?
  82. *************************************************************************************************************************/
    1 ~' S- W  t1 t1 ?- K
  83. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)
    * W; ^. U7 h5 [9 G3 q1 ]
  84. {
    ( x- i! o" B) X0 e( @; R0 ^* K: L
  85.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟! M* \4 v% s9 b. |9 n1 r# D
  86.         DMA2D->CR = 0;                                                                //先停止DMA2D
    / ^. O8 q, b6 E
  87.         DMA2D->CR = DMA2D_MODE_MEM<<16;                                 //存储器到存储器模式9 G5 p! Z( }) f
  88.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    * m) j0 h3 X$ m  V0 Q8 ^
  89.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式/ N* e8 u( y0 v8 _+ u  ^
  90.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址8 b1 t+ I# h5 ~
  91.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移 . t" A, u' g7 }& [( }
  92.         DMA2D->FGPFCCR = ColorMode;                                        //源图像颜色格式
    # o  P5 H7 b6 ~4 b1 y# j' Q
  93.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    , ?# {3 I! p- s/ n
  94.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
    1 ]% C9 f4 V6 G/ q( R6 T' M
  95.         
    , I5 |) H% P, @  |
  96.         DMA2D_Start();                                                                //开始传输
    ! K1 Y( }4 c* H& z1 J6 V; Y
  97. }3 S) {5 R% w/ q, {7 p$ N0 w* `! [
  98. & S5 y7 ^5 O3 ^1 y
  99. + i+ f% g: X# x* c& F1 O
  100. /*************************************************************************************************************************
    : w$ t" w  H3 C' j$ K% a
  101. * 函数                        :        void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, : ?) @8 m. B  b" \, N1 h- S
  102.                                                 DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    4 m7 q; P, k' b9 [. f
  103. * 功能                        :        DMA2D进行矩形图形填充(会执行像素格式转换)
    $ S' Y% F& l7 l4 b. ]: F  e
  104. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);( ~( |8 o- m% a$ m% v
  105.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    " A0 T$ F" @! E6 N8 g3 c
  106.                                         SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式
    # N  U( w7 E  ^; p8 ~- X
  107.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    1 R" A9 o* Y! R- `" v7 D! ?7 R
  108. * 返回                        :        是否设置成功& k, d4 B. O4 j" r" p* a2 x
  109. * 依赖                        :        底层宏定义
    6 `; J. _) \4 ?
  110. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>7 `0 P. |6 j/ o: x$ Y2 U
  111. * 时间                        :        2019-10-28' l. l/ z3 n( |; H' s
  112. * 最后修改时间         :         2019-10-284 }2 _  c  e/ W5 N* D
  113. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束2 e# G; M5 q8 {. @3 y
  114. *************************************************************************************************************************/
    0 Z0 b4 P% M9 [) K
  115. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, 7 f6 }& @0 ]* i' B& L
  116.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)4 ?' X( v4 i. T( z5 B
  117. {! R" a- P: n# H; y" h- w1 Z: E
  118.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟8 t9 K4 @( Y1 E7 l
  119.         DMA2D->CR = 0;                                                                //先停止DMA2D
    5 U4 @! q* }- [/ t( E& |7 N7 |% w/ M
  120.         DMA2D->CR = DMA2D_MODE_MEM_PFC<<16;                        //存储器到存储器模式-激活PFC4 f  V  i! x$ E
  121.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    ' O3 ^8 O% a+ m/ Z; ~( o: |4 J$ v
  122.         DMA2D->OPFCCR = DestColorMode;                                //输出颜色格式
    6 ]2 K% r/ c  O
  123.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址6 C* X$ K6 v, i4 ~' \' ^
  124.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移
    6 |, {* S$ |- d" L# A( t
  125.         DMA2D->FGPFCCR =((u32)Alpha << 24) |  ((u32)AlphaMode << 16) | SourceColorMode;                        //源图像颜色格式
    + ]9 H( E/ ^  C. `1 E3 m. p( h
  126.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    % q. Q/ O1 c. U. E4 [! {) x
  127.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
    * l9 Q: `) [6 G, U
  128.         
    / l& r2 Y7 p5 I: b
  129.         DMA2D_Start();                                                                //开始传输. Y6 T: u) f/ s" ^. b
  130. }
复制代码
  1. /*************************************************************************************************************# ~6 y$ l7 Y3 g  s
  2. * 文件名                :        dma2d.H
    : E* ~- D; T/ r; S
  3. * 功能                        :        STM32F7 DMA2D驱动
    ) l& R( B5 F" [! x
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>0 |& T9 ^) E2 _9 [( ?0 Z
  5. * 创建时间                :        2019-10-29% ?  _" |/ T. I/ r5 A3 Y& P0 X# m
  6. * 最后修改时间        :        2019-10-29! s9 O  W7 ~! ~# s3 k' D
  7. * 详细:                        & I8 g5 t; ^$ {# j7 Q% T: V, l( V) W
  8. *************************************************************************************************************/        
    6 E. P2 c, [4 O4 s! B& d
  9. #ifndef __DMA2D_H_3 }. b( |" D8 e4 v! Y1 J
  10. #define        __DMA2D_H_           # Q* J8 c/ P8 o. j) F
  11. #include "system.h"/ P2 M8 s: C: R3 `* k
  12. * H6 l8 y7 ^( ]1 N
  13. ) l0 P( u5 h( G( r
  14. typedef enum! _. \3 d# e) v+ X8 C
  15. {' t2 o; M  M4 V# L
  16.         DMA2D_MODE_MEM                =         0,                //存储器到存储器(仅限 FG前景色 获取)
    6 z% q$ A, v) u! ^' \
  17.         DMA2D_MODE_MEM_PFC        =        1,                //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)
      M' U  l0 x7 w# z- X6 [0 P; W
  18.         DMA2D_MODE_MEM_MIXED=        2,                //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)
    $ W) ]8 L1 G( e  r
  19.         DMA2D_MODE_REG                =        3,                //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)  O. f$ u% w2 t4 x1 S& U
  20. }DMA2D_MODE;
    . j7 L7 R6 ^+ s' @6 j
  21. 5 f* A0 o9 _2 g. E$ K. B  @7 X; P
  22. //颜色模式
    ) @8 {  O4 \7 P; A4 Z& ~
  23. typedef enum
    % r6 W5 v2 e& ^4 T
  24. {( N7 ^: }+ }. z- f1 n0 w0 G
  25.         DMA2D_COLOR_ARGB8888         = 0," o* @. G: D- d) b- p( J3 a  S
  26.         DMA2D_COLOR_RGB888                 = 1,3 L1 }" Z  X0 m0 {/ v7 j/ j
  27.         DMA2D_COLOR_RGB565                 = 2,8 U" U- U: ]3 F. E. _
  28.         /*DMA2D_COLOR_ARGB1555         = 3,
    5 m2 R, i+ b  n, u* w# m+ s
  29.         DMA2D_COLOR_ARGB4444         = 4,% r' g$ J# A0 r  _+ ]/ c- l$ y
  30.         DMA2D_COLOR_L8                         = 5,        //8 位 Luminance
    - s( j3 m( H, ~3 E0 u7 k0 f3 D
  31.         DMA2D_COLOR_AL44                 = 6,        //4 位 Alpha,4 位 Luminance
    * }, p) h- u0 e# I
  32.         DMA2D_COLOR_AL88                 = 7,        //8 位 Alpha,8 位 Luminance
    ; l- a& v. B4 I3 E2 P7 d
  33.         DMA2D_COLOR_L4                         = 8,        //4 位 Luminance
    & h. D1 ^. S, z+ n
  34.         DMA2D_COLOR_A8                         = 9,        //8 位 Alpha9 Q+ O# z4 a6 l9 k' j/ l- T
  35.         DMA2D_COLOR_A4                         = 10,        //4 位 Alpha*/
    " o2 H# b7 B4 F8 B7 A- G
  36. }DMA2D_COLOR_MODE;* `$ n! E* a! _) @" o
  37. % p: n+ G" [# a0 y6 n# c
  38. " ]" X! V/ o* \2 g( D$ M
  39. //Alpha 模式
    2 u. K* d! F9 m$ L0 M
  40. typedef enum
    + v4 }, h; k9 n
  41. {7 l. r& J' G3 }
  42.         DMA2D_ALPHA_NULL        =        0,//不修改前景层图像的 alpha 通道值, }" w; c0 w& K( b
  43.         DMA2D_ALPHA_REPLACE        =        1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]
    - D/ }) I7 J$ Z& i, _/ t. |& ^
  44.         DMA2D_ALPHA_PRODUCT        =        2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积# E) W" o# n! g' ^- X
  45. }DMA2D_ALPHA_MODE;$ P6 x) h1 n1 U% b9 {
  46. # N, B( A) F  \1 L& ]' |) k7 e8 z& S
  47. ! x# X0 Y+ t5 R% T' O% d4 ^
  48. __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;}                //终止传输4 `$ w$ P2 I" l- M
  49. __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;}                //挂起传输
      o$ Q# M9 Z* U) y7 Y9 o7 F
  50. __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;}                //开始传输
    1 z: P  x. R3 f

  51. + F5 Z) a# {+ V/ s5 O
  52. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color);        //DMA2D进行单色填充5 b/ B  F# m" {
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs);                                                                                                                                                        //等待DMA2D传输完成4 z5 d, f3 p+ U3 Y) T
  54. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充
    . O# g8 Z3 k% E* |$ b5 K1 u& P
  55. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, ; Z8 {3 S0 L+ b6 |
  56.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)- J' H3 G# }6 s* R) b* O
  57. #endif //__DMA2D_H_
复制代码
  1. /*************************************************************************************************************6 z9 E$ b6 \& K6 {* ?. E) Y
  2. * 文件名                :        DMA2D_GRAM.c
    + g( @- q$ ?6 x+ n! W9 }! A
  3. * 功能                        :        GRAM相关操作' B6 z, ^2 M  z" N3 E
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ! ~4 E4 X7 `, `# i3 L
  5. * 创建时间                :        2019-10-30
    % s2 L- e8 P  _! B7 k+ w
  6. * 最后修改时间        :        2019-10-30) d# K5 M1 v* Z% M2 F, H
  7. * 详细:                        显存相关操作接口
    ) c" @3 b6 x  v3 t6 [% D2 P; A" r3 ^
  8. *************************************************************************************************************/        6 h! K9 m  a- r1 b
  9. #include "dma2d.h"
    $ T& o4 e7 H0 E( Y
  10. #include "DMA2D_GRAM.h"
    & ~8 y1 a0 H- y6 K2 s# z
  11. #include "SYSTEM.H" 5 M0 Y: l* y4 U+ u& D
  12. , [9 e* A. z  Q5 h) S
  13. //基本接口1 A& _" {  [8 ^* y
  14. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //32bit色彩GRAM显存画点: ^9 d9 ], }% ]1 r& Y+ d
  15. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //24bit色彩GRAM显存画点
    / D4 J$ M+ u# B9 z1 z. W
  16. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //16bit色彩GRAM显存画点
    + Q) K9 F5 ]2 j6 y" [
  17. 9 @- Z" L: ^+ p( V+ T/ V. |

  18. 3 v( r* x' ]. d  g" Q
  19. //GRAM相关接口-16bit% k% Q& [& W8 l
  20. const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit =
    ' J  u* W! s! X" l' p
  21. {
    ( A: f9 r/ O8 p' n
  22.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit,                        //GRAM显存画点(RGB565格式). U/ h% g( i' ~7 I* x3 b9 p
  23.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    & K: a  H  [- K, m! N2 k7 x
  24.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    / z4 J; U9 t. y9 P# R- M
  25. };/ F/ R- F5 R* O4 [0 _5 s

  26. ! d3 ~* @: @7 _2 `- a
  27. //GRAM相关接口-24bit
    1 {$ U8 ~  v! Q6 I8 o& `
  28. const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit = % F) Z$ p) o/ V/ _2 @8 A% d% G
  29. {4 V: Z  c, z- p
  30.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit,                        //GRAM显存画点(RGB888格式)3 q9 M* @- ~3 a* [
  31.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    % t- e' w- [9 N" ?, |
  32.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)  E! n. h8 q3 ~5 B
  33. };) _" Y6 L/ `% {: G. _

  34. 5 D8 c7 \0 f5 l6 ]
  35. //GRAM相关接口-32bit
    8 q/ j  x) b4 n2 e) a" V8 e
  36. const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit =
    $ _- }1 `5 I2 w7 u" ^
  37. {
    8 [5 I; w. o* O$ p$ d! }
  38.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit,                        //GRAM显存画点(ARGB8888格式)6 H& y/ a+ s5 ]" b% }# S& f
  39.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充0 C; |$ S; a9 b$ l5 @$ o
  40.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    ! h) Q: |  u- m7 k3 d3 k
  41. };* I- M5 O1 n  G
  42. ' D4 Z# q. C& m" m/ D; \% b0 e
  43. /*************************************************************************************************************************
    5 ?* o7 D( J8 R: F9 N4 k" s% t) u
  44. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    + o$ _$ Q9 H7 ~" Y
  45. * 功能                        :        GRAM句柄初始化(不会申请内存)) \( |2 X1 l5 }5 v1 C6 W
  46. * 参数                        :        pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式* u& Y5 z( o& ]! n9 C7 D
  47. * 返回                        :        无
    ' l! i9 s8 ?2 Z8 y% k
  48. * 依赖                        :        底层宏定义
    ( _' x+ `4 q. M, z3 t6 c
  49. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ( \2 v# s& A- j. p
  50. * 时间                        :        2019-10-30
    " J( q1 U3 f+ m
  51. * 最后修改时间         :         2019-10-30: D& U0 r* |$ N1 V0 R7 ~* H& }
  52. * 说明                        :        初始化显存
    ) y6 H7 ^8 M9 z6 T
  53. *************************************************************************************************************************/" ~0 P/ N4 \$ K$ ~7 e5 |; k' N
  54. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    - \! \& `$ h6 v, O
  55. {
    ) v# l9 n' q# \, W5 x$ W
  56.         while(pHandle == NULL)
    ; }, x& [' t, n9 |& i! K5 q  l; f
  57.         {6 h0 v0 R- G- y* J/ v) ^( `
  58.                 DEBUG("无效的句柄pHandle\r\n");$ ]8 i. r: ?7 B% Y7 {
  59.                 SYS_DelayMS(500);0 B" q- g9 G! z: w
  60.         }
    4 {1 f1 e& g5 a3 L4 t
  61.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
    7 o9 P- y  I7 y- D0 p
  62.         pHandle->Width = Width;                                                        //GRAM宽度
    ( A& G+ T. G0 z0 j0 s$ A9 o
  63.         pHandle->Height = Height;                                                //GRAM高度
    & m5 U; F0 J! A( Q6 w: P
  64.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
    * M' t/ @/ p. C0 V, M
  65.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针% @0 d; k0 t8 v, \7 _
  66.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针8 D* \" M4 g. |! o6 k& s
  67.         //像素模式2 L" j& l) J2 m! r/ B' u
  68.         switch(ColorMode)( @5 k& d  Y( a7 A) u% I
  69.         {0 H2 t. L' s3 A# x# K0 b$ ~
  70.                 case DMA2D_COLOR_ARGB8888 :5 h; Y( M; b& D) y# {$ \( P2 B
  71.                 {
    & b5 ^9 e3 y3 C- N, e. x6 t
  72.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;( f0 O0 s9 l# r: A0 I! e
  73.                 }break;
    1 P7 {& E' n0 H2 e! _$ p7 O4 F1 _& I
  74.                 case DMA2D_COLOR_RGB888 :9 u  ?9 C* I0 Q: {/ S# ~
  75.                 {2 i; M5 t) @) U* A; G
  76.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;9 K: U  h+ M8 f& _5 R
  77.                 }break;2 {1 ^7 e) h3 v5 d# H! Y9 [% `7 C
  78.                 default: //DMA2D_COLOR_RGB5656 U$ ~* q" e" `
  79.                 {
    . I- L1 n1 j3 B6 O8 a+ G
  80.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;/ f  }, t7 r4 V* s% L
  81.                         ColorMode = DMA2D_COLOR_RGB565;
    ' a& ^% ]! a; Q) j
  82.                 }break;, Q# V7 v  g2 x) E( @: D, I+ p
  83.         }4 a9 x. d3 L8 B( i
  84.         
    2 X" _: h! U) }: I
  85.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式
    $ T- U: K# L8 O# w9 R# c  v
  86.         pHandle->InitStatusId = DMA_INIT_OK;                        //初始化成功7 W% c0 s# j1 |* p' m- \8 J$ f
  87. }6 H/ y9 `9 ~' h3 t7 ^

  88. / a# `9 m1 O/ K7 r/ D8 i0 [6 T
  89. /*************************************************************************************************************************; L- x/ l2 H. x6 s% n! q  h
  90. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)
    1 F2 P: q. u* A$ z% O0 F. t/ E
  91. * 功能                        :        创建一个GRAM(会申请内存)! C% S3 m+ j; P; `* T# s  N
  92. * 参数                        :        Width:显存宽度;Height:显存高度;ColorMode:颜色模式! Z) b% i+ \2 e: i
  93. * 返回                        :        NULL:失败;其他:GRAM句柄
    4 S8 P+ o) r. P, K6 t/ L$ B7 ]* H
  94. * 依赖                        :        底层宏定义
    ; U1 u3 R$ f2 k4 g' c8 B
  95. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>) X% D: X/ E' [' k% p1 c& @$ c
  96. * 时间                        :        2020-02-02) b0 z/ R# Y/ `. z; Z, _8 m1 a
  97. * 最后修改时间         :         2020-02-02- l5 _8 B# i0 Y* E3 L% H5 X
  98. * 说明                        :        初始化显存& v5 x* k$ X( D
  99. *************************************************************************************************************************/0 C0 u7 A- r+ q5 h  P0 ]" r; }
  100. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    1 f& E9 U3 u' J1 F* e
  101. {* x7 G: D0 r3 N+ N
  102.         GRAM_HANDLE *pHandle = NULL;( Z( \, ?3 W: n8 Y5 ?" n
  103.         u32 GRAM_Addr;$ M& J0 C: `6 S  R' f/ ?
  104.         - `+ D' d: O; D
  105.         pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE));        //为句柄申请内存
    ( I$ h' v" Q, ?: O
  106.         while(pHandle == NULL)
    . W0 y5 E: [% l. j0 x
  107.         {
    4 g; D2 P- |& f; m
  108.                 DEBUG("无效的句柄pHandle\r\n");( h, r8 y7 W6 `. r7 L6 J
  109.                 SYS_DelayMS(500);
    + j  H" G0 j* u$ u9 E: _
  110.         }- M( U1 j) _9 W2 o% H& i
  111.         
    . [' D  Z! \: e" k
  112.         switch(ColorMode)
    8 u% M8 p- w: |0 g
  113.         {
    9 ~0 @& c9 y  Y; D- [2 H
  114.                 case DMA2D_COLOR_ARGB8888 :7 M$ U2 L+ n' K
  115.                 {  ?& Q0 R/ E4 B/ c
  116.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存) e5 p' F1 N2 E& M, ?1 u) H+ w
  117.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
      K$ N4 G# o0 @
  118.                 }break;
    3 J4 b9 B% l) l3 I4 }( o
  119.                 case DMA2D_COLOR_RGB888 :
    # M8 e9 @; @0 U% q2 c% g
  120.                 {' q% V. k0 M' H$ R2 e# r  U
  121.                         GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height);                        //为显存分配内存5 L1 ^8 h* u) z* ^; H
  122.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;% m; R0 e9 M  ^  j, ^5 m5 k( `6 ~
  123.                 }break;
    " F8 r2 x8 a' S
  124.                 default: //DMA2D_COLOR_RGB565
    3 k0 |7 }  [4 G7 \+ ?6 t" f
  125.                 {; b' x4 ?/ l1 h( \
  126.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height);        //为显存分配内存' y- ]& |( y) F+ M0 e2 U
  127.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;, z8 d4 X: C9 S8 r
  128.                         ColorMode = DMA2D_COLOR_RGB565;
    5 b5 ]# c6 Q2 C- W) _* _
  129.                 }break;- L5 G+ R) i- L9 w1 d0 D
  130.         }
    ; Q: O; ?# h8 |4 v8 o
  131.         ! V0 Y4 S+ @; [3 ~% b6 f' p
  132.         while(GRAM_Addr == NULL)# B. B5 [& X: {0 i8 p
  133.         {
    # ^7 R" v# c% ?3 L7 |
  134.                 DEBUG("显存申请内存失败\r\n");
    1 ]3 q, ~& T' u8 e. [' U  S
  135.                 SYS_DelayMS(500);4 E( ?# U# V/ C5 l  N
  136.         }
    " W/ _. q# {# ?) Y
  137.         
    * V  M4 h  [9 G# B+ L6 ?
  138.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
    ! i. k$ O, V7 O# H9 @
  139.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式: L! e0 v( N  W6 }9 `- m: j8 I
  140.         pHandle->Width = Width;                                                        //GRAM宽度
    ' A& A) f& T6 l. K/ Q4 r1 {0 f
  141.         pHandle->Height = Height;                                                //GRAM高度
    # L  K' x0 N! y5 h8 h
  142.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针0 E! q3 w: B' F8 _# s6 p6 w: Q$ O* {
  143.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针$ r7 N' a3 }8 T4 i
  144.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针% e2 F& k  q: J7 I4 S, U; o( N
  145.         pHandle->InitStatusId = DMA_CREATE_OK;                        //创建成功
    . u* }5 Y; j* }
  146.         + R5 O1 Z' M; g
  147.         return pHandle;
    % o+ Y) o( {- e3 f+ E- P
  148. }1 n3 s5 F7 l3 {
  149. & Y. |/ l; ^9 Q& @+ I1 J5 V6 a
  150. * I/ [( {8 f2 A' l( b
  151. & |& f2 H& _; q8 q
  152. /*************************************************************************************************************************
    * D7 v1 \; L" l8 I" ?
  153. * 函数                        :        void GRAM_Delete(GRAM_HANDLE *pHandle)4 _; E2 F% D3 d1 k, }5 G2 L
  154. * 功能                        :        删除一个GRAM(会释放内存). K- w2 p7 V* L2 @* @, W
  155. * 参数                        :        pHandle:GRAM句柄3 U3 ?" X5 b4 s6 I8 x* x
  156. * 返回                        :        无
    6 M5 i' J/ t: R
  157. * 依赖                        :        底层宏定义
    # O7 [0 ?  S/ n. i+ f( v  v/ [
  158. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    # }: R8 \& \8 S* l, @
  159. * 时间                        :        2019-12-16
    " g. ^/ W5 `2 K; T/ [; v
  160. * 最后修改时间         :         2019-12-16# o$ g& F$ ^- s# \1 h, L5 u
  161. * 说明                        :        用于删除显存,释放内存1 @: d( r7 ?1 F* ]3 R/ @
  162. *************************************************************************************************************************/+ b8 y. z* y  `9 T5 ]
  163. void GRAM_Delete(GRAM_HANDLE *pHandle)
    % R+ ~+ U1 {$ J+ j. z
  164. {
    0 g# d; M$ G( i) c4 T( Z. A/ a
  165.         if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)
    / b, |0 y' k% l2 [1 O2 g
  166.         {) J; O, w# t" L
  167.                 if(pHandle->GRAM_Addr != NULL)
    9 {0 T  z7 P1 K! }* Y& w
  168.                 {0 a  B$ Z9 V; O% w1 P. ], s# n' S
  169.                         GRAM_free((u8 *)pHandle->GRAM_Addr);                //释放显存内存
    9 G$ \- j: e/ W# ]# h9 p
  170.                         pHandle->GRAM_Addr = NULL;) s- q7 D8 N4 O" c6 Z4 N
  171.                 }
    $ A! Y. ]8 [: o
  172.                 pHandle->InitStatusId = 0;
    * U) v. l: k( D
  173.                 GRAM_free(pHandle);                                                                //释放句柄内存% I) J; {, y$ j% S
  174.                 pHandle = NULL;
    ' [+ v1 l3 g* o0 Y
  175.         }
    + B2 T' ?4 U& I7 A% Y
  176. }
    0 ~* {: K5 @" o- z; K, \- L

  177. # k; ?% i. B, ^- w3 u$ F, o( A

  178. 3 f) N3 J; A/ ~! H
  179. /*************************************************************************************************************************8 p1 S2 ^, _# p$ t- M
  180. * 函数                        :        void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)* }: \8 K: R+ {+ P- |+ n- A* K: o
  181. * 功能                        :        32bit色彩GRAM显存画点
    ; U+ h- X& n2 T7 `3 _" ?
  182. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    ) U! U. h; i7 q4 V9 k8 v: }
  183. * 返回                        :        无
    $ j  X. v. z1 d3 c$ x
  184. * 依赖                        :        底层宏定义
    $ N8 Z8 k- h  `# ?. }6 Q6 u! \4 }
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 o6 l+ z! E7 W  C! v+ L( k- f2 \9 ~
  186. * 时间                        :        2019-10-30
    0 l: p8 F* X1 I) ]- I* ^
  187. * 最后修改时间         :         2019-10-30; F; l4 d% t: g5 ?
  188. * 说明                        :        在显存中绘制点( j, _, P: u7 e% M! X' q) T
  189. *************************************************************************************************************************/
    , l7 p" {& w. Z1 J" J+ k7 Y
  190. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)( d! W: ^7 o5 z2 h# @  ]
  191. {* w% F1 p$ o* b. ~0 K
  192.         pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
    8 f9 W' Y" b& w- y" G; T) w
  193. }
    9 S- ^8 S* B$ ^8 h9 ]; P
  194. 4 v, a. q% _2 b  P4 D8 W4 C* s
  195. ) E" j( a5 v' C( O! q. Q" @
  196. /*************************************************************************************************************************  f) \  @" F: O- y  J6 S
  197. * 函数                        :        void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)0 u0 ~7 E' |0 B' C7 `) D8 E
  198. * 功能                        :        24bit色彩GRAM显存画点
    4 }8 f0 y" @4 s% s: Y$ \1 z; B0 F& R
  199. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色  G( ?5 _/ u0 _+ q# U5 |3 ?
  200. * 返回                        :        无
    5 d5 u$ J- \* K5 }4 X/ w
  201. * 依赖                        :        底层宏定义
    * Q+ S9 `, G+ M: ~! W; \4 x
  202. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ( E5 O! Y5 C* o/ ?* o9 E
  203. * 时间                        :        2019-10-308 i4 D% u- |3 n: @- j( Y0 r8 z
  204. * 最后修改时间         :         2019-10-30
    1 b; t8 L5 s0 V4 Q, a
  205. * 说明                        :        在显存中绘制点
    ! R1 D, n, R/ \8 ]
  206. *************************************************************************************************************************/& Y+ e( g5 p8 N# v; X5 O
  207. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    * M0 t0 a8 r4 g0 a) R
  208. {- o  X. D5 \0 e
  209.         memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);
    2 U6 Y5 I- g/ G7 m1 Q" R
  210. }
    , X  S, V( a  h/ Q3 _! l$ E( K
  211. + n' r4 X( \- w; q
  212. : W4 Z$ W3 n) e% h$ C" \  ?
  213. /*************************************************************************************************************************$ A* {3 P9 h, g& {7 F
  214. * 函数                        :        void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)4 e8 n% k. Y9 u% r: e. ^
  215. * 功能                        :        16bit色彩GRAM显存画点- J7 L# o" a( S/ G" E, M- R5 d; s
  216. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    & i8 T: H8 B3 a5 j6 j( R* o
  217. * 返回                        :        无1 q8 l# S6 Z7 d6 E4 {/ o8 ~( ]9 X
  218. * 依赖                        :        底层宏定义- y, s% Q& g+ s5 J/ c% x+ t
  219. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>! @& B5 E: w6 ?. m. a* P
  220. * 时间                        :        2019-10-30# h' I; D' m8 P* s4 u& |8 ?
  221. * 最后修改时间         :         2019-10-30
    7 A* F. R5 v" Y0 s8 O0 Z6 L; S
  222. * 说明                        :        在显存中绘制点
    - w) ^) t* R+ ?9 o
  223. *************************************************************************************************************************// K( P' k  O* s0 y( y* H& A0 g  p8 _
  224. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)/ q' `/ Q- b0 r6 g
  225. {* V4 @  L; C, i) o3 W
  226.         pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
    ) i1 v; M* k1 Y& r/ q
  227. }
    ! m, s+ O, r8 E( Q

  228. $ r3 e$ e, w; G! u

  229. % n. T( Q* B3 e

  230. 2 p3 f: r' k/ u$ W4 x$ Z' S
  231. /*************************************************************************************************************************
    % u9 X1 ?3 v8 s) }$ o
  232. * 函数                        :        void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)        0 J3 D4 G  N0 ^
  233. * 功能                        :        GRAM矩形填充(使用DMA2D)1 }8 v# v$ O# G2 K
  234. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色
    $ u7 r( [1 \' D0 \
  235. * 返回                        :        无
    / G& O! [6 u: n+ K' v; S& s. g, ^
  236. * 依赖                        :        底层宏定义) G2 o" A  h& }( p
  237. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>2 g$ A+ R% P, {) i" A, w
  238. * 时间                        :        2019-10-30+ \  n- j& E- M8 T1 I& k% V
  239. * 最后修改时间         :         2019-10-309 N& a. a, \/ f! d/ u! d6 H1 T, x: \/ J
  240. * 说明                        :        采用DMA2D实现: G5 n4 B+ f7 X* Y5 z9 R8 ]
  241. *************************************************************************************************************************/
    3 w- x: P: ~- Q
  242. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)
    + Q) |4 Q/ {' M% n% i
  243. {
    2 u5 ]* x; s; B1 Z
  244.         switch(pHandle->ColorMode)
    2 X8 H; I: \1 `1 W8 `
  245.         {
    / X: b9 t6 X  _0 n( x  @+ z5 V1 R
  246.                 case DMA2D_COLOR_ARGB8888 :: ?- `+ i. K2 y5 q" e: U# F6 @! x
  247.                 {  O2 T# p+ N7 t- V& i0 x
  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进行单色填充
    " d; E% f9 k  b
  249.                 }break;4 f2 \5 Q  ?8 w0 O, X+ g$ i0 X
  250.                 case DMA2D_COLOR_RGB888 :
    . l; \; {! G( X! A( _/ c4 f% G$ v
  251.                 {8 O# n9 @. c2 v% ?
  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进行单色填充( Q: J: [3 {/ _" [, v8 p
  253.                 }break;3 U5 h8 z7 W" F. X& R7 o
  254.                 case DMA2D_COLOR_RGB565 :5 k! U& Q3 G9 Y& b+ w5 p! M; ^( T
  255.                 {
    5 Q! Z' Y/ I3 z# j$ L
  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进行单色填充9 L+ r# q9 A' [& S2 o
  257.                 }break;
    + k* [6 i& l( H
  258.                 default:return;
    * J; @" t9 b0 w6 Q3 P/ C
  259.         }
    7 \! R6 M2 c1 g/ ?% ~! }
  260.         
    - \8 P! o6 `: l: Y3 s
  261.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                                                                //等待DMA2D传输完成
    , J5 ]2 U  y% `- k4 S. X
  262. }
    3 }5 b" ~" X* g( m. ^

  263. $ Q& o5 n. v' K4 I9 `+ m" ?

  264. # n* ]6 n0 ~4 y& C) Q  I
  265. /*************************************************************************************************************************
    ' I# p9 ]* m  ]; i4 ^- W
  266. * 函数                        :        void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
    / C9 `6 U1 Q/ [: b
  267. * 功能                        :        GRAM清屏(使用DMA2D)
    ( a3 O+ m" o+ t: |
  268. * 参数                        :        pHandle:GRAM句柄;color:需要填充的颜色
    5 G' ?: @7 n& _' g0 y
  269. * 返回                        :        无& q0 x0 i4 w5 H" R. q3 t8 u7 Z8 P
  270. * 依赖                        :        底层宏定义
    0 e) C6 g6 S3 ~$ e% f5 a
  271. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>. \; [# h# g" e) F8 A: r% u
  272. * 时间                        :        2019-10-30. l6 ~% F9 _2 Q; O
  273. * 最后修改时间         :         2019-10-30
    $ K# u' ]  N" \) j4 e
  274. * 说明                        :        采用DMA2D实现
    2 G$ i- N3 b+ j8 g9 i- g2 r
  275. *************************************************************************************************************************/
    7 x/ B' u" r( [% g* p, p0 c5 ~
  276. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)1 d3 {/ h2 s- M
  277. {
    4 e* d) g- M2 t2 ?: v5 b8 M8 w
  278.         switch(pHandle->ColorMode)
      N. ~, k: R/ u6 E% N+ v
  279.         {
    . `, ~/ k; a$ J& k  K; X7 d& T
  280.                 case DMA2D_COLOR_ARGB8888 :
    9 f( [  n$ x4 C0 J
  281.                 {
    , u/ d- |0 M2 S' B' M: u5 r
  282.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color);        //DMA2D进行单色填充
    5 c" H/ ?; R+ U( V6 v& b
  283.                 }break;
    ; I8 A2 N. P. k5 v
  284.                 case DMA2D_COLOR_RGB888 :- a; O" ?# {$ I6 R
  285.                 {7 u7 N$ M6 ~2 K% V1 R2 X
  286.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color);                //DMA2D进行单色填充
    3 [- Y% s% v0 v& y4 z5 Q
  287.                 }break;6 F+ ]4 Z$ Y2 }; y
  288.                 case DMA2D_COLOR_RGB565 :+ }7 \" O& b. ^0 h' z
  289.                 {
    ( m7 q2 e; r+ X. @
  290.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充; O# @& r% |+ n7 J
  291.                 }break;7 w$ e4 q' f) v+ F6 w0 D4 \
  292.                 default:return;
    . J; I2 P' J! O
  293.         }1 p. u. P8 H3 q" O$ I! H" ~% M7 z
  294.         SYS_DelayMS(5);+ ^# {: u: g3 ]
  295.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                //等待DMA2D传输完成, P: }, I. G) `" E
  296. }0 h( {& |3 x# M& `0 G
  297. " ?5 Q- r$ t8 c4 W  s# }% N) M

  298. : b4 w" M- o0 T% W, R% U( ~
  299. /*************************************************************************************************************************
    3 z7 ]2 }" E2 Z6 \. P
  300. * 函数                        :        void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, + R. Z4 T7 z# T5 @+ Z/ G
  301.                                                 u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    # {9 i2 n! n: t9 l3 U
  302. * 功能                        :        GRAM局部拷贝(支持Alpha)$ t# R& p: A- I. {4 F! L8 k/ Z
  303. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;" `1 u' V$ V9 r' ]3 x8 k" M! {% N
  304.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度  R' r. `% H) P: d- d, J$ r
  305.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    ' J0 K$ j9 I2 R0 c
  306. * 返回                        :        无
    / J4 j5 F" `; S9 m/ V! i
  307. * 依赖                        :        底层宏定义/ X' I; z) i! M6 w, z0 m
  308. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    # v7 j3 X/ F" N
  309. * 时间                        :        2020-02-020 \5 ?4 i% \* k  h5 T
  310. * 最后修改时间         :         2020-02-02: o. M- r- T' ?- E6 y
  311. * 说明                        :        不会检查GRAM大小,请确保GRAM
    0 H: v2 X2 w' F5 h8 `
  312. *************************************************************************************************************************/
    2 U/ Z* M/ `' q$ z# B: O' \: j* g
  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)
    6 N7 `# ^$ @7 `+ r6 ~) g
  314. {# ]( k5 V; Z8 z7 i' e; n
  315.         u32 SourceImageAddr;        //源图像地址(通过地址控制开始的X,Y坐标); B& j0 n/ q- c6 Z( z4 T7 ^
  316.         u32 DestGRAMAddr;                //目标GRAM地址(通过地址控制开始的X,Y坐标);
    7 j7 ~6 I! u6 b& I0 L, }
  317.         u32 PixelByteSize;                //像素字节大小
    3 w1 F, f! j6 A  y7 \( f# _* ?, L+ p7 a
  318.         2 A. V# j' s2 n/ a
  319.         if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL)
    ; {  n* D! J, B( G0 _
  320.         {4 `% v' z" R  p% K! B  y8 N! _
  321.                 DEBUG("无效的句柄,pDestHandle\r\n");1 k2 Y9 x+ @+ H# K+ E1 ?. c0 B& [
  322.                 return;7 D2 c3 K* x, c
  323.         }
    - h# X' s0 [  n+ S9 m9 j8 z
  324.         if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL)
    / n* R- d, p1 `2 ~9 L* @8 q
  325.         {7 A$ n- a9 V0 B6 v% l' q
  326.                 DEBUG("无效的句柄,pSourceHandle\r\n");
    - M1 u( F7 F9 Y5 `, p- R( w  `) [
  327.                 return;
    3 I) }# h5 W" R9 U% p! T) @  v
  328.         }; R/ p! t# h& ^" U
  329.         //源图像地址(通过地址控制开始的X,Y坐标) 计算2 E. |1 y  c; J: n5 n! }$ q. G
  330.         switch(pSourceHandle->ColorMode)1 y) W8 d# b  o5 X- H7 u; p
  331.         {
    # U6 s  h" v$ r& c7 p, [! Q
  332.                 case DMA2D_COLOR_ARGB8888 :: S2 e; d! r$ c0 F1 ?
  333.                 {
    2 e- M- n7 b* [1 u7 [) L% g/ f
  334.                         PixelByteSize = 4;
    3 c' F; s- r) V# C
  335.                 }break;
    ! l* `/ I; Y* v6 W9 L$ P6 M+ U
  336.                 case DMA2D_COLOR_RGB888 :% [3 v1 e& X8 }+ x
  337.                 {2 \3 Q$ ?: I4 x! ^6 h, l7 B- B( i" i
  338.                         PixelByteSize = 3;( Y/ t$ F2 p0 \1 D1 P( I
  339.                 }break;  K$ T' D, D) H! I
  340.                 default: //DMA2D_COLOR_RGB565  [, A! ]6 _5 k& \* T
  341.                 {* T  z, Q# \, n) f# @0 \) j& Y
  342.                         PixelByteSize = 2;3 R  c/ k  ], q0 F
  343.                 }break;9 K( s! t) d; {  E
  344.         }* M" S1 A* G; ~5 u. w) A
  345.         SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize;        //计算源开始地址
    3 U% M- W  V# U$ ^
  346.         
    % }' a% {& T1 s0 n
  347.         //目标图像地址(通过地址控制开始的X,Y坐标) 计算! |% ^! q2 R8 H  j+ C
  348.         switch(pDestHandle->ColorMode)) g. b/ T4 F3 r4 {6 z6 \
  349.         {
    ; l3 v# @3 N% ~+ E- Y. Q
  350.                 case DMA2D_COLOR_ARGB8888 :
    * R! R! I4 y3 E8 P) D
  351.                 {- |  O0 x  j3 B7 U- S! j
  352.                         PixelByteSize = 4;! T" V) ~- m" o. q
  353.                 }break;
    ( S. q) A  j$ m* e7 E& @
  354.                 case DMA2D_COLOR_RGB888 :2 N" h, X6 X# u
  355.                 {0 _! {& F+ J+ M# O% e2 K5 Z
  356.                         PixelByteSize = 3;
    " Y) o7 `7 J7 j7 a
  357.                 }break;) B5 `- C5 l* Y) R; O
  358.                 default: //DMA2D_COLOR_RGB565) w) u+ s7 _& I5 M6 D2 g
  359.                 {- [, e+ m/ a7 U1 y) x/ b! o+ e. ?, {
  360.                         PixelByteSize = 2;2 I: A* p! @6 e
  361.                 }break;
    # n# D* ^2 w% ?  _4 z: y8 r* i( s. H6 S
  362.         }+ S& Q. {% Q; c" U# R( N0 b. u
  363.         DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize;        //计算目标开始地址
    7 X2 b, n0 [; I4 q# E
  364.         //进行拷贝1 D+ f2 p+ ~- H* ~  v9 K- Q
  365.         DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode, 9 n7 o) t& K# u( g9 f6 p2 p, |
  366.                 pDestHandle->ColorMode, AlphaMode, Alpha);                                                                                                        //DMA2D进行矩形图形填充(会执行像素格式转换)
    0 F) ]! l) h; p) c4 ?
  367.         DMA2D_WaitTransferComplete(200);                                                                                                                                //等待DMA2D传输完成
      s3 C; ^0 b: y0 m
  368. }: [# f7 s4 D6 w( A7 I# t; _

  369. ! F9 X- w( }! j) i' U+ r* r
  370. /*************************************************************************************************************************9 Y$ u$ Y/ c' J; m
  371. * 函数                        :        void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
    1 `4 Z  }! P2 n# V6 P- Z
  372.                                                 u16 Height)! Z# w% M$ q( A! v# [
  373. * 功能                        :        GRAM局部拷贝(不支持Alpha)
    - g+ P6 E  x' Q% }5 _& f; a
  374. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;$ H; Z% O; z0 |+ k# B8 s' X
  375.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度4 g: G9 G/ I. X) D3 u% `
  376. * 返回                        :        无
    " _  r% O; K+ H( d/ Y; L9 ^9 Z$ h7 y
  377. * 依赖                        :        底层宏定义
    2 T- o; Y) y& E6 p1 Y( Q; m- V/ p. C
  378. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    9 G- d" L! {! ^. }7 F
  379. * 时间                        :        2020-02-02/ l  l# Q: E$ P1 n2 \% y
  380. * 最后修改时间         :         2020-02-02
    $ S1 S6 u4 v+ ]2 o- S* m& w
  381. * 说明                        :        不会检查GRAM大小,请确保GRAM
    , F: `: W, b2 _7 U6 o
  382. *************************************************************************************************************************/$ c( ?9 c  l: m: y$ P0 D" Y$ S
  383. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)
    8 w7 q7 C( o0 |$ Q0 K+ t" y3 l
  384. {
    - w2 r' L5 R6 a; `: J, f9 C
  385.         GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);% Z$ m( e* g5 `1 u
  386. }
复制代码

. j5 }0 f7 w5 r; \( Q, v$ U. ~' r( }, @$ |6 x3 u( B1 E4 T  Y
  1. /*************************************************************************************************************
    8 F4 q' z* R1 x, C1 n# @2 h" A2 H
  2. * 文件名                :        DMA2D_GRAM.h
    , T# X  U& O& J: v0 H. t
  3. * 功能                        :        GRAM相关操作1 F6 H8 C% p6 `! i& V
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>, B; G: a& j! _: L& v, y
  5. * 创建时间                :        2019-10-30
    ! V6 ]6 [( A2 w! f$ t9 Z( }
  6. * 最后修改时间        :        2019-10-30
    ) E: r. P8 q  Y& p, E/ m/ j# t% Z
  7. * 详细:                        显存相关操作接口
    + t# D" B# i. _, q1 s
  8. *************************************************************************************************************/        2 s% e6 ?8 [' N9 l/ O# L
  9. #ifndef __DMA2D_GRAM_H_
    8 w/ {2 I- c  ^- S! ]+ x  v
  10. #define        __DMA2D_GRAM_H_           
    " M9 \$ b% m" M6 z( I- P
  11. #include "system.h"
    + k' o: G, O6 Y' Z3 g
  12. #include "DMA2D.h"
    6 A- W2 m6 M6 Q9 K5 R3 S" D0 U$ \
  13. #include "SYSMalloc.h"
    2 v- C. k8 O* z( I& I) U

  14. $ K' G) @0 K) _  V! h8 {
  15. //初始化状态id- m8 J$ f! y/ w0 a& b; K$ D& l
  16. #define DMA_INIT_OK                0x1234423        //初始化成功(不可以释放)
    5 y" S4 ]$ q# v. n& g4 R' o$ k
  17. #define DMA_CREATE_OK        0x3643423        //创建成功(可以释放)  Y" p6 |! |) |9 i  {

  18. % e! D6 B9 Z4 d) Y$ [1 s
  19. //颜色模式
    $ L+ K6 A) m: m2 F. S1 e, u
  20. typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;% |# G& t2 g9 L: ~3 l6 T5 d( E  D2 E) P

  21. * j. l9 f  r' Q4 F, s

  22. 1 ^* ~# Q! N  N" c: n" p, }
  23. //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告). p% R' M( u- z
  24. typedef struct6 r" z$ c# G1 V, x9 j1 i9 m
  25. {
    $ a( x# K* s% t7 h
  26.         void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //绘点函数
    * D4 C, l4 t( H3 [# d/ o
  27.         void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                        //填充
    $ w3 \6 Q" w+ w0 }; R! H1 @9 ^# S
  28.         void (*pClear)(void *pHandle, u32 color);                                                                                //清屏2 S* J! ~* Q" n6 y& f2 d
  29. }GDI_BasicInterface;
    / b3 H% g" y# E7 s. U4 g& E4 q

  30. + X3 B/ C' w0 g" J9 C) W: P) k
  31. 8 C! P0 L+ v( h: K, f: o  D2 s
  32. //GRAM相关接口-16bit
    7 W8 r. }4 ~0 L7 z8 Z
  33. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;9 R' _/ ]  K  s7 v0 E. K
  34. //GRAM相关接口-24bit
    - J& b9 o) D8 w5 Y/ P
  35. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;  f( x& r, |7 |. O
  36. //GRAM相关接口-32bit
    * c( M* E! ^: W5 [2 A8 Q; w- d
  37. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;
    3 h2 b; R: A- v8 c  k

  38. $ h8 N6 o, W$ E
  39. //所需的内存申请接口- e9 P/ g, m# f) c9 h8 d& V. w
  40. __inline void *GRAM_malloc(u32 size)9 O6 v0 `. q( X1 V# `
  41. {
    8 ^8 K; g& |2 }( q
  42.         return mymalloc(SRAMEX, size);                        //内存分配(外部调用)-使用外部SRAM
    + ~9 M6 l& b& N; q
  43. }
    & `" ], v, `4 V+ O' S6 I5 x8 V! G5 m

  44. 9 o. P4 c- c# E7 l5 ~4 G
  45. //所需的内存释放接口
    ' X2 L& s# X- N
  46. __inline void GRAM_free(void *ptr)$ i4 [, t5 k, x2 Q6 O- w, t
  47. {6 v& b( k2 I( J: j* [  i0 v
  48.         myfree(SRAMEX, ptr);                                        //使用外部SRAM0 Q+ N7 G! q# `$ C" |
  49. }% R$ r! L/ Y5 V+ f( e& E; S  d( j/ [

  50. 8 P5 ^6 v6 h4 q# {6 N' Q% S) O
  51. 9 N5 i& {2 S" l
  52. //显存句柄# a! \! b% }6 d' E8 _" G
  53. typedef struct2 s6 W+ G5 Q" ~  d( e# Z
  54. {
    ( V, k% ~$ E# ^" v. j% V
  55.         u32 InitStatusId;                                                                //初始化状态id
    0 W9 @  Z) _9 I; |0 ?
  56.         u32 GRAM_Addr;                                                                        //GRAM地址
    1 ~) B) G3 Y6 ~' B0 E; |8 C+ T" M$ ^2 U
  57.         DMA2D_COLOR_MODE ColorMode;                                                //GRAM显存像素格式
    0 Q5 V( ^% R! j# r3 g0 M) T. n
  58.         u16 Width;                                                                                //GRAM宽度
    . I2 [9 I  v  g0 Q
  59.         u16 Height;                                                                                //GRAM高度# |& t2 Q* P/ H( b' I
  60.         u32 *pGRAM_32bit;                                                                //32bit颜色模式下显存指针! z# g- o8 r4 `
  61.         u8 *pGRAM_24bit;                                                                //24bit颜色模式下显存指针0 _* X; n5 A7 a
  62.         u16 *pGRAM_16bit;                                                                //16bit颜色模式下显存指针( e' F& O7 `3 @. |& z# _; d
  63.         const GDI_BasicInterface *pBasicInterface;                //底层GDI接口
    4 }* m0 C2 f/ f' ^5 N% s) U
  64. }GRAM_HANDLE;& K- f1 s& L$ h. @5 v( X7 K% d% r
  65. 5 H, \. y- L; V4 m
  66. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);        //GRAM句柄初始化(不会申请内存)
    ' n! n; U5 ]" ^3 N
  67. void GRAM_Delete(GRAM_HANDLE *pHandle);                                                                                                                                        //删除一个GRAM(会释放内存)) \: T) F& @) Y2 q- D! N$ h, a, E
  68. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                                                        //GRAM矩形填充(使用DMA2D)
    4 D& a# y$ Z" Y! u% E2 b; o
  69. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color);                                                                                                                //GRAM清屏(使用DMA2D)+ U+ X5 Y9 x' G, i$ |' A
  70. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);                                                        //创建一个GRAM(会申请内存)4 O& Y$ @8 ~$ m# f
  71. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
    " R3 Z. T. h0 [6 F! }4 W  c" d. }
  72.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);                        //GRAM局部拷贝(支持Alpha)
    - I( P8 L, z; d' m
  73. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
    3 T+ G; A; z) n( @' l; R
  74.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height);                                                                                                        //GRAM局部拷贝(不支持Alpha)
    ! _7 Y3 X7 O3 R

  75. 4 ]! p' S- ^& E" T; F
  76. #endif //__DMA2D_GRAM_H_
复制代码
  1. /*************************************************************************************************************
    + v/ h: }. B7 l1 {
  2. * 文件名                :        GDI.c% w7 z* J2 S' ]* U6 S0 l
  3. * 功能                        :        图形设备接口(Graphics Device Interface)
    ( i& J" y# p  H: T% f9 t
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>  j5 ?/ q. c0 z. Z/ e5 i, H" u
  5. * 创建时间                :        2019-11-02. I% i4 |- N2 l4 t' F/ K, f- x( w
  6. * 最后修改时间        :        2020-02-02: `6 E7 h% y0 M) S. {
  7. * 详细                        :        STM32F7 图形设备接口- \8 ~' N1 V; M7 w8 Z
  8. *************************************************************************************************************/
    + l% v3 U( Z, k8 w, g. f
  9. #include "system.h"
      C" B* A/ q5 \4 K
  10. #include "DMA2D.h"2 d3 b+ q' C1 p9 L4 K( s
  11. #include "stm32f7_ltdc.h"
    9 r5 q1 Z8 x' Y3 B9 l
  12. #include "DMA2D_GRAM.h"/ [) R% }. c9 R: G1 Y" U) a0 J
  13. #include "GDI.h"
    $ b5 }! [1 ^2 Q  _! h; I+ [7 i+ O

  14. - w7 S8 T: X3 Q. _* a3 u6 o
  15. //显示器Layer1 GRAM定义; q- d2 d8 R  S$ [5 O8 G( U: M
  16. const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle =
    ! g) \( i& M) j) o
  17. {! [  D( w) S+ A, M: h% L2 s
  18.         DMA_INIT_OK,$ k# T: B; F: V7 q* z
  19.         (u32) &g_LTDC_BUFF_RGB888[0],        //GRAM地址0 v- `- A5 s# [; }3 B+ ^. O' M6 ?
  20.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    * D/ |: M5 s0 S0 s
  21.         LTDC_WIDTH,                                                //GRAM宽度
    * r6 c% h: |! W8 j
  22.         LTDC_HEIGHT,                                        //GRAM高度
    % @$ N" ?6 Z/ h; [. G1 m% N
  23.         (u32 *)&g_LTDC_BUFF_RGB888[0],        //32bit颜色模式下显存指针
    % G5 A# u6 ~; O5 y, T( T, X
  24.         (u8 *)&g_LTDC_BUFF_RGB888[0],        //24bit颜色模式下显存指针
    ) i" Y& ~% w1 V" t$ a5 t  @7 d
  25.         (u16 *)&g_LTDC_BUFF_RGB888[0],        //16bit颜色模式下显存指针
    ( ?) J6 j' D4 S1 L4 O- {7 a, E
  26.         &cg_GDI_GRAM_Interface_32bit,
    $ J) b0 O7 N. s$ P$ ?( f# a) Z
  27.           Q% Z& F4 Q, `& X
  28. };; T/ E6 p, X' k. l$ X
  29. ) r& D3 `+ Y( m2 s6 B9 m
  30. //显示器Layer2 GRAM定义0 F- {& H% c8 N' I/ r% r, I8 c
  31. const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle =   r3 [( u, }! K# R+ d
  32. {
    4 j' r/ A1 N& W4 Y9 W( i
  33.         DMA_INIT_OK,4 [: ?9 y) N% q2 B; l- |$ |  g
  34.         (u32) &g_LTDC_BUFF_RGB888[1],        //GRAM地址
    2 q& t7 Y, ^; J; d
  35.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式# m) y) h+ }% l% b6 W0 m% `8 q
  36.         LTDC_WIDTH,                                                //GRAM宽度
    # Y1 ?% }" E- W) X
  37.         LTDC_HEIGHT,                                        //GRAM高度
    / o, j1 j$ t; D2 f  W2 a2 I
  38.         (u32 *)&g_LTDC_BUFF_RGB888[1],        //32bit颜色模式下显存指针- H2 B0 N: s& {+ P
  39.         (u8 *)&g_LTDC_BUFF_RGB888[1],        //24bit颜色模式下显存指针
    7 q& \$ O8 F4 b+ m, \
  40.         (u16 *)&g_LTDC_BUFF_RGB888[1],        //16bit颜色模式下显存指针
    7 i. d0 [+ B1 I1 t' q
  41.         &cg_GDI_GRAM_Interface_32bit,
    ( x7 D! h6 b, P; e
  42. };
    7 Z$ [! x) G: r. V& k
  43.   n6 v- z$ e% X& j- r1 y) B8 L! i6 K

  44. 3 F  P) P) k- b, L6 q5 F' s
  45. /*************************************************************************************************************************% y$ U/ t, f: |+ x+ \; G% @
  46. * 函数                        :        void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)$ Q. u) U* H" ^; J7 k$ B
  47. * 功能                        :        绘制空心圆
      |7 u0 u3 z; {$ ^6 n- ]
  48. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色3 K. o% t3 m5 w4 e% K
  49. * 返回                        :        无
    0 x! i/ d1 h- W
  50. * 依赖                        :        画点函数* ^+ N6 |- i$ ?0 m
  51. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>) H2 A0 h" ?  k3 s" S/ w
  52. * 时间                        :        2011-09-205 R3 w/ A, a9 H* X( s7 D1 K3 ?
  53. * 最后修改时间         :         2019-11-02/ g7 A9 i& H9 R5 V) r8 i/ Z' n
  54. * 说明                        :         无
    8 _; K2 F. ~$ G1 g- H
  55. *************************************************************************************************************************/
    ) Z! z' g( y2 t+ u, \. U( x
  56. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)5 g7 R4 x0 n) p# k0 `7 W# C) f$ c
  57. {
    # |& V5 j% L% Y0 P
  58.         int a = 0,b = Radius;
    4 i. g# _. i& `! `
  59.         int di;
    3 y( Z! O2 y% C  r; \. K# V2 \/ m
  60.         di = 3 -(Radius << 1);           //判断下个点位置的标志
      Y) S. ~% @# q8 C) ?2 G  A! ~4 K

  61. $ s- Z1 d5 `1 C3 G, }% v
  62. #if(GDI_PARAMETER_CHECK)                        //参数检查* p# t! P6 Y3 t; F' y- E
  63.         while(pHandle==NULL)
    ' J$ f* m% g: e3 k
  64.         {9 f  w& u: l7 p, i5 H  f
  65.                 DEBUG("无效的句柄 pHandle\r\n");
    # E/ K/ \4 c- P+ C6 S+ |* V
  66.                 SYS_DelayMS(1000);( W  e9 I3 E( ~
  67.         }        
    $ O+ y% M! t4 x5 M3 m
  68. #endif //GDI_PARAMETER_CHECK1 J  {) l( N) y, [" W) Y
  69.         ; V( P4 J7 v" w+ y( P4 B
  70.         while(a <= b)" O8 D. @* v/ ^: P$ d5 a. [9 w' |
  71.         {
    - n4 k. O9 S6 ]0 I  D* L
  72.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //3           
    2 f$ \7 C: z  s, I; {4 m: M
  73.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color);             //0           
    ' l5 A/ N/ L3 N8 e( p3 t
  74.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color);             //1      
    7 Z1 e$ x( C8 x+ Z6 B% B9 m, j- ~
  75.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //7           & ^  M1 B; w7 B5 H( d
  76.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color);             //2            
    0 T9 D0 C% h* b/ s  v; v+ K
  77.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color);             //4               
    1 w% A# k- u. x
  78.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color);             //52 u9 }: W3 C% C- A- Z
  79.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color);             //6 ! a* O# H$ {* F, `
  80.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);            
    1 o# h1 `0 C: r7 Y0 Y
  81.                 a ++;
    # e! K4 U+ @0 h7 Q
  82.                 //使用Bresenham算法画圆     
    # {5 ^5 W3 d6 ]: h
  83.                 if(di<0)
    . U: ]* V& r* Y8 f5 p
  84.                         di += 4 * a + 6;                                                                                     ' @* b# ~  p1 s/ {2 D- A
  85.                 else) E5 y- P# D& B3 \
  86.                 {9 _/ ?6 t" k' C* r0 Z& {# G
  87.                         di += 10 + 4 * (a - b);   
    / H. z5 C& k6 Y( R& E
  88.                         b --;' _  P, h& D4 D4 Z
  89.                 }                                                                                    
    * f( H4 \, x4 c& N3 z5 ]! P
  90.         }                                                                                 
    2 B+ ~" k4 J4 t9 M  d: m
  91. }  C2 y6 @+ N/ `/ m2 J7 E2 A
  92.                                                                                                                                           
    0 w5 ]0 X6 B5 ~# v  g/ ~
  93. 4 J6 ^' U5 d6 w" k0 |* T
  94. /*************************************************************************************************************************
    0 w/ R# T! M( n3 ?5 w
  95. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    ( p0 V: I- e8 u$ L( e% ?
  96. * 功能                        :        绘制直线(可以倾斜)
    6 b% m* O$ _8 X5 W; ?0 q+ p
  97. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色( \9 }+ K3 A( _, r+ N" I
  98. * 返回                        :        无8 d; n/ n0 K# O5 e
  99. * 依赖                        :        画点函数! P" }: `2 m0 Q/ H: G
  100. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>( ^5 D+ |5 p8 s. H! L
  101. * 时间                        :        2011-09-20
    ' ]; @9 B3 k# ~0 L, G% e
  102. * 最后修改时间         :         2019-11-02  q3 p: S  a2 v7 ~
  103. * 说明                        :         无9 U' \  |# {5 e, Y$ f
  104. *************************************************************************************************************************/3 B4 l# L+ E  m& F& g* R# |6 x
  105. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    & A  N8 p$ T! b
  106. {, d; I: W/ N; I( ^/ z
  107.         u16 t; 6 g7 Z  }5 T" W5 g3 S1 j, l
  108.         int xerr=0,yerr=0,delta_x,delta_y,distance;
    ( t, e8 B1 P, I, p0 Q! _
  109.         int incx,incy,uRow,uCol;: Q7 v4 I/ w2 w  J  O2 X4 l/ ]/ v* R
  110.         9 {1 ]# `. V0 ?- f5 @7 D
  111. #if(GDI_PARAMETER_CHECK)                        //参数检查- Y" T) m1 O: [% U
  112.         while(pHandle==NULL)
    * _# Q* V1 G2 j& G/ v) x' x
  113.         {
    ( s- G" H7 }% I9 b
  114.                 DEBUG("无效的句柄 pHandle\r\n");
    7 T  l$ ?9 O# v
  115.                 SYS_DelayMS(1000);. \: r1 s4 x- [9 c6 x: w/ q
  116.         }        ! I! c9 h0 h& K' X) H2 E6 {2 u
  117. #endif //GDI_PARAMETER_CHECK        
    ' D9 Q) W9 ]" j! C1 \
  118.         9 x8 a% N8 |8 M3 y+ x
  119.         delta_x=ex-sx; //计算坐标增量
    / ~" h( b2 o! q- C. A. c8 a. J1 q
  120.         delta_y=ey-sy;
    5 D; U& ?( b6 ]- ?+ }- J
  121.         uRow=sx;
    % ~) [" S; N' B% s/ g% C
  122.         uCol=sy;
    7 D# w# t# Y0 U, }8 d
  123.         if(delta_x>0)incx=1; //设置单步方向
    ; l/ c( P1 b, d0 R! i2 W% t
  124.         else if(delta_x==0)incx=0;//垂直线
    ( T7 W" n5 W  U# H  p0 A
  125.         else {incx=-1;delta_x=-delta_x;}
    , N# G8 w2 @0 f2 l; l% V
  126.         if(delta_y>0)incy=1; 0 [5 `) C. j7 ^
  127.         else if(delta_y==0)incy=0;//水平线
    ) b2 D9 E0 Y5 |
  128.         else{incy=-1;delta_y=-delta_y;}
    0 F; u& S8 f! ?& m1 L8 X
  129.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 1 R0 _+ y( y* t  Q6 d
  130.         else distance=delta_y;
    / X! ]9 g& ^, L/ p; B! u
  131.         for(t=0;t<=distance+1;t++ )//画线输出
    6 A# c* d0 y6 _3 U* F  x
  132.         {  / _5 L$ g# }- G8 w8 @& k
  133.                 pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点
    / ^0 c5 ^; s" v) K8 ~4 ~# Q
  134.                 xerr+=delta_x ;
    & G) t, D- P% K) q2 w
  135.                 yerr+=delta_y ;                                                                                                 $ o9 M* l3 d0 u
  136.                 if(xerr>distance)
    5 |9 a' j" s9 M, P2 ^) A! V
  137.                 { - @3 I7 S  t' \  T% H, `% w! @
  138.                         xerr-=distance; 3 l9 }4 G( M1 R- C/ |+ y5 U
  139.                         uRow+=incx; 9 n! V4 L; X) C: y& i
  140.                 } % e# n; F* R- h) R9 q2 u4 N) }
  141.                 if(yerr>distance) + [. z, D( o; A9 E  t: U
  142.                 { , y( ~4 E: h, i+ j1 W( E
  143.                         yerr-=distance; # X% m6 P1 W2 r, ^
  144.                         uCol+=incy; 5 a% `: A3 m! t0 `. |% K+ |4 N
  145.                 } * s& m( g9 @7 @  v; ^. z
  146.         }  
    9 U$ `  z! b0 }. q2 i' H
  147. }9 R% y+ U5 Q, M6 }  t7 s8 [
  148. 1 {6 F  i5 V3 X( C7 L: {
  149. 9 r& u8 d5 W! Y% z% @  p7 s
  150. /*************************************************************************************************************************1 {4 R* @. b8 i: S2 V! J  B# `0 Q
  151. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)9 C6 ]. P$ S0 O) ?8 t
  152. * 功能                        :        在指定位置画一个矩形/ q  ]! r0 I6 i7 n1 E. J2 q6 @
  153. * 参数                        :        pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色  {5 |! S1 c" x5 d0 U
  154. * 返回                        :        无
    8 w' v) `  N# A* E% V
  155. * 依赖                        :        画线函数- _! c% A. }& G
  156. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    3 s) K, D% d/ ^
  157. * 时间                        :        2011-09-201 a8 W4 X% Q% l2 ~
  158. * 最后修改时间         :         2019-11-02, V- t& d1 Z4 Z- }* u. W
  159. * 说明                        :         无
    & e% ^, ^. C' S' h; K+ \+ ~
  160. *************************************************************************************************************************/$ h/ J5 b: w1 R% d! y+ Z$ b8 W
  161. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)
    4 E9 p3 u; f3 @8 P, o% e. n
  162. {3 N( s" s6 _5 ?: C. p$ H6 h+ `
  163.         
    7 ]/ Y+ K5 @% `$ }
  164. #if(GDI_PARAMETER_CHECK)                        //参数检查% T; j: H3 d  I3 t! S- i9 o
  165.         while(pHandle==NULL)4 n- W/ m5 C' C( b$ o  i7 O
  166.         {+ K  G( c5 D! ]! a
  167.                 DEBUG("无效的句柄 pHandle\r\n");. C; D) R+ M# `. p  ?
  168.                 SYS_DelayMS(1000);/ G" s1 L0 |2 _$ s5 S
  169.         }        / J/ c$ l- b4 @% a: t
  170. #endif //GDI_PARAMETER_CHECK
    ; `% V6 l/ Q9 o  b
  171.         0 g) |: D3 k9 n# M6 m" }
  172.         GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);5 U0 P6 J7 B- q0 x. ?$ T
  173.         GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);
      v! E5 i: R1 Y2 V
  174.         GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);
    ) J: r& b# @8 B# ]" r
  175.         GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);  F9 f- L4 |- [: ^' {$ }8 j; }9 L
  176. }                                                                           
      J3 s2 S1 }: V  T' s" F/ w$ X, g

  177. 4 b1 ?+ ~& ?. ~/ `5 T

  178. 2 s- d5 }8 W- [) L* h3 T
  179. /*************************************************************************************************************************  m+ C. \6 e( Q5 `/ y  T
  180. * 函数                        :        void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    & K6 x* h3 A$ q& W# N1 L
  181. * 功能                        :        画一个2*2的大点
    2 U! G4 T1 s4 H% I! a; {
  182. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色) W8 p/ ^( w$ ?* t4 ^
  183. * 返回                        :        无6 W1 P, U/ g  _
  184. * 依赖                        :        画点函数  [, n3 @3 v+ q$ \" a
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>2 K  W$ q2 b. k7 t7 T% Q% P
  186. * 时间                        :        2011-09-20, ?. K) P$ _0 |1 p. P- @. i5 H$ g- k
  187. * 最后修改时间         :         2019-11-02
    , s8 {% _) K+ o  h  v
  188. * 说明                        :         无
    " S: D$ W8 c( A* P3 u
  189. *************************************************************************************************************************/% z3 I# U6 M) I* z( O
  190. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color): R' _+ \* P& \; d( }
  191. {        
    ; Q) Q1 L' ^' {; h1 _
  192. #if(GDI_PARAMETER_CHECK)                        //参数检查
    ! d' _7 @8 L; t1 H" v! y6 r( B
  193.         while(pHandle==NULL)
    , M) X( _9 e2 d- z
  194.         {
    * L6 c8 f& C8 R+ T" E
  195.                 DEBUG("无效的句柄 pHandle\r\n");
    : u' |! o* k# g1 q) N  y  t' C0 h
  196.                 SYS_DelayMS(1000);
    7 g- ~& D( P; I- Z
  197.         }        " v# z, n! G; k1 F6 O
  198. #endif //GDI_PARAMETER_CHECK
    ' N- N9 O% P4 N& I
  199.         * B) u2 Q4 h. I
  200.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                //中心点 ' k, ]% h9 G$ p% Y! z! N
  201.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);
    ! N0 F, R1 r% N
  202.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);7 _8 j) o0 Z! @. u+ o6 g$ ?
  203.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color);                           % A9 S$ E. [: R8 G/ w6 e& ?
  204. }        
复制代码

" t/ j* R: F8 a  d" b+ X
( `! e8 u7 {1 |3 }* w" A
  1. /*************************************************************************************************************
    9 P& ^( D0 v) z0 E1 r8 [  t
  2. * 文件名                :        GDI.h3 I( j( X$ Z& m/ I4 V# C
  3. * 功能                        :        图形设备接口(Graphics Device Interface)* l7 Z. J- j& X0 D7 [) t/ t
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    6 w/ r. q; X/ c
  5. * 创建时间                :        2019-11-02
    * _  B$ D1 A# P8 l6 L7 g4 z0 ]
  6. * 最后修改时间        :        2020-02-02" I' m' K. S, i) k6 k8 m
  7. * 详细                        :        STM32F7 图形设备接口8 X2 \* i1 p/ [0 Y0 T( Z* ^8 E
  8. *************************************************************************************************************/& K2 j5 e9 {( ~/ ~5 b4 u1 q
  9. #ifndef _GDI_H_
    8 b$ j% ]! x0 s0 _8 b" y
  10. #define _GDI_H_; |7 b/ ~! m$ }# B7 S0 H
  11. #include "system.h"# y$ h3 j$ T1 ?) T
  12. #include "DMA2D_GRAM.h"! B' {9 Y3 ~8 L9 X9 R

  13. % z) ?. c% X- @
  14. #define GDI_PARAMETER_CHECK                1        //参数检查-主要检查指针2 J5 C/ [6 f. L, c
  15. #define GDI_DEBUG                                1        //调试输出
    % s+ Q# v" Q/ h# ^9 y

  16. - U% g' X# }" ~; _7 C
  17. #if GDI_DEBUG
    + W9 U8 T5 m0 G  p6 G" {
  18.         #define GDI_debug(format,...)        uart_printf(format,##__VA_ARGS__): I& ?6 j/ [& t8 Z  h; c1 C
  19. #else$ P$ j" j. L# {" [' J$ ~- ?9 x
  20.         #define GDI_debug(format,...)        /\
    ( a# U) L* L2 S2 Z9 O9 x& ?
  21. /' L" O9 f( f; }$ k
  22. #endif        //GDI_DEBUG
    . e, e( l) E3 C, _4 U  d

  23. ( S1 P0 U' l4 M
  24. ! S3 j8 Y( f; a
  25. % H( T9 g: H6 O. G
  26. extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle;        //显示器Layer1 GRAM定义
    % _( Q' l9 q( U  i1 O
  27. extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle;         //显示器Layer2 GRAM定义
    $ ]' E; ?' \- s* q" R
  28.         
    + p4 y! p4 e6 f0 p  Z, L- D  C& t
  29. #define LTDC_Layer1_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle)        //显示器GRAM 1" k9 N+ y, o  v- m7 m0 y- ^
  30. #define LTDC_Layer2_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle)        //显示器GRAM 28 d( Y5 n. a: \; J

  31. ; c1 ~8 l5 ?% Q7 {
  32. //GDI相关API
    7 c4 `/ A8 b2 r# W( }# f: Z
  33. __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color). c  K. J  f5 [" R
  34. {        
    7 O) ~# J2 ]; M  P, ?( P
  35.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                                                //画点 % M/ ~  v$ Q0 C6 \8 }, {
  36. }        . l3 n& Q# A) |! f1 N( Z1 ]: E' M
  37. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color);                        //绘制空心圆" {" u9 q- z( c) P8 X
  38. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color);                        //绘制直线(可以倾斜)
    ! N0 i' W  j+ u3 g; b" Q8 Z
  39. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color);                //在指定位置画一个矩形
    6 B6 O# c6 z- M4 D6 z
  40. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //画一个2*2的大点5 \$ u1 \# Z4 S1 Y
  41. " ]1 i) m0 C- ]
  42. 6 Q/ `7 n6 o7 {0 i( ]# L3 v( r
  43. #endif /*_GDI_H_*/
复制代码
+ F% y, Q/ L! M
测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。3 i4 Y* k+ F5 Z5 w" W4 c
, o5 p" H+ M3 r  x% e7 _
  1. FIL *pFile;  j9 O5 m& C8 W0 g6 X; q
  2.                 FILE_ERROR mError;' z: j1 h9 i' W* ]. b! T6 E
  3.                 GRAM_HANDLE *pGramHandle;
    ; ]9 Z5 d- {6 ]! K! ?% m
  4.                 . k. _& x6 ^9 l1 |8 ?/ f
  5.                 pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565);        //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB565
    : I+ ?% q) N3 W
  6.                 if(pGramHandle != NULL). h  v- H  l/ h+ d: c1 s' B& z
  7.                 {" q/ \; x: z) U( u- `# F
  8.                         GRAM_Clear(pGramHandle, 0xff00);                                                //清除显存,防止读取失败了还是现实上一次的图片
    2 B0 C' k- o3 G3 _
  9.                         uart_printf("[OK]GRAM初始化成功\r\n");
    8 m) k) \! D9 u( ~) \
  10.                         pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);' {/ H" ^" v7 B2 e. A( I
  11.                         if(pFile != NULL)6 Q1 J/ m4 _; l5 }6 @* |1 c& S
  12.                         {
    6 D  X2 ~' H9 I" L, ^
  13.                                 uart_printf("[OK]打开文件成功\r\n");
    & ?/ O/ @7 X2 f
  14.                                 if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中6 ^# a! ?% E+ y% t3 t& v
  15.                                 {
    1 x5 i+ N% k# m
  16.                                         uart_printf("[OK]读取文件成功\r\n");" w6 c1 m- f" u. d8 V* I  C
  17.                                 }7 Z( T! l- T/ j# \6 O5 y( M1 w
  18.                                 else
    7 x2 C5 c- e. U* F3 C# i: Y: X
  19.                                 {
    + [- g5 F5 A* e( o+ r4 _
  20.                                         uart_printf("读取文件错误:%d\r\n", mError);0 t$ |2 |: S/ n
  21.                                 }7 f) @0 B$ b( I& N
  22.                         }
    / {7 C6 G+ F8 ~2 A. T
  23.                         else
    & k$ ]1 z7 i7 g, t) G1 r& k; R( d9 b
  24.                         {
    ! i6 _! z/ w( w8 I; j
  25.                                 uart_printf("打开文件错误:%d\r\n", mError);- t7 {. t" N3 w3 X1 p
  26.                         }
    2 g7 k. G% Z1 Q9 x
  27.                         //将显存拷贝到屏幕中
    ' D6 h  G. d; h
  28.                         GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240);                        //GRAM局部拷贝0 M  z4 S8 s8 \, U4 _' J4 G; ^" B
  29.                 }
复制代码

* e" l1 r8 k; I. b; Q" ]& v9 E/ R7 v% z# U
) Z) s& c" b) |
收藏 评论0 发布时间:2021-12-16 21:00

举报

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