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

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

[复制链接]
STMCU小助手 发布时间:2021-12-16 21:00
DMA2D可以加快图像填充,并且支持像素格式转换。/ S7 K* _* z5 A; `8 W7 G

8 w: D# l3 Z: {2 J
  1. /*************************************************************************************************************
    5 ?! X/ m7 e2 w1 D% n7 W8 F: R
  2. * 文件名                :        dma2d.c
    " n# K7 K2 n- U+ Z
  3. * 功能                        :        STM32F7 DMA2D驱动
    ( P: |' S8 P4 J  K8 k! [
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>  v2 B" K+ X0 r9 L5 B  J
  5. * 创建时间                :        2019-10-29
    . e% v! [+ G- @' n: x6 k
  6. * 最后修改时间        :        2019-10-29
    ( ]0 p% G8 \/ n% {: G+ \$ L& d
  7. * 详细:                        $ D4 K& V7 u2 ~
  8. *************************************************************************************************************/        
    ; n: p; J7 M  i/ P7 i2 d' g
  9. #include "dma2d.h"  c" {/ f* s8 R3 ^) G3 X
  10. #include "SYSTEM.H"
    2 l! x- m/ V4 C
  11. - ^% e5 A6 h9 h2 D. Z- v& i( K1 G: n
  12. & t7 S# u4 l4 c  S0 P1 \: J5 s5 [
  13. /*************************************************************************************************************************5 p, X' ^' {3 D9 f9 ^# J, q4 @
  14. * 函数                        :        void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)
    ! P. O# `+ V5 V  ~  ?5 [5 o
  15. * 功能                        :        DMA2D进行单色填充- b" m5 q0 k. v# q0 j
  16. * 参数                        :        FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;& b5 u/ A( [( `2 K
  17.                                         ColorMode:颜色模式;Color:颜色值+ Q' a+ q7 v- T. ]# {% f# b* M, v
  18. * 返回                        :        无
    # _2 a9 a1 l* |# b$ U  N0 |
  19. * 依赖                        :        底层宏定义% b2 p% Z1 Y- }/ @; u. A- r
  20. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>( ]* |, \. c8 ^' j2 r
  21. * 时间                        :        2019-10-29
    / p' S* v3 ?2 M
  22. * 最后修改时间         :         2019-10-303 d6 H. E3 \$ V# m, N
  23. * 说明                        :        用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束2 z/ y9 A" n' u* h) G. e4 N
  24. *************************************************************************************************************************/
    ) z3 M: _1 ~6 Q; S" ]5 w
  25. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)& X; f6 s6 f$ L
  26. {3 l" a7 Q7 ~8 x3 k5 h8 f0 m
  27.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟. ]) r3 Z& V8 ~% @9 z" [
  28.         DMA2D->CR = 0;                                                                //先停止DMA2D
    " U4 H+ Q) m) n9 m
  29.         DMA2D->IFCR |= 1<<1;                                                //清除传输完成标志
    . D( w4 \0 r5 Z( V; K- g9 f$ r
  30.         DMA2D->CR = DMA2D_MODE_REG<<16;                                 //寄存器到存储器模式4 U6 ^. @3 s) u8 l9 B3 G
  31.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
    0 b7 Y% B) g+ d7 M
  32.         DMA2D->OOR = OffsetX;                                                //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充9 X# E+ D: ^' R
  33.         DMA2D->OMAR = FGRAM_Addr;                                        //目的地址: T6 Z1 M% E, M: X
  34.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    2 X3 V" G) i7 k9 X) b
  35.         DMA2D->OCOLR = Color;                                                //输出颜色
    9 Z4 f( T# _7 a( z
  36. : W' ^- Z, S' j) R
  37.         DMA2D_Start();                                                                //开始传输, j5 K4 X  l% W# J2 c  E) @2 D/ k
  38. }2 |$ j+ N* g: I4 `

  39. 2 K$ A* Y# u  L

  40. # l4 x1 M1 g, W5 z* Y# @' C

  41. / ]" m6 T0 t1 h, U  |2 j
  42. /*************************************************************************************************************************+ g$ j5 E8 l' o# U
  43. * 函数                        :        void DMA2D_WaitTransferComplete(u32 TimeOutMs)
    ( L% g. e) V" Q% t: W$ z; W8 P
  44. * 功能                        :        等待DMA2D传输完成/ Y8 q- Z3 K# I8 w
  45. * 参数                        :        TimeOutMs:超时时间
    " I, s; p' `7 Z+ }% n7 }( `
  46. * 返回                        :        无2 j2 d# m* d% r- v4 W4 m
  47. * 依赖                        :        底层宏定义" j$ D( J; M7 X6 }* {$ n/ a0 a& `
  48. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ; w5 R  a4 M  E  @4 V  m
  49. * 时间                        :        2019-10-30! ^& a" q0 i- j; w
  50. * 最后修改时间         :         2019-10-30
    2 i( z8 F9 b4 X3 v* _
  51. * 说明                        :        超时后会取消传输% f# n: W: [: n8 V# x4 Q
  52. *************************************************************************************************************************/
    3 O1 j: q- G( t6 [2 c, y% G  \+ c
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs)$ g; C3 B, E4 `: H
  54. {& K& q7 R  q+ a0 z' E0 _' x
  55.         u32 timeout = 0;) N- l0 O6 M1 {+ O( q2 C
  56.         
    " @/ o+ t2 X: v, R5 ?9 ~/ H" P
  57.         while((DMA2D->ISR & (1<<1)) == 0)        //等待传输完成
    7 n+ H) _! @0 X( C- o. m
  58.         {6 y, O: g& T3 a( T! S' E1 T
  59.                 timeout++;
    8 A: G# j( S* j5 m' {4 N
  60.                 SYS_DelayMS(1);                                        //延时1ms
    ' r: ?/ H' `( y$ s. w
  61.                 if(timeout > TimeOutMs)3 }! |" N5 b' l( g3 e# L6 b
  62.                 {7 f3 p2 e* |' L0 r& `
  63.                         DMA2D_Abort();                                //终止传输
    $ G/ O" Y3 _; Y: E1 Y3 u. {: x
  64.                         break;                                                //超时退出
    1 ?/ M! N2 S& r1 ^: o) r
  65.                 }
    # |+ Z+ {. f8 @; O: ~
  66.         }  
    5 Y5 R( o7 n, v' K0 w4 Z1 y8 P+ w
  67.         DMA2D->IFCR |= 1<<1;                                //清除传输完成标志         
    3 x% h* j' ~3 h" L) j" Q
  68. }; y9 z' L/ S& N& q7 l

  69. 3 C6 t3 x4 x0 M5 ^2 O
  70. /*************************************************************************************************************************; }; [6 i3 Z, T, p; @/ J& H
  71. * 函数                        :        void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)
    + ^# p) a) Q" w/ W
  72. * 功能                        :        DMA2D进行矩形图形填充$ E6 T4 ~4 @6 N5 H7 e" A( i
  73. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
    , T  o( F2 _* }$ p3 P: Y
  74.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);4 k0 G0 l) B, m) P% m
  75.                                         ColorMode:颜色模式) |0 S# }: G0 H# y* ~3 H
  76. * 返回                        :        是否设置成功) O: {9 g/ X( a  V
  77. * 依赖                        :        底层宏定义
    ( n* N, O5 `8 R
  78. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 }2 m, _! I* }$ H" B) r  t
  79. * 时间                        :        2019-10-289 {/ G+ `$ M: x& q
  80. * 最后修改时间         :         2019-10-28
    / q4 V+ M- b9 ^! B% F$ ~3 u
  81. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束. q4 z/ N, N" e* X. O
  82. *************************************************************************************************************************/' W+ h1 x9 Y' z- ?5 m5 Z9 y
  83. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)5 z; \8 b* @2 c3 S, ?
  84. {
    1 ~/ C0 }# p* p4 b" |# j; E4 O
  85.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟' d8 s/ w' P/ c* u! f+ j% S
  86.         DMA2D->CR = 0;                                                                //先停止DMA2D# I, j( `! F6 n. d9 w# E/ s
  87.         DMA2D->CR = DMA2D_MODE_MEM<<16;                                 //存储器到存储器模式! h6 p- [3 g# t2 Z& V. K
  88.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数8 X. }$ ~2 f+ r6 z. X
  89.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
      Q8 ?+ R  ]; J2 i; @1 ?# R. ~# c6 y
  90.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
    , b2 I9 N7 F4 n
  91.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移 8 I6 k. u/ D( E% X8 `0 k& y; M. A
  92.         DMA2D->FGPFCCR = ColorMode;                                        //源图像颜色格式
    ' z2 X1 x2 b( U9 Y, j: ~
  93.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    3 V& {# [$ N  e0 @
  94.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
    4 [* a* k3 Y$ v+ \( F
  95.         
    * L; C- R& z- s( P! E% ]( G
  96.         DMA2D_Start();                                                                //开始传输" _, b! ?5 l' p8 n
  97. }7 A7 s. V8 _' O
  98. & A) Y$ w& U1 b9 I+ }# T& p! }. M

  99. ' N, M, o3 K( ~" O6 R0 T9 C1 }9 C6 a
  100. /*************************************************************************************************************************
    , V% F# s- Q+ n7 q# z0 x
  101. * 函数                        :        void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, 1 @9 P! }8 _* h# l& ]
  102.                                                 DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)+ I4 ?$ y7 @1 C2 L0 b( _0 t
  103. * 功能                        :        DMA2D进行矩形图形填充(会执行像素格式转换)( ~' t2 h) b0 b# i% `. Q* j7 x
  104. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);7 [: K/ _6 B+ a( ^% C: A1 o$ Y
  105.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    ' U5 x9 T" T! ~: [* t" G
  106.                                         SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式
    6 E3 R+ P8 \  K: C
  107.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    " t6 `$ R% w" K( l0 e9 O' T6 C. I
  108. * 返回                        :        是否设置成功
    ) u7 V7 t: t) g; [: `
  109. * 依赖                        :        底层宏定义3 n; e9 ?$ e6 U6 `5 a4 H6 F& ^3 E
  110. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    + ]9 X8 x. N% @- s4 C) N
  111. * 时间                        :        2019-10-28
    3 Z- ~' C. k! p8 y
  112. * 最后修改时间         :         2019-10-28( m) G9 p8 b7 d0 g5 @/ E; M4 I: n* B( t
  113. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束+ F% p: \; p3 f' q% {9 c
  114. *************************************************************************************************************************/
    % i8 W0 }8 o- @# W) F! Q' j2 `
  115. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    6 p* ~" T7 s% b% `" H$ y
  116.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)& a( H6 [6 Z, t5 }  j6 h( [2 {$ b1 P
  117. {# T; T& G) R. }8 {4 L, {
  118.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟( T: E0 @- p$ D- S0 v7 ?
  119.         DMA2D->CR = 0;                                                                //先停止DMA2D
    9 k- U% f' D8 w: z
  120.         DMA2D->CR = DMA2D_MODE_MEM_PFC<<16;                        //存储器到存储器模式-激活PFC
    % i1 Y* U$ T. H) w2 b
  121.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数' G% _9 d$ B2 r; m3 h% i: Z9 U- j
  122.         DMA2D->OPFCCR = DestColorMode;                                //输出颜色格式6 U# T- L% z& U& |' H2 G
  123.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址& r- y. z' w4 _& r
  124.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移
    . M, |& u+ L  V9 ^
  125.         DMA2D->FGPFCCR =((u32)Alpha << 24) |  ((u32)AlphaMode << 16) | SourceColorMode;                        //源图像颜色格式
    % H+ H+ I! N9 {. ?/ O4 M2 E
  126.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    / c5 z1 ]* s- e
  127.         DMA2D->FGMAR = SourceImageAddr;                                //源地址# x' ]) @. W7 ^
  128.         
    5 D1 {) Z" p% O! I6 G/ B2 t
  129.         DMA2D_Start();                                                                //开始传输
    # J% w2 o( Z# Z- [5 ^/ J' @
  130. }
复制代码
  1. /*************************************************************************************************************: z- \+ I! I7 v+ S; _8 R8 m
  2. * 文件名                :        dma2d.H
    3 G, J+ H# U: X" N/ t8 z% B, U
  3. * 功能                        :        STM32F7 DMA2D驱动6 i) b$ {  {2 m
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>- G! v+ Z5 X* @3 P' p2 j
  5. * 创建时间                :        2019-10-29
    ( E+ F0 h% u2 m1 L/ z
  6. * 最后修改时间        :        2019-10-29  Q; h6 w' ?1 Y- X; A  J* O
  7. * 详细:                        
    / q8 Z# S1 O- N. G
  8. *************************************************************************************************************/        
    " F' V& v# \# d: g# S
  9. #ifndef __DMA2D_H_% a, U/ T, X0 l  @/ x1 N" s
  10. #define        __DMA2D_H_           
    " [7 |1 n9 n' z) ~
  11. #include "system.h"
    0 |5 }- @) z5 S3 v/ G$ X) X. l/ K
  12. 2 E. U' F0 s! a* L& J+ O' I; N% N

  13.   `8 q) u0 N3 R
  14. typedef enum9 C0 V% O' T4 H
  15. {
    9 K; W, [  Y7 ?7 R6 [& o. s
  16.         DMA2D_MODE_MEM                =         0,                //存储器到存储器(仅限 FG前景色 获取)/ ?1 m  f5 ?) |# Y- u
  17.         DMA2D_MODE_MEM_PFC        =        1,                //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)
    ' M8 z6 U! e1 v2 ^, ]
  18.         DMA2D_MODE_MEM_MIXED=        2,                //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)/ p! K8 V5 P- j5 @5 H
  19.         DMA2D_MODE_REG                =        3,                //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)
    * X5 y1 M3 e3 f8 s
  20. }DMA2D_MODE;1 y, _. p: ]3 W2 R
  21. 6 {; D6 J; ~. b. E6 W0 l+ G1 B! |7 |
  22. //颜色模式
    ( f; x" Z: W4 O
  23. typedef enum
    5 M8 a6 S8 ^$ R
  24. {. }9 a. ^" U0 f; V$ O5 K' I, t
  25.         DMA2D_COLOR_ARGB8888         = 0,
    3 \' j, P* e- @- M- J
  26.         DMA2D_COLOR_RGB888                 = 1,' j8 F( O6 x% S+ I4 F
  27.         DMA2D_COLOR_RGB565                 = 2,
    0 z/ b$ U  V" x8 {  h0 k: M# t
  28.         /*DMA2D_COLOR_ARGB1555         = 3,
    , ^8 w0 H) Q* W+ m
  29.         DMA2D_COLOR_ARGB4444         = 4,
    ! u( @: c# q, {7 U, G. I+ {
  30.         DMA2D_COLOR_L8                         = 5,        //8 位 Luminance( t# l% K6 f4 d3 C  s/ }+ ?& e
  31.         DMA2D_COLOR_AL44                 = 6,        //4 位 Alpha,4 位 Luminance
    6 w$ W% ~# s' {" c1 Y
  32.         DMA2D_COLOR_AL88                 = 7,        //8 位 Alpha,8 位 Luminance
    , ^& Q, t2 U6 [% ~3 F5 B3 b6 G
  33.         DMA2D_COLOR_L4                         = 8,        //4 位 Luminance5 E" ?& \/ j4 ^- E) v; [; ~# a& C
  34.         DMA2D_COLOR_A8                         = 9,        //8 位 Alpha
    9 k! b, F& ?, I5 _
  35.         DMA2D_COLOR_A4                         = 10,        //4 位 Alpha*/
    - s* n6 B; D+ H$ R5 K/ ^" ^
  36. }DMA2D_COLOR_MODE;
      G  G4 i( m5 b/ H

  37. / D* L& W+ J! {/ w- V

  38. 3 a! k2 g, s! `# j) A
  39. //Alpha 模式! M: i4 M& i4 P- g  i* p
  40. typedef enum
    " b# d5 r2 y) E( R5 G. g
  41. {
    ) ^0 I  j! ]5 Z5 _! b  ]* l1 e
  42.         DMA2D_ALPHA_NULL        =        0,//不修改前景层图像的 alpha 通道值" Y* L2 u+ I- ~
  43.         DMA2D_ALPHA_REPLACE        =        1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]% ^8 e% Z6 l' G) {& }
  44.         DMA2D_ALPHA_PRODUCT        =        2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积
    ! B2 I  f; K: a4 P5 |$ h7 ]
  45. }DMA2D_ALPHA_MODE;$ B7 E1 D5 h( M, u" r
  46. : n  G7 Q4 n$ O: C# a
  47. : ]! Q8 Q3 Y, i7 |* ~4 [' ~
  48. __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;}                //终止传输$ g8 Y9 q  C* }5 L; H
  49. __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;}                //挂起传输' k$ c: k6 a) m* X" ~. D
  50. __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;}                //开始传输7 a; d$ ^0 R4 g6 r
  51. . B8 _# {; h* J; B& T
  52. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color);        //DMA2D进行单色填充) G- ^0 z  S, N1 }0 L( N; {
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs);                                                                                                                                                        //等待DMA2D传输完成' p% ~  f: F: W0 n
  54. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充
    7 k7 C; D7 Q: F. ]/ j: V# d
  55. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    4 K$ A7 H6 @' \7 X' I1 ?- L" k
  56.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)4 S2 F7 [: P# U/ ~
  57. #endif //__DMA2D_H_
复制代码
  1. /*************************************************************************************************************
    , w8 K& R2 E5 L* N0 W( S# R
  2. * 文件名                :        DMA2D_GRAM.c+ `& x" P% q& i" A) Y
  3. * 功能                        :        GRAM相关操作
    , i8 V: P* W( z$ X/ ]/ W! W
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    2 J: n' w& Q+ j' X
  5. * 创建时间                :        2019-10-30
    , b& q. I' c) o0 T# R2 Z7 Y
  6. * 最后修改时间        :        2019-10-30
    . [* h" g# b6 L: N
  7. * 详细:                        显存相关操作接口
    ) T+ M7 y: F7 h  d
  8. *************************************************************************************************************/        % y5 t) q0 U* i* P
  9. #include "dma2d.h": b8 d1 [+ F! q7 e6 x5 ], d  u+ O: [
  10. #include "DMA2D_GRAM.h"
    $ D! V, a6 ]/ N/ m& M
  11. #include "SYSTEM.H" ' D; `& n% C2 _

  12. ' w! Q! I  ^( \( M
  13. //基本接口
    0 e% {% T/ A' F" z" w
  14. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //32bit色彩GRAM显存画点5 ]& Q! u& _% f) L! {6 u. @1 {
  15. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //24bit色彩GRAM显存画点
    ; A5 L& A* S$ i* @
  16. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //16bit色彩GRAM显存画点; {" k$ p% {  L. t5 D4 t
  17. 3 L( U  I7 a3 k

  18. ; g& U/ T1 o) u+ h  m+ x+ ~
  19. //GRAM相关接口-16bit* C+ @! d# n6 N5 G6 g3 J
  20. const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit = " z0 u- K+ f* ~; ?/ F( G2 x) j4 p
  21. {
    $ c  g: H% j4 H' V0 i
  22.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit,                        //GRAM显存画点(RGB565格式)) w, S' ^' I7 s: i
  23.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    & @* U+ T2 C4 N5 V0 U6 C! i4 ?/ D
  24.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    * F# n7 J, Q" h: V6 r/ |
  25. };% |- w0 U0 h' Y# t$ ]

  26. # m* f/ r1 ^1 ?& R0 {& f% e" J
  27. //GRAM相关接口-24bit
    $ \' x8 p9 G( @! y6 u7 J2 c* f
  28. const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit = ! U" B: j5 T, {) c; S  _
  29. {% P+ _- p' A& N3 ~
  30.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit,                        //GRAM显存画点(RGB888格式)
    : R  n) H) d. l
  31.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    . G. ~5 g  A: C, B
  32.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    % K* B4 u1 f/ l' k( V
  33. };3 y6 F0 l, ^7 ^8 C3 L

  34. ! |2 g* \! D3 w; P
  35. //GRAM相关接口-32bit: E  D1 J% B3 L2 ?
  36. const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit =
    . U7 e* t' R: U% }6 Z% g
  37. {
    ( c6 o. o8 d; t6 h( T) L1 `3 a
  38.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit,                        //GRAM显存画点(ARGB8888格式)1 H  U# k7 |: n; U+ c
  39.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充/ C2 K- ?% V# i
  40.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)* }- U9 e: q6 A  R* J+ C' E2 s
  41. };
    1 h1 U! P+ |& B

  42. . K9 c, f1 y. y, F) B
  43. /*************************************************************************************************************************
    7 T0 Y& `5 j* I2 ]! D
  44. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    9 J4 ^. h( k% L) Y" E9 e
  45. * 功能                        :        GRAM句柄初始化(不会申请内存)/ D: O9 F. X( }
  46. * 参数                        :        pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式+ l( Z( ^& n# ^  Z3 g
  47. * 返回                        :        无6 T  [6 d: C0 u, S. I5 \, X# q
  48. * 依赖                        :        底层宏定义
    1 d# J: m. n' g: d: T# |/ L4 J
  49. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>% N  ]/ o3 f# u, S0 q7 \
  50. * 时间                        :        2019-10-30
    , s$ O/ M% `0 {" }, B* }
  51. * 最后修改时间         :         2019-10-30
    ! M& r7 E8 u, Y. r
  52. * 说明                        :        初始化显存7 g* n) ^' c/ N+ Z9 H# ^
  53. *************************************************************************************************************************/1 a+ U3 M+ N9 s$ l
  54. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)9 b5 e+ L* N7 y1 u
  55. {9 x1 E+ y7 X9 n2 ?$ ?) e  D
  56.         while(pHandle == NULL)# s5 ^& Y8 u3 B8 m6 b6 @* y' t
  57.         {' v- `& i2 K0 M
  58.                 DEBUG("无效的句柄pHandle\r\n");! p$ Y9 }% Y$ f5 U/ D4 E: @
  59.                 SYS_DelayMS(500);
    , o+ m/ S7 J7 F5 Z: i
  60.         }
    0 \0 a. |6 G7 z4 z/ J
  61.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
    , v0 U! Q( W8 c3 b1 k
  62.         pHandle->Width = Width;                                                        //GRAM宽度' \/ J. }, h1 J7 r3 I2 ?' [" }; r# L
  63.         pHandle->Height = Height;                                                //GRAM高度
    , W6 O2 H9 J; g- M' d$ ]3 S
  64.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针$ o1 k9 C8 Q, Q7 ]+ O) g" F
  65.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针3 E! s; Y/ _) ?+ _- k9 p  E+ Q
  66.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针: r4 J" W( u* G! Q# o
  67.         //像素模式
    - E. b" }# n1 C% q1 L1 ]) G
  68.         switch(ColorMode)  ?" s  O. ~: `; m; ^0 F, ?" j
  69.         {$ I9 n9 N0 D0 ?8 d6 j- p
  70.                 case DMA2D_COLOR_ARGB8888 :
    ( P6 @. y# ]+ }( A# g1 X5 k
  71.                 {
    % R4 ?, i& R* G6 D' f5 _
  72.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;. O7 z# X2 o1 _5 Y
  73.                 }break;, i, v3 A. t( \  t+ |; p
  74.                 case DMA2D_COLOR_RGB888 :
    1 u7 S& x; m) }( s
  75.                 {
    $ h, R9 p) d9 x8 [
  76.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
    & d( Z2 j' ~4 G8 s+ B$ k3 o( o* \
  77.                 }break;; e9 d2 `# D7 S
  78.                 default: //DMA2D_COLOR_RGB565
      f5 J5 c' J+ D* H. b
  79.                 {
    : |: T& |9 ]# k1 f
  80.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
    9 a7 _; `( e7 O4 k3 Z
  81.                         ColorMode = DMA2D_COLOR_RGB565;, ]  k. X/ X7 k7 T. _
  82.                 }break;
    + y& f2 @9 ]# u3 d- t5 ?
  83.         }
    1 x' ]  N3 w6 S4 O2 @, ~5 G( H! T
  84.         9 n7 y3 `* _$ b( u
  85.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式, V6 L* h( u7 \
  86.         pHandle->InitStatusId = DMA_INIT_OK;                        //初始化成功
    ! M1 q" R' {8 s7 `5 q! s/ |- l# Z
  87. }
    3 }' r4 N% H* w& Y+ ]

  88. 4 P. y; p3 _* t! O
  89. /*************************************************************************************************************************# i0 `/ V: z- P
  90. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)
    4 W/ _6 |  Q4 J0 X, [7 D8 |5 p3 e* G
  91. * 功能                        :        创建一个GRAM(会申请内存)
    9 h( }! p% f0 L* m% F
  92. * 参数                        :        Width:显存宽度;Height:显存高度;ColorMode:颜色模式
    & k  X" ]; V& I" `$ U: ^! r
  93. * 返回                        :        NULL:失败;其他:GRAM句柄) R( M! c6 N1 S, d* b
  94. * 依赖                        :        底层宏定义( P/ J8 X* r6 `8 X2 F# n
  95. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>" M5 O/ ?- ]' N, k' {4 }
  96. * 时间                        :        2020-02-02: ]6 _% Z6 O1 m9 f8 v7 w/ `
  97. * 最后修改时间         :         2020-02-02
    0 W2 W4 O2 |# I# f
  98. * 说明                        :        初始化显存' C/ d4 ]# P# J
  99. *************************************************************************************************************************/
    2 k( k2 ]% z2 E6 j4 x
  100. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)' t0 p" s1 G2 q3 O
  101. {9 I3 P/ f# q) B. t( h) j) I. q& Q
  102.         GRAM_HANDLE *pHandle = NULL;
    4 N3 W  X! Q! N2 e8 C
  103.         u32 GRAM_Addr;
    6 t: q# m0 T8 V2 R: A/ K4 ^
  104.         
    0 d9 T) i) D5 h" m3 E: K
  105.         pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE));        //为句柄申请内存, z) T$ l+ G8 ?3 a# V
  106.         while(pHandle == NULL)' q- ]) T% x( p% g
  107.         {
      t, \4 I( i  q8 D1 }
  108.                 DEBUG("无效的句柄pHandle\r\n");' o! R4 n, l2 B  a* I/ j/ T
  109.                 SYS_DelayMS(500);
    % T6 U8 W% p' N: m! `( a4 h, _+ P( `
  110.         }2 c. L8 O& {. V+ A( \6 I; j
  111.         8 f' [8 W! b# d0 k7 K0 P* z
  112.         switch(ColorMode)' }& N- p6 k" h
  113.         {
    0 f# N. `1 w! S
  114.                 case DMA2D_COLOR_ARGB8888 :4 V6 {: n: {/ z* K/ u
  115.                 {2 p+ I$ u& R6 X! a
  116.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存
    ! Y8 {& A7 i* h. D5 [9 f
  117.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
    2 i8 @5 B8 o+ ~/ M
  118.                 }break;
    5 `" s3 e, Y: u9 v
  119.                 case DMA2D_COLOR_RGB888 :
    . ~  K( q* e- l$ m2 q
  120.                 {& R# q$ p% j+ v7 q( p6 b0 S4 m
  121.                         GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height);                        //为显存分配内存
    5 n+ [6 a3 k" _5 o0 H! P
  122.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;# f4 Q0 @: H( w. w
  123.                 }break;' z6 h* o, j' y, w4 a3 X3 h
  124.                 default: //DMA2D_COLOR_RGB565
    : K  U' L/ A# s; E8 u
  125.                 {
    % ?2 D+ V. w1 M* s8 ~* O' k
  126.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height);        //为显存分配内存1 O, q+ i4 l' Q1 V
  127.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
    ' c; G; h) E+ ^- {7 d5 {9 v( m
  128.                         ColorMode = DMA2D_COLOR_RGB565;  |' ?+ m3 y8 V  m
  129.                 }break;
    % n2 B0 k/ z6 {2 ?9 @
  130.         }
    2 C; G5 M% F6 w; D
  131.         
    $ d  z( y3 e+ ^9 c
  132.         while(GRAM_Addr == NULL)
    ( l# @' {8 u+ h7 q$ o4 i! b
  133.         {
    6 i1 K7 S  U. b3 o, @: K+ i$ C' F  S+ j
  134.                 DEBUG("显存申请内存失败\r\n");
    $ i" s# ?. d+ R3 A9 s% c% \2 X. o9 |
  135.                 SYS_DelayMS(500);7 m, y$ e5 H4 O* _. E3 r- e
  136.         }
    / i* P/ t2 T/ v+ m+ V
  137.         
    , r8 d+ V* F4 p8 K5 X
  138.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址9 V( w( {, ]" C0 b. I9 E9 O
  139.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式+ ]/ n+ U& K6 L- ~" ?9 z0 Z
  140.         pHandle->Width = Width;                                                        //GRAM宽度
    ' J3 n! m1 q0 \5 J  i5 |
  141.         pHandle->Height = Height;                                                //GRAM高度
    ) W9 a/ o  Z' T8 H5 T
  142.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
    7 H9 B% ]5 j6 v' W) ^' `
  143.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针
    " U+ }" w0 c- t
  144.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针( I* o3 h& F; W3 U  G
  145.         pHandle->InitStatusId = DMA_CREATE_OK;                        //创建成功
    + j- E* X6 N% q' H
  146.         6 h* n) S0 e; e2 z- f
  147.         return pHandle;. c( I5 k( {; t
  148. }. Y+ V. l" H3 A. }; X9 r
  149. 8 I* P+ `7 [: t. ^( Z

  150. % l6 I, h2 y1 j' r' R/ V* p

  151. 7 V* O; ^, g- _, {, ]7 B
  152. /*************************************************************************************************************************
    ( f( N3 b' t$ s, s2 L! A) ^
  153. * 函数                        :        void GRAM_Delete(GRAM_HANDLE *pHandle)
    ' a; [, h: ]) @" a7 c4 M: J* W& K
  154. * 功能                        :        删除一个GRAM(会释放内存)
    1 C" h# \5 o* D: l! t" c9 |
  155. * 参数                        :        pHandle:GRAM句柄
    $ u/ [! d- w3 ?, \7 x
  156. * 返回                        :        无' k+ E# Z" ]3 v; S/ i) H2 z
  157. * 依赖                        :        底层宏定义
      ~8 S! D+ C4 K, I
  158. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>! K: r' M" B& d+ ?, E$ f
  159. * 时间                        :        2019-12-161 f  G. W' Y! ~; A& e: J# d8 p
  160. * 最后修改时间         :         2019-12-163 e% j+ E5 V6 Z7 u2 j" {
  161. * 说明                        :        用于删除显存,释放内存
    / o* k8 s8 G) X& F( }
  162. *************************************************************************************************************************/4 d$ l6 k' u. P3 r+ u( f
  163. void GRAM_Delete(GRAM_HANDLE *pHandle)
    / o, C. Q# L0 k, r
  164. {  j) T8 P* w8 V0 \
  165.         if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)/ d* H# Q% E' g4 K' r
  166.         {1 i' I" H: g( K
  167.                 if(pHandle->GRAM_Addr != NULL)
    3 s- \* w! Y/ }' m; p
  168.                 {
    . X) }2 t3 f8 J9 n
  169.                         GRAM_free((u8 *)pHandle->GRAM_Addr);                //释放显存内存( w& W$ ?$ D2 r+ v# x
  170.                         pHandle->GRAM_Addr = NULL;
    9 O! a; _+ S. l- |! \8 w
  171.                 }
    . w6 }+ N0 q6 x4 v" p4 v4 z
  172.                 pHandle->InitStatusId = 0;
    / R) N% V4 N" @, d& I
  173.                 GRAM_free(pHandle);                                                                //释放句柄内存( G3 a6 S) j1 Y2 ?/ I4 l( L
  174.                 pHandle = NULL;9 M: u' n% h) I
  175.         }3 P7 b3 Y4 B8 w# s* s! A( e& i
  176. }
    4 G  p. j5 M" q6 c) B+ Z1 i2 W
  177. # O0 C  k5 M' Y* }6 \! F' f

  178. ! }4 f  }" f( K8 U- L! {+ x
  179. /*************************************************************************************************************************
    0 k  E! ~6 r( Y0 o( g$ k
  180. * 函数                        :        void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)# A! @, Q7 m* ?
  181. * 功能                        :        32bit色彩GRAM显存画点
    $ `# l6 a& y! ~- u$ e
  182. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    : F( t. _: I+ ^! J# h
  183. * 返回                        :        无4 u! }6 W$ J* I% a- O2 d$ Z+ P0 ~
  184. * 依赖                        :        底层宏定义
    # D5 U" d2 E% l' \3 C. _1 f! F4 Q
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>+ S5 ^# s9 H* ^
  186. * 时间                        :        2019-10-30
    # G! v! i' z' ]  a! d4 b
  187. * 最后修改时间         :         2019-10-30
    0 S0 [. p" h% T; x% R$ H
  188. * 说明                        :        在显存中绘制点2 ?9 u- B( r9 T* ^  y' W$ w
  189. *************************************************************************************************************************/3 K0 Q3 ]3 L" }
  190. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    , Y) z% Y2 A# ?) j4 U
  191. {
    6 a& K& N2 I0 N  y7 H# u) P
  192.         pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;+ ^: _4 J6 S2 i3 |! h2 L; o7 K
  193. }
    1 K* K8 \! D9 R
  194. 1 w$ q6 d, o' q$ _; r9 X

  195. ) |( Y! ^) Q/ K. Z8 R/ M
  196. /*************************************************************************************************************************" M% o% [; t0 J" s$ t3 V4 [  v
  197. * 函数                        :        void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    , R5 M- g% w" A: e4 l: f
  198. * 功能                        :        24bit色彩GRAM显存画点7 u8 K( Z1 M, J9 i1 V7 U, E% G2 \
  199. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色" D( O: B( @* ?; E
  200. * 返回                        :        无
    ; w% D: _3 K, ^- J+ c* {4 W
  201. * 依赖                        :        底层宏定义
    5 t" D- r! G0 Q" v$ d( |
  202. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ) s( D4 ?6 Z$ ~; o/ K# r8 g$ m1 P2 ]
  203. * 时间                        :        2019-10-306 j* X4 M% F  L: U4 @& g4 s
  204. * 最后修改时间         :         2019-10-300 x! t/ s  b# J- [: s5 F
  205. * 说明                        :        在显存中绘制点
    ( i" `* I# X+ a* C$ A; @  ~
  206. *************************************************************************************************************************/
    * A, \% W# F: O8 p+ [
  207. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color). \( p  m9 W. s% \1 `
  208. {/ x! L- ^/ O0 {+ B
  209.         memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);
    3 L9 }! O- h6 M5 e/ H6 f
  210. }
    : I( ^( W/ s  }
  211. 8 B9 ^1 C/ L0 n$ p1 S- ?. _8 F
  212. ! n8 n$ k( v2 [$ j* B
  213. /*************************************************************************************************************************
    & G0 {5 d! I9 L+ q
  214. * 函数                        :        void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)3 I, A' `4 q# n2 A9 o4 t& j
  215. * 功能                        :        16bit色彩GRAM显存画点6 o4 I6 Y$ \* I# }2 n& d
  216. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    9 r2 b3 ^% l4 C. L/ w
  217. * 返回                        :        无
    ) Y) f1 s% ~, W2 e; H
  218. * 依赖                        :        底层宏定义% l# M7 w  A# H9 r5 {. k% \! h, `) g
  219. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>7 j, W4 \$ N5 P
  220. * 时间                        :        2019-10-30# X8 g( ]* m# P; M) e
  221. * 最后修改时间         :         2019-10-30
    " F+ p# L' S! r
  222. * 说明                        :        在显存中绘制点
    . n, `: k, ~1 t. T" C0 {
  223. *************************************************************************************************************************/" E3 _. M) v& |; _5 S. Y
  224. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)# O- y2 l( P. P% M+ |
  225. {7 l4 l7 n, T( G/ X* ^; `! z- r! p
  226.         pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;1 g2 V! G; [5 U/ D# M& R
  227. }: Y; U' h% x+ T9 M; d, A

  228. % c) ~& w" M- s3 r5 q
  229. # n' I; @, ?* Z0 U
  230. # X+ _9 p+ d1 M3 [3 q9 g# F
  231. /*************************************************************************************************************************
    ( S& w) \: [; h
  232. * 函数                        :        void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)        ) X& {- J( {. t+ Z
  233. * 功能                        :        GRAM矩形填充(使用DMA2D)
    / k( g/ c9 {- L9 I! Y5 d- f: g
  234. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色# V  _" x/ ?& y4 Q& g$ y
  235. * 返回                        :        无6 B$ g' ]: N! x6 N% X  U8 {! b
  236. * 依赖                        :        底层宏定义
    ; x- k% ?! N- ?& V( {* R
  237. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>5 r* j! S9 r; Y. L( H
  238. * 时间                        :        2019-10-30
    * P& K% [; o1 I" v6 [
  239. * 最后修改时间         :         2019-10-30  @! e/ D1 X2 }: m& k- n
  240. * 说明                        :        采用DMA2D实现$ Q% v$ w* u' m" Z6 a$ g2 X
  241. *************************************************************************************************************************/3 E7 Y- E1 D* E$ e- `
  242. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)1 t( A$ b; B% X- o$ Y3 _* ^
  243. {
    ! s7 h+ v3 A7 y! k4 y7 y
  244.         switch(pHandle->ColorMode)
    & N; K) [3 D' O9 F! \5 t) k8 b: X
  245.         {; W  f6 W+ \0 x  a! v! z2 Z9 {
  246.                 case DMA2D_COLOR_ARGB8888 :
    $ g' U3 c# b7 S$ Z  U$ i6 ^  j
  247.                 {
    * x( I1 J1 n) R: v  Z
  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进行单色填充
    7 c; ?, e* ^0 x4 b; O) l
  249.                 }break;/ _" F' k9 f+ [7 g: P
  250.                 case DMA2D_COLOR_RGB888 :
    % l" k; t" B$ h1 p" Z6 h6 m: b& _
  251.                 {* V. R# l9 g) u) u
  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进行单色填充& y: a  V- P6 r% f  ?9 R2 Q
  253.                 }break;( D, e4 ^0 L% r. j/ k6 v$ V5 X( v$ M- d8 K
  254.                 case DMA2D_COLOR_RGB565 :2 \# D7 ^* P  u1 |- S% @
  255.                 {0 V0 I2 L; p. N2 R0 g
  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进行单色填充
    ( J; }7 \+ `+ E
  257.                 }break;- X, a6 y* [& d
  258.                 default:return;5 b- i/ z( F8 Q) \  A
  259.         }
    % w; W/ [. U- x' s
  260.         
      T. h' K8 `6 T! p1 K
  261.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                                                                //等待DMA2D传输完成1 i! w9 P+ _. g/ h% E# u8 Q; d& r0 Q* l
  262. }
    & V- s% @* G8 n" w8 X2 c* H
  263. % ]& I9 p' {+ f( x( y; v& s
  264. 0 X  J5 Z1 P, R+ p7 m
  265. /************************************************************************************************************************** H% ~6 [6 p7 S+ l
  266. * 函数                        :        void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
    4 j: u" H* R8 f, a/ @4 B0 L
  267. * 功能                        :        GRAM清屏(使用DMA2D)' w% ?5 }. l; R. n7 c/ V2 L# s
  268. * 参数                        :        pHandle:GRAM句柄;color:需要填充的颜色
    * [) A9 c# {$ x( B. W2 B4 v
  269. * 返回                        :        无) W& L4 T' Q. T. P( U
  270. * 依赖                        :        底层宏定义: J& L( G# K$ ]4 G* `) o7 m. c
  271. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>( c1 s  J+ C6 A4 D7 V
  272. * 时间                        :        2019-10-30
    - J* S5 }' W  N# ]  p: l3 n
  273. * 最后修改时间         :         2019-10-30  F6 Z+ F" h2 U6 X. [; I& J
  274. * 说明                        :        采用DMA2D实现" Y* `5 S3 E* T0 M. I4 x
  275. *************************************************************************************************************************/
    ; `4 A& A0 R" [0 r* M- j
  276. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
      W; H' I3 i& g5 `' u
  277. {) T$ g5 T& H0 O" f  \  e4 H- v
  278.         switch(pHandle->ColorMode)3 A: b8 t( v4 w) l3 k( u( c) w, F
  279.         {" Y' v9 i. R# |8 ?4 t
  280.                 case DMA2D_COLOR_ARGB8888 :. h0 Z: s& n" A: b( ^- c4 C3 |9 p
  281.                 {; W' m6 d9 a: z: r) M$ K! G2 }
  282.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color);        //DMA2D进行单色填充
    : ?  c) p' j. Z: v
  283.                 }break;
    5 `9 D4 L7 g( [4 w" E
  284.                 case DMA2D_COLOR_RGB888 :
    * K. @2 W9 I; X  Q. h" Y6 x% w; j
  285.                 {
    % `- J  E" q# w. D2 n/ w; ?- t
  286.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color);                //DMA2D进行单色填充" }8 _- s' q6 A0 \, t4 P* a0 {9 ?
  287.                 }break;* i. Q. r' m0 M" b, v! [
  288.                 case DMA2D_COLOR_RGB565 :
    . P8 W* g" o) z; ]2 o; f9 Q6 f$ X
  289.                 {
    1 k0 i/ B1 [) b! T
  290.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充- Q) ]2 {+ K6 ~4 C$ ^+ B4 F0 }
  291.                 }break;
    ! L) J: S  h+ h% V
  292.                 default:return;! v, t. i$ k' e2 j
  293.         }
    . e4 e' h" r+ C' V# i! E8 A5 G
  294.         SYS_DelayMS(5);
    1 |; m6 B4 Y' l& p* i
  295.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                //等待DMA2D传输完成0 w& F. [" |& V4 c. L( S1 I+ k+ [
  296. }
    1 @- L. ?7 {' c2 t
  297. ! q& G3 X: _8 g# t0 z
  298. " `, d8 H# E8 d$ c9 l% {
  299. /*************************************************************************************************************************, C3 h. g; i5 n8 K
  300. * 函数                        :        void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, * r9 l0 q3 U5 g& t( s5 R; r  W
  301.                                                 u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)* B& X' V. y( U
  302. * 功能                        :        GRAM局部拷贝(支持Alpha)
    , }; n' {3 s6 L! O& _2 N; E
  303. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
    ( N. V: L7 R, ^! d5 I
  304.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度
    ( h& R2 s/ N; n% m, i3 Z
  305.                                         AlphaMode:alpha模式;Alpha:Alpha值;3 V4 {; U3 T/ Y0 b' r" C  [' M
  306. * 返回                        :        无
    ( h% c& r, G2 A8 @& ~( B, j
  307. * 依赖                        :        底层宏定义
    . R* `  {! n* M; R% D( U
  308. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>9 t: a* W0 h7 d
  309. * 时间                        :        2020-02-020 O! y* G8 r! O
  310. * 最后修改时间         :         2020-02-02
    : u! p# n1 a: V1 r
  311. * 说明                        :        不会检查GRAM大小,请确保GRAM' ?+ M; _0 y- n: Z/ t3 k
  312. *************************************************************************************************************************// D+ q0 G9 z2 W  R
  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)
    & u5 x$ [! v. V5 G' o
  314. {
    3 p" q5 R" A1 @! y- k
  315.         u32 SourceImageAddr;        //源图像地址(通过地址控制开始的X,Y坐标)
    0 `* A" E8 y" C* c! ?
  316.         u32 DestGRAMAddr;                //目标GRAM地址(通过地址控制开始的X,Y坐标);
    . z) X8 a8 c4 n  y4 c- B2 q* [
  317.         u32 PixelByteSize;                //像素字节大小
      h3 r  `: D  g5 A# }/ Y
  318.         : G! w$ U6 x0 l1 m+ v5 u* T1 J) U
  319.         if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL)7 O# R5 r1 c. g+ y& N% Y5 b+ r
  320.         {9 X! v; ^. Y* {
  321.                 DEBUG("无效的句柄,pDestHandle\r\n");" E. m4 M8 I! U# o2 U
  322.                 return;
    3 M# e: n* @, K' K9 f/ P" @" x8 s
  323.         }! ~+ g5 D) A. r' G( R
  324.         if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL)
    9 F5 ~+ x6 F1 I7 j
  325.         {
    ( E, V- X2 G3 _6 k* v
  326.                 DEBUG("无效的句柄,pSourceHandle\r\n");) j+ G, m1 p5 w! P
  327.                 return;5 c# h9 k. b* z0 U# u* e- ]; i3 }
  328.         }
    , K+ ]3 [' u" ]
  329.         //源图像地址(通过地址控制开始的X,Y坐标) 计算
    , s* v- D" C( P2 A' v: G
  330.         switch(pSourceHandle->ColorMode)( |8 \' h3 ?6 J1 a
  331.         {
    ; I7 f" k, t& }4 f$ c& m
  332.                 case DMA2D_COLOR_ARGB8888 :" x1 ]3 a; h' w
  333.                 {
    8 \  X7 ~) R0 @( z2 \1 c+ `4 h
  334.                         PixelByteSize = 4;" |0 D. |& Y& i& O
  335.                 }break;  C' ^- p7 P9 a, v8 l
  336.                 case DMA2D_COLOR_RGB888 :
    ( z- ^2 J# q; c* X5 M& Z, O& d
  337.                 {
    ) X0 R: ^1 ]' c4 x' R
  338.                         PixelByteSize = 3;
    0 Y6 \; B# }8 r! X  E8 Q
  339.                 }break;
    # b' d# Q3 Y0 F) i' Z: y
  340.                 default: //DMA2D_COLOR_RGB565, N8 m2 j) u% w$ ^/ R) L
  341.                 {
    8 b2 I3 o8 X1 p% ~2 v
  342.                         PixelByteSize = 2;) p! H: `& {) p' y1 @
  343.                 }break;
    % P2 r5 r, I/ ?
  344.         }! B) q- ^: O& K) W. r* Z) U( c
  345.         SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize;        //计算源开始地址
      ]% c8 j' O7 v1 j; E5 v" K, i
  346.         
    * ]3 q  ~) z" s) y9 K+ A9 v
  347.         //目标图像地址(通过地址控制开始的X,Y坐标) 计算2 }& p1 m( X8 m1 G' f
  348.         switch(pDestHandle->ColorMode)
    % y; \( Q5 d+ B& i
  349.         {
    - ~4 J" |( m8 t* i! O
  350.                 case DMA2D_COLOR_ARGB8888 :
    7 b+ R. T% e9 T! V& o2 K1 v# E
  351.                 {
    * E$ K- _8 ~4 K, T: x+ K' k( \4 J+ q
  352.                         PixelByteSize = 4;6 G5 t% K6 y: i* [9 c
  353.                 }break;
    ; Q% I( {; H; t9 A8 \
  354.                 case DMA2D_COLOR_RGB888 :
    5 b! [) U3 U; H% n) ?3 r
  355.                 {
      `6 M& h& X9 ~3 `' O
  356.                         PixelByteSize = 3;! t/ |/ _$ i0 @2 V( S3 B
  357.                 }break;! C9 n( H8 A4 c
  358.                 default: //DMA2D_COLOR_RGB565
    2 I% \  R9 ~# g0 \# d
  359.                 {
    " g1 `$ e( k) ?! n
  360.                         PixelByteSize = 2;
    8 X% p7 E% v% l& w
  361.                 }break;$ V" E' B, y) C' @& {' I1 v
  362.         }4 Y' ^) B) D- m4 _. i9 l! `4 `8 U( U
  363.         DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize;        //计算目标开始地址
    ; C! B2 t- g7 C
  364.         //进行拷贝
    5 v7 e8 N$ ]) O4 ?
  365.         DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode,
    & F3 F% D; D- E: l/ \) O3 k
  366.                 pDestHandle->ColorMode, AlphaMode, Alpha);                                                                                                        //DMA2D进行矩形图形填充(会执行像素格式转换)
    - V# y* m3 E- ]1 X( _
  367.         DMA2D_WaitTransferComplete(200);                                                                                                                                //等待DMA2D传输完成* w6 I+ F0 q( C8 N3 r
  368. }! _1 P. ]: s3 P5 o7 S

  369. 8 G5 @/ h1 ~0 F" v" c5 P
  370. /*************************************************************************************************************************' }0 C6 X5 z% \; u$ P
  371. * 函数                        :        void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
    9 Y  ]) j2 |) X$ _
  372.                                                 u16 Height)
    3 m, [* f4 a1 j; r; ?" f& m5 A! L" l
  373. * 功能                        :        GRAM局部拷贝(不支持Alpha)
    6 z% k' r* ~4 |9 u1 B
  374. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
    1 H2 l, J' p' ~& D
  375.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度, I3 P, t+ j$ L6 d( d
  376. * 返回                        :        无
    , J9 W0 |; x3 y9 Y* O# ~' N+ Y( o
  377. * 依赖                        :        底层宏定义/ k7 Q, t) d( [- y: O1 K2 k3 M
  378. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>( h5 Z( W; e  b+ X, I
  379. * 时间                        :        2020-02-02& k1 G4 T: p) |
  380. * 最后修改时间         :         2020-02-024 i+ `1 @4 L. v+ k/ t/ A2 D
  381. * 说明                        :        不会检查GRAM大小,请确保GRAM
    4 R/ T5 j  x- u+ G, y0 Q
  382. *************************************************************************************************************************/* a% S4 E# W: w$ S
  383. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)
    5 W5 N! v4 [; Q6 a& o% ^$ M
  384. {6 i, r* s: W& B5 G% E; i) {: }% Z
  385.         GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);4 F( q4 I9 m4 r: o4 u0 M
  386. }
复制代码

8 I9 B0 F) x4 d1 ?: v
! o4 V) {  d6 P4 m
  1. /*************************************************************************************************************1 j& Z: F. X( r4 H$ J/ I" K
  2. * 文件名                :        DMA2D_GRAM.h
    ; b. t& t  }9 p% B2 e- F* `
  3. * 功能                        :        GRAM相关操作
    & S; U. Q% }4 I7 H- z! r
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 g  k$ b1 K6 h3 W- c+ J
  5. * 创建时间                :        2019-10-30
    7 K" ?/ W5 R! q% g3 a  L: l
  6. * 最后修改时间        :        2019-10-30+ h$ p2 I  M) L8 d
  7. * 详细:                        显存相关操作接口- j, b  r) U2 _. \* A# r
  8. *************************************************************************************************************/        1 \& X$ Q% e/ e4 u
  9. #ifndef __DMA2D_GRAM_H_5 k# ~  [& u' ~$ x1 x
  10. #define        __DMA2D_GRAM_H_           
    : u: b1 z$ T: A4 T( u* I: [  b' k' f
  11. #include "system.h"  b+ |& g7 T! f" l8 Z' _
  12. #include "DMA2D.h"( h' {/ _' r. F' N( y  W
  13. #include "SYSMalloc.h"1 W" J3 R4 f: g+ {! d3 z2 q
  14. 4 @4 y' }- }4 H. V
  15. //初始化状态id
    $ \$ C: [% P& [/ w/ H! H
  16. #define DMA_INIT_OK                0x1234423        //初始化成功(不可以释放)1 ]) q: X" F9 k  z2 W/ Y
  17. #define DMA_CREATE_OK        0x3643423        //创建成功(可以释放)% G: l* q* u. `. Z
  18. 8 J0 Z& @& ]3 i( r; ], l! I
  19. //颜色模式
    2 Y. w4 m8 V( v* j8 ~2 K
  20. typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;( P3 T" L' C# Y! C1 o
  21. 8 ]4 f( ~% G/ d% V

  22. * S8 ?2 |4 x+ [- n) j- u9 `& R4 `
  23. //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告)
    , c1 R3 L- J2 b, t" H
  24. typedef struct7 N& e* X3 S( |6 n
  25. {. y8 b& L& c) T& {5 k+ \
  26.         void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //绘点函数
    2 Z( m& ]8 P$ r
  27.         void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                        //填充
    % p) e: h0 q( @) a0 `. E4 E8 w
  28.         void (*pClear)(void *pHandle, u32 color);                                                                                //清屏
    ; m# S% q! Z# H& e/ ^
  29. }GDI_BasicInterface;
    - R+ T$ B3 W) u* w+ K

  30. , I# h  \$ A) d6 t: u

  31. 9 \0 B: B- Z9 l! B2 H
  32. //GRAM相关接口-16bit( a( O% I% c5 {" C
  33. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;
    : H: j6 S( O- N" H/ J1 l5 h
  34. //GRAM相关接口-24bit
    , V+ R) E- X+ E6 q1 k' m- Q
  35. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;$ D$ [! v! L1 _0 a/ Q: i- p
  36. //GRAM相关接口-32bit. n& h8 {& z1 x. `! ?
  37. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;
    , T2 U- A( W0 x7 c. m/ v2 K

  38. * U( r  i" t0 }  C" T4 `5 P1 R
  39. //所需的内存申请接口! Q" A; z9 |% y! u
  40. __inline void *GRAM_malloc(u32 size)/ q3 s3 o/ K" V  B2 @3 Q
  41. {5 Z* @/ t# _1 b" j) m
  42.         return mymalloc(SRAMEX, size);                        //内存分配(外部调用)-使用外部SRAM, Q% I- q$ L) u9 {2 t
  43. }
    6 c5 N3 t% J+ i1 e
  44. : U6 b% T# U) C4 M4 p
  45. //所需的内存释放接口
    - i  T& i4 T1 c6 v5 g/ I8 R# Q
  46. __inline void GRAM_free(void *ptr)
      g. Q9 G& b* Q& ?+ Q3 e9 G
  47. {
    % q" E8 f/ A9 }3 x2 y/ L: J
  48.         myfree(SRAMEX, ptr);                                        //使用外部SRAM
    3 n/ n9 `' Q- |2 t, H3 h
  49. }8 o6 d% P! n9 w$ a! w0 P( o

  50. & a* g- E# R& [8 T7 H" u
  51. 5 {+ v+ j8 T5 \; _. n
  52. //显存句柄
      U. U  _+ S" s6 k" z0 s
  53. typedef struct
    $ G3 ^$ k% n, w( ], K
  54. {
    4 A' K! J6 X9 L+ e! z; u2 r
  55.         u32 InitStatusId;                                                                //初始化状态id2 Y! o1 b8 {( A
  56.         u32 GRAM_Addr;                                                                        //GRAM地址
    6 |/ D4 \) h4 i: v
  57.         DMA2D_COLOR_MODE ColorMode;                                                //GRAM显存像素格式
    / c2 E  I$ T9 q1 u( o, ~! V
  58.         u16 Width;                                                                                //GRAM宽度
    5 z$ c, J  Y% b1 M
  59.         u16 Height;                                                                                //GRAM高度
    + ~- W% }, F7 M$ q
  60.         u32 *pGRAM_32bit;                                                                //32bit颜色模式下显存指针
    , \$ v' d0 |( r; J" z: p/ a8 h1 J
  61.         u8 *pGRAM_24bit;                                                                //24bit颜色模式下显存指针
    - Z  ^6 G3 \* U; p' o
  62.         u16 *pGRAM_16bit;                                                                //16bit颜色模式下显存指针9 [$ x4 N# a/ [3 l0 v, w3 X/ s
  63.         const GDI_BasicInterface *pBasicInterface;                //底层GDI接口5 i% \8 ]& F1 e; d
  64. }GRAM_HANDLE;
    6 R1 [! B: T, r) J( L
  65. , j9 n5 e% m( n& |4 d
  66. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);        //GRAM句柄初始化(不会申请内存)
    ! O' P- H2 |$ L
  67. void GRAM_Delete(GRAM_HANDLE *pHandle);                                                                                                                                        //删除一个GRAM(会释放内存)( G; _8 C. [. p
  68. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                                                        //GRAM矩形填充(使用DMA2D)  h4 L( J8 N! Q) u# p! I0 t4 }( y5 }
  69. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color);                                                                                                                //GRAM清屏(使用DMA2D)
    6 l4 @" D& z5 [2 t7 ~
  70. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);                                                        //创建一个GRAM(会申请内存): ^# e/ @5 }; N5 v" |" B3 m9 R$ ~! C) }
  71. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
    ( P, W; X* V! Q5 x! k
  72.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);                        //GRAM局部拷贝(支持Alpha)! U* t3 o. D3 o4 X/ F; c$ v. ^
  73. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
    2 g8 F& B. f, o% {
  74.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height);                                                                                                        //GRAM局部拷贝(不支持Alpha)( a3 x! d) P% e$ E
  75. 6 `9 W8 a5 |6 A& f
  76. #endif //__DMA2D_GRAM_H_
复制代码
  1. /*************************************************************************************************************. L/ Q* z% J' d
  2. * 文件名                :        GDI.c
    / u& s- a: M5 J- ]0 f. }3 O
  3. * 功能                        :        图形设备接口(Graphics Device Interface)9 Q* f/ G& c, [+ N! X' {' l
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    7 m8 W/ T6 E4 L5 Y. }9 {
  5. * 创建时间                :        2019-11-02
    / {2 [: _5 t1 s' k0 B: F
  6. * 最后修改时间        :        2020-02-020 T9 `% ?: }' z# E. p7 v) l
  7. * 详细                        :        STM32F7 图形设备接口9 {1 @3 S. W: ?0 }; ~; Y
  8. *************************************************************************************************************/* A; E; ]2 k2 t% t8 P
  9. #include "system.h"
      O; z/ }# i+ ~4 o
  10. #include "DMA2D.h"
    ! k  g/ p- @; e# z" \) v2 Q6 w" h
  11. #include "stm32f7_ltdc.h"& s* V2 p+ K/ h$ l- c5 E
  12. #include "DMA2D_GRAM.h"
    3 Q; D! ?" T6 y! U
  13. #include "GDI.h"
    : d+ E6 e) z" a9 ?' w0 ?5 c

  14. 2 i% y+ S7 _/ I2 c
  15. //显示器Layer1 GRAM定义4 I& j# w9 ]6 \) c& v3 v/ M! B: E
  16. const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle =
    8 `, p) U. G1 y# n0 o: {
  17. {: |4 z1 z, A$ e3 H. A
  18.         DMA_INIT_OK,
    $ C7 \9 b5 V) g% Y- X, \
  19.         (u32) &g_LTDC_BUFF_RGB888[0],        //GRAM地址
    % H# G- D+ [- p9 m: M
  20.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式9 [6 |* Z" d9 M$ b; v5 D  \
  21.         LTDC_WIDTH,                                                //GRAM宽度7 a/ x8 k# \# t5 Z
  22.         LTDC_HEIGHT,                                        //GRAM高度8 d9 u  A1 T: j4 X- E% R& I! z
  23.         (u32 *)&g_LTDC_BUFF_RGB888[0],        //32bit颜色模式下显存指针
    5 f9 x7 t" a& P$ s& X6 I
  24.         (u8 *)&g_LTDC_BUFF_RGB888[0],        //24bit颜色模式下显存指针
    & j' W& n7 X1 h) L# A& h
  25.         (u16 *)&g_LTDC_BUFF_RGB888[0],        //16bit颜色模式下显存指针8 v1 E1 K0 q6 |% [8 ]" D
  26.         &cg_GDI_GRAM_Interface_32bit,
    8 U3 e: E* s* s1 |1 O2 U6 R$ C
  27.         * b* a0 n7 T# i* S
  28. };. I0 E  @" ]( M- g5 j

  29. 4 X0 ]4 h  |3 m/ L
  30. //显示器Layer2 GRAM定义% A/ m: \8 @9 m( ^5 @4 X
  31. const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle = : v& Z% y) Y6 V. r1 |
  32. {- _) {+ X; I2 d6 @% q0 L. ?
  33.         DMA_INIT_OK,9 s$ |8 O+ d' j  w8 J$ r
  34.         (u32) &g_LTDC_BUFF_RGB888[1],        //GRAM地址
    3 M8 ^8 d* A. S/ X
  35.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    . g+ q+ |8 g/ \3 S" T
  36.         LTDC_WIDTH,                                                //GRAM宽度
    # K. \3 q; ^8 d$ _5 z$ E3 f
  37.         LTDC_HEIGHT,                                        //GRAM高度
    ' C, G) N& x) b8 ^: e+ ^: O7 J6 e
  38.         (u32 *)&g_LTDC_BUFF_RGB888[1],        //32bit颜色模式下显存指针
    / ?" o# m' L! @* o6 T
  39.         (u8 *)&g_LTDC_BUFF_RGB888[1],        //24bit颜色模式下显存指针
    + [8 B  ?# U$ J7 p6 X, ~+ }$ ^
  40.         (u16 *)&g_LTDC_BUFF_RGB888[1],        //16bit颜色模式下显存指针4 {; d. Y9 K9 S) Z" M# q* ?
  41.         &cg_GDI_GRAM_Interface_32bit,. E5 K( e( l% H$ o5 Q0 S
  42. };- ~! l% U* e, }& j* A

  43. & W" B. B+ d2 C

  44. 0 z) O% L2 d* W# A/ T
  45. /*************************************************************************************************************************
      h, Z: f& }& k+ u5 q
  46. * 函数                        :        void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
    3 @0 u; a+ q# X  ~) Y% I3 x
  47. * 功能                        :        绘制空心圆! [3 _. x+ h8 E$ W
  48. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色$ d# ?* H+ s: E' v/ @/ Y
  49. * 返回                        :        无
    ( N- ~. h. V* |5 _8 L  ~
  50. * 依赖                        :        画点函数8 O6 L6 N  A1 [3 n& O- v
  51. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>7 E% a( L" {0 y
  52. * 时间                        :        2011-09-201 P5 j0 e2 C% [
  53. * 最后修改时间         :         2019-11-027 T2 G7 K% }2 a4 A
  54. * 说明                        :         无- L6 O0 K/ s5 |4 l
  55. *************************************************************************************************************************/
    1 T" z; ?. i" s2 H8 m# q! O
  56. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
    1 [% }/ c; T  Y, `. @
  57. {
    / \/ N& \% `! B6 Q* S
  58.         int a = 0,b = Radius;
    : n% `6 J* f2 r9 h' C
  59.         int di;
    ! ~0 v' R* U& C3 ]' [
  60.         di = 3 -(Radius << 1);           //判断下个点位置的标志
    $ H$ Z  I8 \. e( }8 k/ `
  61. * b% ]  w3 J* t! G0 F
  62. #if(GDI_PARAMETER_CHECK)                        //参数检查
    2 T4 p  X1 A& E  L
  63.         while(pHandle==NULL)! Q6 G# V+ S7 Z; C, }: A4 @
  64.         {" R7 r/ O7 \9 v" N: N
  65.                 DEBUG("无效的句柄 pHandle\r\n");
    5 _, r6 z: {4 s. g2 b8 C  ?% I% S
  66.                 SYS_DelayMS(1000);
    6 r5 m- K# |  V/ U9 O; w7 F
  67.         }        $ h& m: i( h: t+ g
  68. #endif //GDI_PARAMETER_CHECK* [4 E: t! A% p, {1 Z8 S. Z  V
  69.         
    1 y5 ]; n, }$ m/ @
  70.         while(a <= b)+ X2 k, L1 M# H! ?' e
  71.         {
    $ }, c- }$ q5 |" }( c9 o( e% C+ m
  72.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //3           
    4 x; u) N, P) f; D( f
  73.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color);             //0           4 B% {' L# k4 t$ i6 G1 X
  74.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color);             //1      
    $ e: Z. ]& g+ F9 L. T8 a$ r
  75.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //7           
    * X, u8 v( s9 u9 b3 v$ T
  76.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color);             //2            
    " Y7 t% t! y3 I+ W. A" G% Z: m- e6 H
  77.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color);             //4               
    ! ~6 P' e5 w4 i1 N
  78.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color);             //51 E; M& D1 S. j; F) O
  79.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color);             //6   O" J! C3 p9 G! _% B, [, J/ a
  80.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);            
    & Z* {, g# `1 s: K
  81.                 a ++;' t6 l5 k3 E. ~- v9 f) {
  82.                 //使用Bresenham算法画圆     & j  b1 o! ^0 p# M8 A" P% Z. l5 M( V
  83.                 if(di<0)" f5 z" L7 B% J* R5 K2 B
  84.                         di += 4 * a + 6;                                                                                     9 Z/ {7 I9 p9 L5 Z( v* `
  85.                 else# ]5 O( M! }5 d# _
  86.                 {# b6 v% K4 G0 B8 u
  87.                         di += 10 + 4 * (a - b);   
    5 S; @1 H0 L; x
  88.                         b --;! G7 R) c4 \- A" w. _& \: p
  89.                 }                                                                                    
    3 C6 e; x& [% |3 y2 `
  90.         }                                                                                  : G8 {6 `+ S2 r4 L3 p- [7 M
  91. }; q% X. W' w3 J& _2 r
  92.                                                                                                                                           
    7 m, A# a: E/ h. f
  93. ; G( X3 _8 y& Y5 k* m- p2 l& l* Q
  94. /*************************************************************************************************************************
    % E8 h) J. I% X3 c
  95. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    7 ?6 s, t: ~% D) ?) ?4 P
  96. * 功能                        :        绘制直线(可以倾斜), o' n8 J% Y2 H! t, z  k# e0 x
  97. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色: y- c% z3 w& e
  98. * 返回                        :        无
    ! ?+ |. n8 }- i5 K* o  ~( @
  99. * 依赖                        :        画点函数
    ) W( g) g! z7 i, W* a% S
  100. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>1 b' L$ m& E4 Z; S2 x, H' i+ R- t6 a
  101. * 时间                        :        2011-09-20
    ; [. J" e2 Q- Q2 Q+ \: i
  102. * 最后修改时间         :         2019-11-02
    4 N- U* U' f  @9 R
  103. * 说明                        :         无
    - C- P+ v+ k3 g; w% l& l! W
  104. *************************************************************************************************************************/
    0 D' z5 I& V- `6 V1 p& O
  105. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    3 x9 J8 K( m; ~- l
  106. {
    1 x; ?6 `1 U2 h. I* K' O
  107.         u16 t;
    3 U6 u( P, T" b* g6 K, M5 d9 z; w" W$ j
  108.         int xerr=0,yerr=0,delta_x,delta_y,distance; / g" d  j/ d; V4 U+ O; I( n3 R
  109.         int incx,incy,uRow,uCol;
    0 s$ |2 L4 b$ i6 Z8 q2 L* l- y
  110.         
    , n9 ~7 r6 {6 l- a
  111. #if(GDI_PARAMETER_CHECK)                        //参数检查
    2 \% q% X. v8 E" k0 n- l
  112.         while(pHandle==NULL)
    ) s2 ~* p$ z0 o" z7 J- V4 f- T9 G, J# R' P
  113.         {
    / o. _5 [( b9 s) _- I/ H& L
  114.                 DEBUG("无效的句柄 pHandle\r\n");
    4 n2 }. }( }- }2 x
  115.                 SYS_DelayMS(1000);( U' w7 h* O' J5 O6 P2 H/ f9 o* K6 `: }
  116.         }        2 h! \' q9 V  B2 t
  117. #endif //GDI_PARAMETER_CHECK        
    , j) B4 ?" T& i0 j. t* Y% Z1 ^
  118.         9 h" q* W+ l: C0 W% O
  119.         delta_x=ex-sx; //计算坐标增量
    * \3 ^5 z8 O( r6 D" o! E& f
  120.         delta_y=ey-sy;
    # M- [" P! k' C+ d
  121.         uRow=sx; & v$ n9 E) t4 c
  122.         uCol=sy; , w$ d) E/ u% E. S0 g
  123.         if(delta_x>0)incx=1; //设置单步方向 " A  C1 a2 C& O& ?% Q' I* @- C8 n3 T+ d; y
  124.         else if(delta_x==0)incx=0;//垂直线   L2 {2 j9 s- `2 ^9 f- J
  125.         else {incx=-1;delta_x=-delta_x;} " t# z1 V4 c; F* {: O5 X7 d
  126.         if(delta_y>0)incy=1;
    : i% a0 ?4 n- {  u7 g3 \$ E
  127.         else if(delta_y==0)incy=0;//水平线
    1 t* f1 }/ E: y; s- G
  128.         else{incy=-1;delta_y=-delta_y;}
    + Q; u$ o1 P  j( q: ~2 p
  129.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 ' O! ^, l2 ]5 y% ^( e# F
  130.         else distance=delta_y; ; e  l' }  F0 A7 y9 S# C1 P* R: q
  131.         for(t=0;t<=distance+1;t++ )//画线输出
    * ?0 A5 A: ^% `/ x' z/ B
  132.         {  
    " E) U/ K) g8 f& C; E$ x
  133.                 pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点 ! [+ |+ u9 B. i" n, \
  134.                 xerr+=delta_x ; ! i: G* M8 Z9 a& M$ h
  135.                 yerr+=delta_y ;                                                                                                   B. K- U) o6 u, s; C1 C! J
  136.                 if(xerr>distance) 4 y- P- @5 ]$ @+ l
  137.                 { 4 \$ X4 a( p  W5 l3 Y
  138.                         xerr-=distance; ! M4 d$ J% o9 k0 A( H( A% E
  139.                         uRow+=incx; / @9 |0 n" g: \6 V* Z. P% q  m" C
  140.                 }
    9 P& B- Q1 X5 c6 @
  141.                 if(yerr>distance) 9 n, |1 h% F) Y" `2 H
  142.                 { : G( R) ]/ x+ M5 D* D8 ], a
  143.                         yerr-=distance;
    % J. M# m' w, M, H. ?' M
  144.                         uCol+=incy;
    0 K* B) P* \$ K# [' R6 E! V
  145.                 }
    " z; ~: A) w+ D( F" B# W( A( l
  146.         }  
    - p: J7 E+ G' y. y, T/ G
  147. }4 ]% p( o* Q; D5 r3 z+ F0 a5 n& E/ y

  148. 1 ~' ?5 w& I# ^) W5 B7 S
  149. 8 }" u5 ~2 X  B+ ]& q
  150. /*************************************************************************************************************************2 n( G& y1 o+ c- c  l
  151. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    # z# b* J: C3 u1 f' n
  152. * 功能                        :        在指定位置画一个矩形) K) N. ^4 E' Z6 {. Z2 h
  153. * 参数                        :        pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色! e& N) l2 _0 }" E- M5 ~
  154. * 返回                        :        无
    * V3 s4 R) f: e, R
  155. * 依赖                        :        画线函数0 s% A# r; Y3 h
  156. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>1 H7 R: ^  R% j9 C
  157. * 时间                        :        2011-09-20/ P2 n0 X! v$ g- J3 ^
  158. * 最后修改时间         :         2019-11-02
    . Z/ C! T3 V* I! [7 g/ ^' H; k6 k
  159. * 说明                        :         无
    * Q# a; C/ I/ b9 y9 [
  160. *************************************************************************************************************************/
    , U7 T% X2 e$ q7 O0 Z  |
  161. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)% S6 T+ b5 k. N# H8 k5 @/ Z' |
  162. {
    9 F  K' x+ b8 a+ Y* {
  163.         
    & R0 T; ?% f' K$ k+ M1 H+ l$ g
  164. #if(GDI_PARAMETER_CHECK)                        //参数检查
    1 z7 }# T( {  W
  165.         while(pHandle==NULL)
    & I9 R- V' h( T* o2 G! ~
  166.         {
    4 O4 w, G+ c/ g5 k2 x* @
  167.                 DEBUG("无效的句柄 pHandle\r\n");
    3 _% y; h8 a4 q1 F
  168.                 SYS_DelayMS(1000);* X1 T5 |7 ^- i
  169.         }        
    % \0 c3 y- a: Y* J. s
  170. #endif //GDI_PARAMETER_CHECK
    ( r- i) g. X, ]; ~, b) P
  171.         3 Q' _# {, T1 S& y3 B
  172.         GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);
    / ?6 v, m% I  u) \- G) a' T7 q
  173.         GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);
    9 W0 p: L7 ?8 ^1 D3 c! c9 Y
  174.         GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);
    & @5 w8 r( a7 K, M1 |0 e- N
  175.         GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);
    . E5 j( j. e' N; k
  176. }                                                                           
    1 j  f! E3 l; N

  177. ' U6 V1 g$ w1 T
  178. 2 f# e; d, g6 a# E6 {. W
  179. /*************************************************************************************************************************; w! L# Y! L; F  t+ N9 D' [# ~
  180. * 函数                        :        void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)7 _, `% O" \5 ~( z) p" |5 s: G9 V# N
  181. * 功能                        :        画一个2*2的大点
    ; \0 Z. b! Q- L3 m4 Q, A, d
  182. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色. @& O8 E& H3 q* g: m! B
  183. * 返回                        :        无
    8 S1 ~* @% K3 W
  184. * 依赖                        :        画点函数
    * u7 `2 [) I) N! r
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    8 N5 f3 U% }) y
  186. * 时间                        :        2011-09-20
    - i) W: b$ Q4 f
  187. * 最后修改时间         :         2019-11-02
    ( b  l9 P& j7 Y" S& ^- C7 Z" M
  188. * 说明                        :         无
    ( V; W: b7 V4 k, d) X
  189. *************************************************************************************************************************/
    , P7 j" S8 D) n4 v' g9 _6 K
  190. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)2 ]+ v- K* Q! m2 h9 \, N- B
  191. {        , v. u6 L/ w: l- c1 ^
  192. #if(GDI_PARAMETER_CHECK)                        //参数检查
    1 z7 ^# l! y# ~3 f9 N+ ~$ N8 Z
  193.         while(pHandle==NULL)! S" z0 b+ \; R, J6 w, n
  194.         {
    ' y% T% n6 c7 A/ ^0 H0 A$ s% _
  195.                 DEBUG("无效的句柄 pHandle\r\n");+ O. T+ ?& U0 t6 D5 [
  196.                 SYS_DelayMS(1000);5 O0 n. z% n8 ~7 R
  197.         }        
    ' [) P6 p$ b9 M% F
  198. #endif //GDI_PARAMETER_CHECK
    ' a" g; E& }/ c4 M, q+ W% U: }4 u
  199.           b1 V5 Q/ J( Z9 g
  200.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                //中心点
    0 Y8 |5 v) r! y3 F
  201.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);
    ( h6 D4 Z9 `" D% e
  202.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);0 [; G2 X$ M8 A1 T2 @
  203.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color);                           0 [9 p9 D6 O9 Q6 p( Q; _, v
  204. }        
复制代码

: T3 s, A# q$ P# J2 [1 ~7 g, u# w/ L; u
  1. /*************************************************************************************************************
    0 V' [7 I1 o& Q: j: p" m2 i' `9 p+ I
  2. * 文件名                :        GDI.h8 K) I; y) \: D! b& D: A
  3. * 功能                        :        图形设备接口(Graphics Device Interface)
    , C8 L  {$ J# P1 h0 \) ~1 H
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>  O/ c* w( @" k% M2 q  s
  5. * 创建时间                :        2019-11-02
    % l" x+ {3 J+ q' R  v
  6. * 最后修改时间        :        2020-02-02) s& T5 K! I( j8 K: e. V+ S5 t6 t
  7. * 详细                        :        STM32F7 图形设备接口3 w, L' z, Y! M0 O! p& h+ J9 l  t
  8. *************************************************************************************************************/
    + |, s. {3 ?5 ]6 P8 @
  9. #ifndef _GDI_H_) S9 c+ u9 l: j8 }0 Z* u  ^
  10. #define _GDI_H_
    , m( f- Y. S1 V
  11. #include "system.h"
    * Y6 W' W; A! X1 q/ q  Q/ Q
  12. #include "DMA2D_GRAM.h"
    9 Q. S: E# [; q: T) T' I$ F
  13. 9 V- D0 m7 b, r% U% p
  14. #define GDI_PARAMETER_CHECK                1        //参数检查-主要检查指针
    0 }4 |" \. ?+ t* T7 [$ m" s$ g/ p! S
  15. #define GDI_DEBUG                                1        //调试输出$ J0 @8 |) m0 ~, T& Y! Q! j3 @- A6 R

  16. " k1 C+ T2 @/ P' A4 Q3 Z
  17. #if GDI_DEBUG- r- l" Q3 x" w7 E) ~
  18.         #define GDI_debug(format,...)        uart_printf(format,##__VA_ARGS__)6 `+ P) c4 ?# w( r/ X3 V% h+ \+ s: F
  19. #else. z; z8 F9 s6 H8 Y# t6 I4 [
  20.         #define GDI_debug(format,...)        /\3 M5 ]: \6 e0 n5 Q* V% A
  21. /
    " d% N; c; M, }: f. v! P
  22. #endif        //GDI_DEBUG& D6 e& A" n" t% \# U) V* M

  23. 4 Z0 p3 w" S0 `# D8 |0 b
  24. 0 S( L9 n# M2 z% B' O, V. F
  25. " p" C) X1 a' n' U$ E
  26. extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle;        //显示器Layer1 GRAM定义
    % I; d) P7 g; r& R( b  d
  27. extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle;         //显示器Layer2 GRAM定义3 ^* j) a5 e5 Z6 R# C7 J/ d) d1 U
  28.         : f- z* {/ e7 @4 M8 [, c# i# v; u
  29. #define LTDC_Layer1_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle)        //显示器GRAM 10 G8 z* B0 s1 R1 d0 z
  30. #define LTDC_Layer2_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle)        //显示器GRAM 2
    , j! i% j% W: i7 h( q: F
  31. 6 a8 x7 t6 P& n: A" u
  32. //GDI相关API
    0 o( m, o  M. R, z) f
  33. __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
      c+ k) ?( ~* }( o9 v& l
  34. {        
    ' r/ U3 z) |' Q8 q
  35.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                                                //画点
    & z. x8 _* t! L$ \
  36. }        6 [2 s5 G3 d: @
  37. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color);                        //绘制空心圆8 m$ H) h  R# i3 `: f: Q$ f
  38. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color);                        //绘制直线(可以倾斜)
    ( d9 C9 G9 d, ^1 j
  39. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color);                //在指定位置画一个矩形
    % W, T  K7 g* z* Y
  40. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //画一个2*2的大点2 j4 [. C/ L. L5 _
  41. " `$ Q$ E: U9 E, p  h( e

  42. 6 W4 A. ?5 Y  G7 B: [
  43. #endif /*_GDI_H_*/
复制代码
5 {0 ]8 V/ d# `/ x2 z5 ]' P1 ~
测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。
: b: w  j: p$ ]
0 T% f$ N! O* {/ p
  1. FIL *pFile;
    4 |4 L5 @- Y( a! c2 j
  2.                 FILE_ERROR mError;- t0 ?9 m8 C) W! k) y2 }  D1 b) r
  3.                 GRAM_HANDLE *pGramHandle;
    * O% k- z+ q8 x$ b
  4.                
    ; D) R, G& T* h5 G' p# y! k& k! F
  5.                 pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565);        //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB565) Q7 y& W. w* c& O$ C) ~
  6.                 if(pGramHandle != NULL)
    . F! d$ X% _. R8 o% {0 O  E& f
  7.                 {
    , B) C! r3 y- j0 r0 z# j6 @
  8.                         GRAM_Clear(pGramHandle, 0xff00);                                                //清除显存,防止读取失败了还是现实上一次的图片
    3 y" o2 ?- I7 x  E
  9.                         uart_printf("[OK]GRAM初始化成功\r\n");
    6 ~4 e7 d5 p' P& H0 F3 H6 C
  10.                         pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);
    - e& t+ ~. J+ f* q* }5 c
  11.                         if(pFile != NULL)2 X$ _' M- i& H! y3 d2 s
  12.                         {1 l7 K$ y6 h2 _$ G+ P
  13.                                 uart_printf("[OK]打开文件成功\r\n");8 {* v$ O6 ~5 u8 @
  14.                                 if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中' D+ S9 ?% j" [  ~
  15.                                 {
    $ i' `; C1 K- h. R7 j
  16.                                         uart_printf("[OK]读取文件成功\r\n");
    8 C5 s: s3 X+ W6 r
  17.                                 }
    # @, x/ c4 `0 |8 V6 b- g/ F
  18.                                 else
    1 P3 w+ v! `4 w- n
  19.                                 {" W  y& u( g" n8 n
  20.                                         uart_printf("读取文件错误:%d\r\n", mError);
    ) i$ ~  ?+ C" o; p" p2 R1 v
  21.                                 }
      j6 y/ |4 K  `2 D2 W% S# H) H
  22.                         }- y, r$ l* F' n- b+ W1 \0 m  m
  23.                         else
    $ R/ S- l7 z" D" {0 h0 S' q1 I
  24.                         {1 ]8 |; m  ?( R1 ^8 j  O6 B
  25.                                 uart_printf("打开文件错误:%d\r\n", mError);" Z: I9 T4 U2 u0 H0 V
  26.                         }8 w$ ?( Q7 F: x
  27.                         //将显存拷贝到屏幕中
    5 \8 ~- z; W; K& }$ _
  28.                         GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240);                        //GRAM局部拷贝( O/ l8 j3 z7 L! l7 d. X
  29.                 }
复制代码

2 Y( _9 p$ c9 K* y# P
7 G* d7 e7 K. E- H* L$ {2 f
3 B7 {( [/ a4 f+ ?" k& F) a
收藏 评论0 发布时间:2021-12-16 21:00

举报

0个回答

所属标签

相似技术帖

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