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

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

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

0 h; @- Y1 V- x) l/ _9 E
  1. /*************************************************************************************************************
    , M3 X: a0 c- w4 ?+ t
  2. * 文件名                :        dma2d.c
    7 ]8 i  c, z. b. x1 [/ p' i0 Z
  3. * 功能                        :        STM32F7 DMA2D驱动6 V, I2 `' M1 j( i6 u* o
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>+ Q4 |6 L9 Q% C# j$ m
  5. * 创建时间                :        2019-10-299 L# m( s5 I/ z2 K1 ]: D+ j
  6. * 最后修改时间        :        2019-10-29
    4 `; q  H7 d- B3 ]2 g0 K
  7. * 详细:                        6 B9 ?, g3 p4 P2 w
  8. *************************************************************************************************************/        ' B+ B# x9 U5 F' i5 a# q$ \
  9. #include "dma2d.h"7 }" ^; J! ?/ N
  10. #include "SYSTEM.H"
    " t& s. D+ e, G" `( i: E

  11. 7 \" A' z+ q- _2 P2 e/ Z
  12. ; j3 T9 O- e; a9 D- n2 [* x
  13. /*************************************************************************************************************************5 ^9 F* }) ^( o& }# h
  14. * 函数                        :        void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)! I. G: J9 v* T. F6 Q3 I
  15. * 功能                        :        DMA2D进行单色填充: B! \# j& {5 Y3 P; A
  16. * 参数                        :        FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;
    . v2 @% j  u# y6 I' S' ~
  17.                                         ColorMode:颜色模式;Color:颜色值
    8 D! J$ S) L5 j0 Q; D' m
  18. * 返回                        :        无
    6 E7 B0 d" \' u- S; V
  19. * 依赖                        :        底层宏定义
    & X7 e- n3 r$ o7 t. i0 ]4 E
  20. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    / I' n# Z  g( ~2 W. ~: z
  21. * 时间                        :        2019-10-299 Y2 I  K- f$ ~# b
  22. * 最后修改时间         :         2019-10-30
    - ^5 c, S! _/ z+ u
  23. * 说明                        :        用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    7 z5 w/ w1 n% t; C3 e* @
  24. *************************************************************************************************************************/
    0 H7 g' F& l; t# X8 [
  25. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)/ s0 M% B. h! x1 O+ o0 j/ s
  26. {
    & b0 Q6 n6 ~, l0 J
  27.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟/ d4 _' d  {6 Z' o) j; J& h( g' {" t
  28.         DMA2D->CR = 0;                                                                //先停止DMA2D
    4 b1 w' z) a0 ?% |) I) |
  29.         DMA2D->IFCR |= 1<<1;                                                //清除传输完成标志
    7 e4 R: |+ ]0 N9 L- Q
  30.         DMA2D->CR = DMA2D_MODE_REG<<16;                                 //寄存器到存储器模式( O8 H$ M) ]9 |( h0 l
  31.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
    & u$ F. z5 b( a1 g" T  N  b( V
  32.         DMA2D->OOR = OffsetX;                                                //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充/ Q0 E: r9 o3 L) r& h
  33.         DMA2D->OMAR = FGRAM_Addr;                                        //目的地址: |  D2 M5 b5 x$ X
  34.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数4 T* g1 I# b- P
  35.         DMA2D->OCOLR = Color;                                                //输出颜色
    + }$ e3 }2 E6 g9 e
  36. ' q' k2 T/ f4 t8 }( s- [
  37.         DMA2D_Start();                                                                //开始传输
    ; w7 g; o- l5 ^& J8 i* t
  38. }" ]0 j# N4 Y, S( h- K% `& M$ l
  39. 7 |( r; R! ^+ w0 s6 Y9 y. g1 e& c

  40.   c5 D" G" K; z  [/ |  o
  41. , @4 G- P4 R0 _+ _
  42. /*************************************************************************************************************************
    $ ]; Z( o" C/ C. a2 k
  43. * 函数                        :        void DMA2D_WaitTransferComplete(u32 TimeOutMs)
    - c7 K* y8 j% C5 P( A. A5 w
  44. * 功能                        :        等待DMA2D传输完成
    ' H; T# T) b  {9 O2 _+ L
  45. * 参数                        :        TimeOutMs:超时时间  e0 i5 B2 n! I6 {
  46. * 返回                        :        无' Z/ Y0 K. n$ g
  47. * 依赖                        :        底层宏定义
    ! K- H1 X( G; I; B# F- A8 ~
  48. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    / Z8 r: J( d8 \/ @
  49. * 时间                        :        2019-10-30
    $ S) a; n. U6 a
  50. * 最后修改时间         :         2019-10-308 y& i4 ]0 Q8 ^0 k- A9 B
  51. * 说明                        :        超时后会取消传输
    & d- ~2 s. N6 y5 I6 t7 y
  52. *************************************************************************************************************************/+ J/ m. `: X" Y/ k
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs): l4 R: m5 L$ B4 L5 e, C
  54. {
    " j7 u; q$ O; D# y% x+ m7 s. f; Q6 ^
  55.         u32 timeout = 0;
    ; n1 y( r( S% g; \. t, d
  56.         , x& h, y; @9 |0 l7 \
  57.         while((DMA2D->ISR & (1<<1)) == 0)        //等待传输完成
    1 k" d6 l" e; _# a& R1 a1 M) P- ?
  58.         {
    , P: D8 @2 z8 ^5 D$ {! X" z- S
  59.                 timeout++;" S' G; {' p( |& M* `* q) r/ j7 T
  60.                 SYS_DelayMS(1);                                        //延时1ms
    % X/ N) O% c1 P% n( g
  61.                 if(timeout > TimeOutMs)  x5 D! k5 X% s8 H  S
  62.                 {3 n, v  j6 @3 u& S: k) o4 \
  63.                         DMA2D_Abort();                                //终止传输
    ' ?) L) a% I" ^- v) ?3 Q
  64.                         break;                                                //超时退出7 |: H/ P: X( `! m: q
  65.                 }; M9 S- ^+ \7 }* f
  66.         }  
    ! ~4 P" [9 Z- S  m* I
  67.         DMA2D->IFCR |= 1<<1;                                //清除传输完成标志         
    2 H; |0 y' T; X
  68. }
    . J* @$ q1 p; M. @

  69. 5 ]: B2 I  B. h& L6 Q
  70. /*************************************************************************************************************************
    6 }6 B/ M+ l, \
  71. * 函数                        :        void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)  F! f$ W' C( e% y" P
  72. * 功能                        :        DMA2D进行矩形图形填充
    # R4 Z* U0 `$ s
  73. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
    8 C! X4 F  G4 S# }$ a
  74.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);: n0 P  Z/ ~2 a$ b: x; U! B
  75.                                         ColorMode:颜色模式+ D$ I1 l: ^& b* V
  76. * 返回                        :        是否设置成功8 \+ r/ i# O# n# x+ ?
  77. * 依赖                        :        底层宏定义2 c$ V: O1 I" S0 n  |+ @
  78. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    & K. i* D- Y2 K0 g* u( m* |
  79. * 时间                        :        2019-10-28- S2 X4 e8 ~. q/ R+ _
  80. * 最后修改时间         :         2019-10-283 P* }; ]  u$ c4 a" |. W
  81. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    5 D  j8 |4 W. F( p' X$ z# i6 o1 P+ \
  82. *************************************************************************************************************************/
    ; e3 i% O1 r7 _) B; n% v
  83. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)
    ! E8 I$ B% Q* Y- C0 N9 i' o
  84. {  Y5 o- u9 C& N% H, N* U* X7 m
  85.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    7 h7 Z9 {3 A( R3 y
  86.         DMA2D->CR = 0;                                                                //先停止DMA2D
    % Q5 {9 U4 E( n  ~1 h
  87.         DMA2D->CR = DMA2D_MODE_MEM<<16;                                 //存储器到存储器模式3 Y8 f/ ~: u/ I9 _1 ?& |
  88.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数/ y# |' W; Y: \# E( \' }
  89.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式6 |( M2 ?8 b9 p/ H6 G2 n
  90.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
    # v% a* W+ A; d6 c7 \: |
  91.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移 ' h" v) @6 F* `) @4 i
  92.         DMA2D->FGPFCCR = ColorMode;                                        //源图像颜色格式" @, G1 x1 F; L+ A, r
  93.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    ; H% ]/ n2 b, Y8 u- n9 b
  94.         DMA2D->FGMAR = SourceImageAddr;                                //源地址; |4 |2 w7 n' C1 T8 ?
  95.         
    6 @+ ]4 I: F$ N, X
  96.         DMA2D_Start();                                                                //开始传输
    , _# f  r% N* B9 R+ \! H$ B  B
  97. }* M+ N, M. l  Y

  98. $ z# K6 ~7 c0 E% j) q( q) W

  99. + U5 C2 a+ A6 B6 l5 K5 H4 ?
  100. /*************************************************************************************************************************
    8 B" @, |# J( x, L
  101. * 函数                        :        void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, ' X0 }0 N3 @! t) d9 p! f1 h
  102.                                                 DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    # a# q  T# r' v( R1 w' ^$ Y
  103. * 功能                        :        DMA2D进行矩形图形填充(会执行像素格式转换)
    * e$ x: y  \) u- N% x+ g- ^: |2 w0 c
  104. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);' h1 C+ U) `( p" k& D( z
  105.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    9 P; H2 f4 z# E
  106.                                         SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式6 \6 Z, O$ h+ X5 X! D0 V- r  G, U0 @
  107.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    # a! C! e& ~( c4 P' Y: E/ ~! n
  108. * 返回                        :        是否设置成功
    ' Q  E; s$ L6 w' j* r5 A
  109. * 依赖                        :        底层宏定义
    ( M1 K! m. U" L! A' D
  110. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    , @5 Y0 L! w$ f$ _' B# R* `8 Q2 p
  111. * 时间                        :        2019-10-28
    $ i: e$ @- i3 L
  112. * 最后修改时间         :         2019-10-28
    ( I1 S4 ?3 t9 O' D8 z
  113. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    3 h! d' C* E6 G$ n5 N: Y9 T
  114. *************************************************************************************************************************/
    # K" Y; l7 ?! ?8 T
  115. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    2 m9 z5 b! o8 j7 q) O$ ], j2 q
  116.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    " }5 Y1 B1 p& y' h+ S) Q. W  a
  117. {
    6 C& u; v: I6 a3 a
  118.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    ; ~; C2 i- R( F, ^7 u% v
  119.         DMA2D->CR = 0;                                                                //先停止DMA2D( ^/ z4 e; |+ m5 z& t- v* A
  120.         DMA2D->CR = DMA2D_MODE_MEM_PFC<<16;                        //存储器到存储器模式-激活PFC& t2 P% T1 Q) J& I9 R" j
  121.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
      R7 Y) D  F) ?+ v" D$ m7 g5 b
  122.         DMA2D->OPFCCR = DestColorMode;                                //输出颜色格式5 l  s& G+ A% {5 a
  123.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
    8 @7 e6 W) e- q+ `, I, o9 W
  124.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移
    / q) t3 R3 e. p* V
  125.         DMA2D->FGPFCCR =((u32)Alpha << 24) |  ((u32)AlphaMode << 16) | SourceColorMode;                        //源图像颜色格式
    + w- j/ E  z4 c4 R, y7 z+ Z! p
  126.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    2 {1 `. s/ O% h1 Y8 z
  127.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
      X6 C1 D7 F6 m9 e% h+ F/ G$ ~8 I
  128.         
    " J% f) n/ j+ t2 [9 U
  129.         DMA2D_Start();                                                                //开始传输4 U% c, a$ x* j* V% w* l& q4 N% x7 S" f
  130. }
复制代码
  1. /*************************************************************************************************************2 U9 @; l2 H% L3 A: v
  2. * 文件名                :        dma2d.H
    6 f7 d9 H/ y: Y( [" V- |8 r
  3. * 功能                        :        STM32F7 DMA2D驱动
    5 Q5 o4 B" _9 C/ p/ S! L4 @
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>, ?: w9 \) `: g4 _8 A1 P
  5. * 创建时间                :        2019-10-29+ `8 K4 ]2 u" e
  6. * 最后修改时间        :        2019-10-29/ e( N# X: u' ~# h
  7. * 详细:                        
    9 j1 `/ q5 c% n% P; G9 D# x
  8. *************************************************************************************************************/        
    - f- O' W6 u5 P- N5 s' M! L
  9. #ifndef __DMA2D_H_
    2 g! X$ e* H( ?& a  f
  10. #define        __DMA2D_H_           
    1 r# k, A# s+ v* L4 M/ v: D9 N9 b4 r
  11. #include "system.h"0 Z# V0 ^/ @' E4 d- M3 \
  12. * ?4 k! G- s% ^3 N
  13. - W0 _) a( J( }, ^$ W: E' O' I
  14. typedef enum! m) i* c' }' `8 Q: }* q
  15. {5 H' T3 g* v  z# C
  16.         DMA2D_MODE_MEM                =         0,                //存储器到存储器(仅限 FG前景色 获取): B% E2 \$ ?# p  ]: S: O1 H. f2 N
  17.         DMA2D_MODE_MEM_PFC        =        1,                //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)+ F4 A  Y% C" F
  18.         DMA2D_MODE_MEM_MIXED=        2,                //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)
    - c5 S- R: r6 p. B9 o
  19.         DMA2D_MODE_REG                =        3,                //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)
    0 i8 v; P& |' a0 k
  20. }DMA2D_MODE;
      b( Y7 G# H) D/ y* E
  21. 2 k7 a! Z) f  }& v) e
  22. //颜色模式9 Z* x* z" Z- D* }+ s% s- ~
  23. typedef enum
    & p' b9 Q! \6 c! ~9 a
  24. {
    , m2 l& v: E  }7 l
  25.         DMA2D_COLOR_ARGB8888         = 0,. S* `. I/ B8 W0 P( L+ \2 ^0 M! O
  26.         DMA2D_COLOR_RGB888                 = 1,
    1 D0 t! o6 \9 s" y
  27.         DMA2D_COLOR_RGB565                 = 2,
    2 p  U1 x1 q( w9 e
  28.         /*DMA2D_COLOR_ARGB1555         = 3,: Z+ u. }$ B) q# H- I9 V( V. D
  29.         DMA2D_COLOR_ARGB4444         = 4,
    ' P- N/ O6 |5 J6 W5 @  S
  30.         DMA2D_COLOR_L8                         = 5,        //8 位 Luminance2 R4 P( S( r8 k
  31.         DMA2D_COLOR_AL44                 = 6,        //4 位 Alpha,4 位 Luminance$ P0 C  u6 M% a2 q/ I" R+ E: n) O- d
  32.         DMA2D_COLOR_AL88                 = 7,        //8 位 Alpha,8 位 Luminance6 G1 @  c2 L4 D; k7 \% ?- x& H
  33.         DMA2D_COLOR_L4                         = 8,        //4 位 Luminance
    2 I# c7 ]. \+ V$ P
  34.         DMA2D_COLOR_A8                         = 9,        //8 位 Alpha4 k$ j+ z  v( M+ F8 H
  35.         DMA2D_COLOR_A4                         = 10,        //4 位 Alpha*/$ i; H4 m0 h% Q$ s
  36. }DMA2D_COLOR_MODE;! g# a1 e! v; w# I, ~% ?4 x. y
  37. ' Y. _) z4 R6 ]

  38. ; i: y( K* A' m! S
  39. //Alpha 模式
    4 C7 D( N' m7 {
  40. typedef enum; A1 l5 Y$ w/ {$ B5 @+ C# t
  41. {5 u( E. `( v( [; `
  42.         DMA2D_ALPHA_NULL        =        0,//不修改前景层图像的 alpha 通道值
    1 t3 Y4 |! ]9 y, }! U- `8 K
  43.         DMA2D_ALPHA_REPLACE        =        1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]
    + g6 u& J3 r( v' {, M& R5 w5 t
  44.         DMA2D_ALPHA_PRODUCT        =        2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积
    8 G% E% ^. k' f: m2 x$ K( K' H
  45. }DMA2D_ALPHA_MODE;
    , b( Y3 \$ C/ J! K* O
  46. + D9 G/ g8 v+ B. W" A
  47. 2 `1 Z( k) {( Y. W2 x- W, i. {
  48. __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;}                //终止传输
    ; ~, L5 m+ p' L3 }" P" p
  49. __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;}                //挂起传输9 `  t$ m$ N4 J, D0 h6 }
  50. __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;}                //开始传输
    9 Q. g: z. s5 `( z, K

  51. - `: ]( @, U' b: D# x! I
  52. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color);        //DMA2D进行单色填充9 e7 d6 C: E8 P9 u0 A8 M
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs);                                                                                                                                                        //等待DMA2D传输完成
    - @* f9 i2 z6 A$ b& w
  54. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充
    1 }$ `* K$ Z, `) q9 M$ j
  55. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    . h! ?4 ?. A3 `; \% s" V/ h
  56.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)# h% C. P- h% n, |7 W
  57. #endif //__DMA2D_H_
复制代码
  1. /*************************************************************************************************************; n: D. V0 h* ]0 q- y9 N+ R3 J
  2. * 文件名                :        DMA2D_GRAM.c
    " I' d7 a( n+ V' Z; c3 q% s
  3. * 功能                        :        GRAM相关操作  n$ S. o, [. b$ S& u7 }6 S8 C* N
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>4 j% T+ ]. b" c2 Q& m! D* _
  5. * 创建时间                :        2019-10-30' N  F# l  @' D& V8 G5 h
  6. * 最后修改时间        :        2019-10-309 l& x2 X  ]6 ~
  7. * 详细:                        显存相关操作接口: u( t' A( j+ e7 M5 z. `
  8. *************************************************************************************************************/        9 ~( Z$ M+ k: M; |3 q; w
  9. #include "dma2d.h"9 N% u+ P7 [- Y* J! D5 s# l
  10. #include "DMA2D_GRAM.h"
    * X1 q5 [* v1 N* G4 [
  11. #include "SYSTEM.H"
    8 @0 |# \; H7 l4 Y! ^
  12. . f9 O6 |* f* `) O  Y
  13. //基本接口9 j/ V. b' R8 R6 R( _& G6 t
  14. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //32bit色彩GRAM显存画点( U$ @7 a, W( L9 h7 c, Z3 d
  15. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //24bit色彩GRAM显存画点
    0 }3 F8 l' J" q# C
  16. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //16bit色彩GRAM显存画点
    " [3 q) t: {! H3 A! N

  17. 2 g' f+ H: r, _* h; Q; `8 ]  D

  18. 5 g/ ?7 g% {3 e. {# _0 M5 S  h" O
  19. //GRAM相关接口-16bit
    * U& M$ c9 X0 p& U' f
  20. const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit =
    0 y) g- R7 B4 x7 i
  21. {
    ( h7 d# `- U- Q% @5 x
  22.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit,                        //GRAM显存画点(RGB565格式)
    8 o3 H/ d6 r2 X' g
  23.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充7 l. i, o. E: Q' r( _! V8 @
  24.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    6 n: M1 }* z/ d4 N7 ?
  25. };0 m: ~0 b) r5 d8 ]9 V; v) s8 b* k
  26. ' E. ^- a: C" O- d. B
  27. //GRAM相关接口-24bit
    . t: Z* G6 o  G8 w, V. |0 S( \
  28. const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit = 1 j8 i9 O5 w( I
  29. {
    6 _% b2 x- \/ Q, S+ X) u" {) r3 u
  30.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit,                        //GRAM显存画点(RGB888格式)
    % Y5 f. |. m& W' N% n, X3 p
  31.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充* b# y) ]9 p9 E
  32.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    3 E  B2 c6 U/ O& l7 V" v$ `
  33. };
    6 N4 p5 H5 O9 Q6 q/ {
  34. * z; K4 F3 H5 i4 w8 L' j
  35. //GRAM相关接口-32bit$ D4 w- M3 E, _- w8 Z+ T+ C
  36. const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit =
    , y' q# R9 R7 Q0 i! {
  37. {- Q( d, F2 `/ E/ [  W
  38.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit,                        //GRAM显存画点(ARGB8888格式)
    * Y8 {6 k3 e8 D2 C9 `6 S" N
  39.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充4 |; n7 z; Q2 v! D$ |
  40.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)$ P1 g" t; X, `7 P
  41. };9 m: f& }. M2 ^! X: g
  42. # G* ]$ \7 t6 q! `3 a( h' e! b
  43. /*************************************************************************************************************************
    ) _3 o! F0 {# v0 R2 ?
  44. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    * l" w6 `. {6 v5 L% _) x) K
  45. * 功能                        :        GRAM句柄初始化(不会申请内存)
    ) `5 b0 c  b7 C; m$ W
  46. * 参数                        :        pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式
    % l) E6 l+ J3 Q& R: k
  47. * 返回                        :        无/ j, E. q( q$ g
  48. * 依赖                        :        底层宏定义5 Y, G& h7 j4 O9 ^
  49. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    9 }, J. Y3 ?6 H3 u/ X1 G
  50. * 时间                        :        2019-10-30  d( m; \2 }4 B# {3 V# i  d
  51. * 最后修改时间         :         2019-10-30+ t; B' n0 A) r' j$ D; @
  52. * 说明                        :        初始化显存
    % P; K3 E- \( w
  53. *************************************************************************************************************************/; Y# c+ Y2 Z3 H# l( J
  54. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    5 s/ ?- @3 v6 q/ @& L
  55. {& B7 P; P- N8 m! e; p: V
  56.         while(pHandle == NULL)
    0 Y$ V  |! u. j" f
  57.         {% y. l$ }. }9 o+ h6 b: Q8 t
  58.                 DEBUG("无效的句柄pHandle\r\n");
    " u! g8 N6 Y* B% g' \; G
  59.                 SYS_DelayMS(500);
    2 ?- f8 E" E8 v9 o
  60.         }
    . C) G4 y4 M, |5 e* c
  61.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
    / D: Z+ ]9 Z+ w
  62.         pHandle->Width = Width;                                                        //GRAM宽度
    ' V5 a* I" S- o/ j, ?: L; G: [
  63.         pHandle->Height = Height;                                                //GRAM高度' A+ F6 e  h1 ~# v+ Z
  64.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
    ! R% _( Q6 K4 b/ S; R, k
  65.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针: }& c0 i( V! F! S
  66.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针" }2 r6 I0 v, b3 t* w9 W& N
  67.         //像素模式/ ^  i5 g, q: I& X6 n6 D2 f
  68.         switch(ColorMode). D& H, u4 `  d% ?: M
  69.         {( D" t. u/ L4 j' P
  70.                 case DMA2D_COLOR_ARGB8888 :0 [% ]; @9 k) C* P) z" ~% z: e
  71.                 {; a3 D+ o/ T' b% B: y. W. K
  72.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;, [2 Q7 s" k. w0 n: Q# q8 u. J: r
  73.                 }break;6 w- E6 W) M9 Y  ]0 M
  74.                 case DMA2D_COLOR_RGB888 :. e+ Q2 _' t$ N; |1 h
  75.                 {9 C! w) _% e" D% `
  76.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;" ~4 Y. D, t* d" j
  77.                 }break;
    : a! {0 G2 ~- D9 ?- D; g
  78.                 default: //DMA2D_COLOR_RGB565* `. ]; F3 R( a& Y9 U8 T6 D% l
  79.                 {
    0 h% u7 C9 b! o$ y
  80.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;0 z/ V0 }# c0 p! B
  81.                         ColorMode = DMA2D_COLOR_RGB565;7 s8 |" y; R4 a; w/ u5 R3 k  ^
  82.                 }break;
    $ Y; I1 Q7 D6 |2 P
  83.         }: d$ V6 ~$ J( T5 o" g2 X7 }7 N) _
  84.         3 r' J4 r# Q! \) G  k
  85.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式
    # s" z+ V; J- E# B$ t
  86.         pHandle->InitStatusId = DMA_INIT_OK;                        //初始化成功" J& g% r; d% _. m7 |- h2 M
  87. }1 o% I1 P6 s+ {
  88. $ I) X2 K" u- A6 h3 i+ ?' S
  89. /*************************************************************************************************************************
    ; o% {: v% _6 ?+ }1 P
  90. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)
    ' Z% a* s+ T0 A9 G
  91. * 功能                        :        创建一个GRAM(会申请内存)
    0 p% w2 y+ w, |, |- \% ]+ ~  ~' y0 G
  92. * 参数                        :        Width:显存宽度;Height:显存高度;ColorMode:颜色模式
    4 S/ a7 D2 I2 z/ Q1 x7 a
  93. * 返回                        :        NULL:失败;其他:GRAM句柄
    3 b5 F. P: Y: J# Z+ s- w; r
  94. * 依赖                        :        底层宏定义  U. W8 D- J( K. C% ?+ |, O% S3 y
  95. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>* p" [4 S) n! c- N- r& e
  96. * 时间                        :        2020-02-02
    4 h2 \2 U8 R! y4 S. R. U
  97. * 最后修改时间         :         2020-02-02( R1 g! l! ^& \5 k
  98. * 说明                        :        初始化显存
    7 U& j# l. z& V' \, k
  99. *************************************************************************************************************************/
    9 t$ F' l* }# [' M
  100. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    ( T! W6 H9 X; r
  101. {
    , t7 N7 j  N/ v% t5 ~" p0 i* o
  102.         GRAM_HANDLE *pHandle = NULL;
    - `( ]/ m$ E# q8 h& Q& }) f2 ~
  103.         u32 GRAM_Addr;
    9 }' A! J5 u' V4 D0 A7 C. b1 W3 \
  104.         
    / d- D6 X1 W! R; \( B) {
  105.         pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE));        //为句柄申请内存; J+ k3 ^1 y9 g9 ^# G# W! p$ G
  106.         while(pHandle == NULL)
    / ]9 \$ T; _  l/ N
  107.         {
    6 i) t& A  D' d/ b
  108.                 DEBUG("无效的句柄pHandle\r\n");
    3 n& D  ?  R* j& S" J. O, F
  109.                 SYS_DelayMS(500);
    ' Y+ @! ^5 f9 n& L6 N# j! ^" }
  110.         }! e( L! I( c* I
  111.         
    + ^& n8 A1 {3 n7 V: u4 b! l
  112.         switch(ColorMode)
      ?& i8 P) [/ E+ G% c- h) V  \
  113.         {
    $ K0 g5 J3 w6 y
  114.                 case DMA2D_COLOR_ARGB8888 :
    ! b# U; D3 O3 F$ L3 Q
  115.                 {
    7 E1 V) [% J( ~: z: K
  116.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存, R" U" N# |; G7 |
  117.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;$ p3 \- U0 F; }7 k9 b" {1 n4 x
  118.                 }break;9 E' x% {' L7 ~5 H9 d0 z" K' V  u
  119.                 case DMA2D_COLOR_RGB888 :. m" @+ k9 m. c: v& y+ W1 f6 ~% H$ R
  120.                 {1 t" r0 Y/ a' F/ D/ [9 J
  121.                         GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height);                        //为显存分配内存
    2 ]$ h3 f- b# x( ]8 c
  122.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
    ; C8 W! i- m! K0 _0 P
  123.                 }break;
    6 h+ v# T( t9 V/ N5 l% f" v
  124.                 default: //DMA2D_COLOR_RGB565
    ) @" f# ]& S( l6 I6 C
  125.                 {
    / e3 i' p! F* z! b  M5 Z% c% o1 w
  126.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height);        //为显存分配内存4 `& p3 t3 i) m& J% a
  127.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
    # G; F; F, k; y( a
  128.                         ColorMode = DMA2D_COLOR_RGB565;
    4 q% s# M9 J6 X5 Z  m6 x% ?# f
  129.                 }break;
    , y( U4 g7 Z6 [0 {2 f: ^) X  B
  130.         }
    - G5 O: s* h2 X  g; b1 Y2 C2 q
  131.         ' D, E) Q" N+ n8 {9 B0 {! w' i
  132.         while(GRAM_Addr == NULL)
    # y) r# t! M" u- y$ @, U$ z$ k! d
  133.         {! @3 C+ F/ s* v6 N1 N# H7 b
  134.                 DEBUG("显存申请内存失败\r\n");
    - [4 \. O+ k9 g7 Q
  135.                 SYS_DelayMS(500);
    , X9 g, `! H* K$ C9 ^$ Z- S; ^
  136.         }4 R! m1 k$ h8 F
  137.         $ T$ \3 L; W2 f+ }+ R
  138.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
    1 j5 c- f& X) [4 U# A
  139.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式& p! o: ]/ m# X8 r
  140.         pHandle->Width = Width;                                                        //GRAM宽度+ b; ~" m7 ?! K+ n; {3 q
  141.         pHandle->Height = Height;                                                //GRAM高度! d# L  q0 ?% |  x
  142.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
    * ]+ E; y, R) A& g- N; g- m
  143.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针
    8 L$ t: G0 K, N8 S" o
  144.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针. g# q# t  l! n1 ]* ^; d! T3 z/ b
  145.         pHandle->InitStatusId = DMA_CREATE_OK;                        //创建成功  N; a) ~" D7 c. H) [0 ?& Q/ `$ [; z
  146.         
    8 C3 h2 r% `5 K' q; ?+ p+ s* E
  147.         return pHandle;
    - |8 s5 Z1 b( Z3 V9 `
  148. }" e* o* }, b# O# m% N
  149. 3 A& H5 m# j& x/ z! {% l
  150. 9 `+ c5 [1 ~) l$ d  _& q* X
  151. 1 L" @. y. r1 m1 o  D! l# n( G% K
  152. /************************************************************************************************************************** Y4 j9 X, o: f( j- E( B4 m
  153. * 函数                        :        void GRAM_Delete(GRAM_HANDLE *pHandle)
    1 \! N( N* W( r0 ^3 w
  154. * 功能                        :        删除一个GRAM(会释放内存)$ \* [' g# E# `8 Z) v
  155. * 参数                        :        pHandle:GRAM句柄
    6 c' ?5 \, Z" ^
  156. * 返回                        :        无" O8 }9 N! L0 `7 ]" C/ q: }( x( A. T
  157. * 依赖                        :        底层宏定义) M$ L6 e' E& a1 T. U, S9 [
  158. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    5 f$ {0 E3 N+ ?" q; L# r; q5 f1 K
  159. * 时间                        :        2019-12-16
    & {6 T# Z8 R3 D$ Z8 X
  160. * 最后修改时间         :         2019-12-16
    : b3 I2 k* d: B) o& {
  161. * 说明                        :        用于删除显存,释放内存& g2 e8 p5 O1 X( a  k7 T% X: }
  162. *************************************************************************************************************************/+ G5 B3 n' r: N' @# X& g& H% K1 P- X
  163. void GRAM_Delete(GRAM_HANDLE *pHandle)
    - I2 x% H6 i* W7 [
  164. {5 Q' `. n, W6 t
  165.         if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)
      t' f8 y- i# r, J% Q
  166.         {
    ) j; x- B7 \8 k$ N0 r1 T
  167.                 if(pHandle->GRAM_Addr != NULL)
      R7 r9 p% A5 D: v
  168.                 {) Y1 B6 c' W6 B1 K/ }5 L
  169.                         GRAM_free((u8 *)pHandle->GRAM_Addr);                //释放显存内存
    ; o) h; b  n2 i
  170.                         pHandle->GRAM_Addr = NULL;
    5 v3 b# T0 V4 w7 c
  171.                 }
    " y8 k9 E  R; ~6 p$ V
  172.                 pHandle->InitStatusId = 0;. o; A* h" G7 U5 B# ]6 t9 _# ?0 U* x
  173.                 GRAM_free(pHandle);                                                                //释放句柄内存
    5 a4 U. p# f9 Y1 n
  174.                 pHandle = NULL;: d3 p0 l8 T& a6 d2 j
  175.         }# }" `6 j' A6 S
  176. }
    , |2 S- I9 S7 J) \  Q8 }

  177. 0 i: |3 Z8 L# F$ p( E

  178. 5 |' q; `5 h% |) r* y# W, U
  179. /*************************************************************************************************************************
    , @. m! V: m9 H
  180. * 函数                        :        void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)& V6 @) j. T' }
  181. * 功能                        :        32bit色彩GRAM显存画点6 R* r2 i: @; v* _) o2 _  \. ?
  182. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    ) n# R+ y; N' y
  183. * 返回                        :        无, J3 M" A, A1 x( {# S
  184. * 依赖                        :        底层宏定义
    ( G) U. x5 l1 s5 |2 C) Y
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>  D8 ?) S4 s' `/ [/ u
  186. * 时间                        :        2019-10-30
    8 E1 @+ _% ]4 a( f
  187. * 最后修改时间         :         2019-10-30' }& F5 X6 i, q; _6 |" v" G; O
  188. * 说明                        :        在显存中绘制点$ V  H. V  F0 Z7 u* y
  189. *************************************************************************************************************************/
    ( A; b! m3 e, j
  190. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    $ ~+ V. `0 `$ s" r3 J
  191. {
    . z8 g+ U/ x) C/ R
  192.         pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
    * y* k$ H# z( ]
  193. }+ W$ g8 K! p( a# B
  194. * L$ e8 t7 o& R
  195. ; F# h& h: y  B- E+ O7 J& C
  196. /*************************************************************************************************************************2 _, `7 ~! V; s: j) v7 z0 a* l
  197. * 函数                        :        void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)3 m5 H/ F7 b  l+ u8 C
  198. * 功能                        :        24bit色彩GRAM显存画点4 Z/ s% I1 \  W+ |' w- f
  199. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色' \8 W( {8 y/ M  J
  200. * 返回                        :        无* c- Y& l) g! _, u
  201. * 依赖                        :        底层宏定义5 S8 z+ A2 ]3 G6 n  I* i
  202. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 u+ K; V) Q7 x$ Q3 V
  203. * 时间                        :        2019-10-30
    # {5 g$ M. o0 E6 K
  204. * 最后修改时间         :         2019-10-30
      P. `$ A  Y. G  |% Q
  205. * 说明                        :        在显存中绘制点( G/ T% Y9 d/ R
  206. *************************************************************************************************************************/
    - r3 p% n6 `% f4 `1 B% T( g2 N
  207. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    1 ]2 S1 O9 {3 ]
  208. {* G( A' H6 g# N- N
  209.         memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);
    + I# w0 m% |$ @7 L/ b. h* B  q& w
  210. }
    , n+ R/ S+ r) p! q* }3 G  l
  211. 4 f4 D( r8 d. p2 f

  212. . O8 u) I  e8 E: S# @
  213. /*************************************************************************************************************************
    1 ^, h) L: E! z5 z
  214. * 函数                        :        void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    9 L+ h5 h, |8 v
  215. * 功能                        :        16bit色彩GRAM显存画点8 x% T2 \8 k, `: H
  216. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    4 z+ Z: Z& W: l+ Q! u- ]$ w
  217. * 返回                        :        无
    : P& |1 R/ ]) k
  218. * 依赖                        :        底层宏定义4 F* m+ ^8 r  p/ ]
  219. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>9 H9 A. Z/ A4 Q3 u
  220. * 时间                        :        2019-10-309 L8 o$ `4 L# Z# n
  221. * 最后修改时间         :         2019-10-30
      a% R% k) i2 @, p+ C
  222. * 说明                        :        在显存中绘制点
    * q9 Y& o4 R! _' Q: w3 c( ^
  223. *************************************************************************************************************************/8 r# ?4 Y' ?& f9 K
  224. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)4 n. m0 _, F$ m; y
  225. {
    ) I0 F6 u- P% W
  226.         pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
    . ^' i( }# d5 E
  227. }
    & Y; R& H; Y* {

  228. % }4 m& `, v: B8 X# j) A" P
  229. # E3 ^0 a# f3 W) Z4 h, S

  230. : g5 Y$ v" ?. h% ?
  231. /*************************************************************************************************************************
    1 l- ~# s6 h; Y& X! p- }% p3 k( M  g  E9 d
  232. * 函数                        :        void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)        5 X5 b. H( e3 J8 q9 _
  233. * 功能                        :        GRAM矩形填充(使用DMA2D)
    . k* N- c+ h* `
  234. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色# z- o6 e1 o5 ?4 S
  235. * 返回                        :        无9 M0 v+ {' F( p
  236. * 依赖                        :        底层宏定义  Y+ J% ^6 I$ f' \+ U3 O6 ]+ w7 ?
  237. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>  w* p: y; s" v  I$ m, ]
  238. * 时间                        :        2019-10-30# h) n# V7 c3 D/ i# P/ Y# Z
  239. * 最后修改时间         :         2019-10-30( W5 E$ ^4 \+ z+ p) m# o7 {' H
  240. * 说明                        :        采用DMA2D实现6 _3 z1 _6 i8 T0 \# Z
  241. *************************************************************************************************************************/
    , g* f; Q2 J; F/ U, k# [) T% r
  242. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)
    3 ^8 U- J" M  O7 g# f
  243. {% C* @, O( D( Y! W
  244.         switch(pHandle->ColorMode)
    : Z! f1 X, Q% S& h( f8 Z8 d: G
  245.         {
    * D! b$ B5 ]7 v) c: x
  246.                 case DMA2D_COLOR_ARGB8888 :
    1 R; |& r$ b" ?' h2 Y. W
  247.                 {, s1 |' G- b- q
  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进行单色填充
    - z9 i; b- _/ Y5 v3 Z
  249.                 }break;
    1 e5 t6 t8 x8 J9 J
  250.                 case DMA2D_COLOR_RGB888 :: O( d; b! J8 l+ S2 ~; ^
  251.                 {; y/ T$ X8 u9 m, [
  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进行单色填充6 |6 H, h  ]* f  K1 |: j- J
  253.                 }break;6 I7 c" ?; ]0 r) r. b! c- b
  254.                 case DMA2D_COLOR_RGB565 :( g# C& h  A2 J
  255.                 {, E! N) m# f1 P' k7 P
  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进行单色填充
    & r. n) l0 D/ L3 T  @
  257.                 }break;
    , o) M( E3 I' M6 }7 _& J
  258.                 default:return;
    - M0 ^( K/ u# u# ?% ^# f: X4 j
  259.         }
    # k# ^9 l5 M' Q2 p" `1 k
  260.         
    ) O: b: e- J! r  {2 G0 Z2 m5 w
  261.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                                                                //等待DMA2D传输完成
    3 X; Z5 x, O# O8 O6 ]- A' b4 ]3 z
  262. }
    9 o) h( C! J, k- c+ G7 J( Y; `- p% h

  263. 3 `& C2 v6 M/ O

  264. ; I, N" j. w2 {$ I. F, }
  265. /*************************************************************************************************************************' ^+ W2 P& `. l0 |
  266. * 函数                        :        void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
    7 }5 U' n9 G7 l& ~
  267. * 功能                        :        GRAM清屏(使用DMA2D)4 T- ?' u$ W0 m' t1 C7 A3 J
  268. * 参数                        :        pHandle:GRAM句柄;color:需要填充的颜色; D( f; u; D! p5 E7 ^) j. ^
  269. * 返回                        :        无
    $ `; A) f  }4 Y' d5 J  O0 G( T( s
  270. * 依赖                        :        底层宏定义
    ! N, g4 O7 g4 y0 y
  271. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>  W  m& W- u- H! ]: S/ y, G
  272. * 时间                        :        2019-10-30
    ' D: Q+ K" a  k0 A4 m
  273. * 最后修改时间         :         2019-10-30
    # m! {# ^. b# Y+ i; v5 E3 I. y: e
  274. * 说明                        :        采用DMA2D实现
    2 R$ [/ e$ {& N2 @6 O% c6 H6 j" E9 j
  275. *************************************************************************************************************************/+ V0 W  u! Y& m9 R* Z1 Z
  276. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
    * g: _" D! K) y( i5 _
  277. {
    8 V' ?$ D# j; S7 E0 s" ~0 ^
  278.         switch(pHandle->ColorMode): l2 f+ e' ~* }4 s
  279.         {( F: m8 `5 M0 R; ?
  280.                 case DMA2D_COLOR_ARGB8888 :5 a8 F* e  ?7 G/ Q
  281.                 {) o6 I$ r. t% q5 Y- R$ N
  282.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color);        //DMA2D进行单色填充; o* c3 C9 Q# N3 e8 [1 [
  283.                 }break;
    " V" m7 t! P# v/ q6 m
  284.                 case DMA2D_COLOR_RGB888 :0 Z& D: b& A( R; L
  285.                 {  y' {- G2 G# g! e
  286.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color);                //DMA2D进行单色填充
    : t9 v2 H0 t+ U0 M: V; C( w: N
  287.                 }break;
    - P7 ?# ^! g( N" m6 G( W9 u4 X. y
  288.                 case DMA2D_COLOR_RGB565 :
    + W) V" x! ?! L! [- l, g
  289.                 {
    7 @7 j9 Q4 \. n0 N- X0 O' v
  290.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充( A7 h( |0 m$ D
  291.                 }break;
    7 e9 O: }9 i% U) O+ \! j- m
  292.                 default:return;
    1 f) N- Z8 c1 j0 K
  293.         }: ~/ v1 D: r) }' l# \0 H% `; d
  294.         SYS_DelayMS(5);
    1 U. e" f. r; [* O
  295.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                //等待DMA2D传输完成$ `/ a7 V4 `# E4 ]" h
  296. }
    9 o8 S3 A; m/ ^+ {$ G: J
  297. # e+ b% ?6 ~, X" A6 r; _7 m( H
  298. 0 U' h  B6 W$ f& u6 C
  299. /*************************************************************************************************************************, m* ]: n) _# s: U9 ~. j/ T" S
  300. * 函数                        :        void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, / |! h5 Q; }0 v7 P7 r8 v$ B! ?
  301.                                                 u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    & X- I. p3 F  }2 w5 L& G8 b- `
  302. * 功能                        :        GRAM局部拷贝(支持Alpha)8 M# S$ i8 D+ ^' h% Y
  303. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;/ G$ S  l) c" T* q' S* E% i9 ~, [
  304.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度5 c! q/ L; J' L: {7 {: S; T
  305.                                         AlphaMode:alpha模式;Alpha:Alpha值;, i4 _1 ~) o7 i, I
  306. * 返回                        :        无, A& V0 y1 X' w" M1 f# c! _! Z% M
  307. * 依赖                        :        底层宏定义; Q$ @+ W5 [$ \  d$ y4 l
  308. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    / S5 T( S5 R& R3 o" T" I
  309. * 时间                        :        2020-02-02
    8 F3 b" ]" k3 g$ ~' Q
  310. * 最后修改时间         :         2020-02-02, @% \6 l& I' J7 S
  311. * 说明                        :        不会检查GRAM大小,请确保GRAM* d. d6 z1 w) `+ [
  312. *************************************************************************************************************************/9 `' _* d0 [% V5 z  T0 L& d* D
  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), H# v& S% t! O+ N: A
  314. {
    / ^' X( s' B$ P/ _" g# h9 [! o
  315.         u32 SourceImageAddr;        //源图像地址(通过地址控制开始的X,Y坐标)/ T+ p3 ^4 [2 A  _# H
  316.         u32 DestGRAMAddr;                //目标GRAM地址(通过地址控制开始的X,Y坐标);* ?4 H2 Y4 q& {
  317.         u32 PixelByteSize;                //像素字节大小; |5 }& n# a) V3 @
  318.         
    3 E' K2 n( d+ i4 T
  319.         if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL)& }& L- |* J" H- e) T3 g3 [3 `; V
  320.         {
    / e7 Z& m% U7 N0 u% r9 f) ]/ [& z
  321.                 DEBUG("无效的句柄,pDestHandle\r\n");
    ' `' L6 S4 ]  m" C7 N5 Z/ Q
  322.                 return;( u5 r& g: R5 n7 J! ^4 i
  323.         }
    ' M8 c. B' V- }) r4 u
  324.         if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL); _2 p* Z+ a! [( `) L5 Y
  325.         {
    1 a1 {; `* `' Q8 ^
  326.                 DEBUG("无效的句柄,pSourceHandle\r\n");
    . h1 d: M; A" u( U. S
  327.                 return;( p( a8 }6 A( |
  328.         }' c; b! n% U  D/ ~, q
  329.         //源图像地址(通过地址控制开始的X,Y坐标) 计算
    + D6 y; e4 i) ^1 V: n* z" z
  330.         switch(pSourceHandle->ColorMode)
    8 A4 K, C( m5 h8 L: s) r
  331.         {
      Q, h+ h4 K7 S
  332.                 case DMA2D_COLOR_ARGB8888 :
    5 C+ E3 Y" J$ r' L2 l
  333.                 {
    2 B  b+ J* g9 D) G9 z3 x
  334.                         PixelByteSize = 4;
    , e: y; H4 ?7 G" ^+ L2 P
  335.                 }break;
    6 d$ b6 c7 I3 v: p) Z
  336.                 case DMA2D_COLOR_RGB888 :1 Y2 {7 O) H; h- t3 Q" T0 x' ?
  337.                 {
    6 ^$ w- D5 R% A3 \5 J8 V9 ?
  338.                         PixelByteSize = 3;9 |: b% i# q/ h, \# p+ W
  339.                 }break;) o8 v; g2 y- X( a
  340.                 default: //DMA2D_COLOR_RGB565
    6 [# z+ r; U6 u; _' W' `; g7 o8 w7 J
  341.                 {
    5 v: ?1 e2 l! F: t
  342.                         PixelByteSize = 2;/ R0 u! H9 F4 e0 b" W+ F5 m
  343.                 }break;
    ; ?; e2 Z- Y( A7 b
  344.         }$ D; m* Z! V$ }$ R6 A
  345.         SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize;        //计算源开始地址
    2 u+ t/ d4 b5 W. }3 `/ b/ W- O
  346.         
      M9 w% M3 I9 G, f- h  {0 q4 c
  347.         //目标图像地址(通过地址控制开始的X,Y坐标) 计算
    + _+ z3 Y0 l) r8 ^
  348.         switch(pDestHandle->ColorMode)
    6 w& F. D! m, O" |1 [$ \
  349.         {
    5 B6 W. i6 C$ h0 d/ M
  350.                 case DMA2D_COLOR_ARGB8888 :1 `: d: ?$ ]7 H! ~/ R. b
  351.                 {2 T% @8 d  h( }8 a  |* W
  352.                         PixelByteSize = 4;
    . ^0 ~* K) a% x' S/ ^' d
  353.                 }break;
    4 Z+ ?- ?0 k% J" c( X: p
  354.                 case DMA2D_COLOR_RGB888 :
    1 G# ]1 e; p4 M% N- P
  355.                 {! e) m8 ]* P' K) J, i2 F' V3 G
  356.                         PixelByteSize = 3;% z, g1 V3 Y/ Y/ d4 d0 C: K+ b; F
  357.                 }break;- Q6 v1 Q! e& r4 \5 o5 c
  358.                 default: //DMA2D_COLOR_RGB565
    ; M* U2 c2 I1 h9 S' |7 |! G. h1 S' M
  359.                 {
    7 W7 s" M' B1 X  \" |
  360.                         PixelByteSize = 2;
    8 e* U; O* q( c6 c1 x8 ^$ s
  361.                 }break;/ u+ x, Z4 D8 L+ E! _- H- u
  362.         }3 B! ], r2 X# z4 M2 _' S
  363.         DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize;        //计算目标开始地址
    ! m: [5 [0 \+ ~8 {4 Y* _& ?
  364.         //进行拷贝, x* E3 ]7 Z$ d
  365.         DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode,
    0 A. Z; X7 [/ X1 \$ N: t
  366.                 pDestHandle->ColorMode, AlphaMode, Alpha);                                                                                                        //DMA2D进行矩形图形填充(会执行像素格式转换)
    * N- [% A, ?4 Z1 a) Y, w
  367.         DMA2D_WaitTransferComplete(200);                                                                                                                                //等待DMA2D传输完成
    5 O4 d! Y  O9 _; H7 n8 {% m, N
  368. }
    " k/ c; h8 q5 i5 \$ G
  369. & x3 m' x3 X- \' X( t4 P3 g
  370. /*************************************************************************************************************************
    $ P6 |4 @1 ?9 w
  371. * 函数                        :        void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, - o5 }0 b" g2 B! p6 _* {. x# T
  372.                                                 u16 Height)% ]: {1 O, m" C- o) u0 q
  373. * 功能                        :        GRAM局部拷贝(不支持Alpha)
    3 ^0 s% I( ~' T$ Q2 S& p7 u
  374. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
    3 i6 ?! T# Y! |: ~9 {$ s
  375.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度
    7 M9 P4 t! Y+ Q# ^
  376. * 返回                        :        无% d* n' Q. Q( o- ?. i) ]7 D1 b
  377. * 依赖                        :        底层宏定义
    ) U+ T5 K) J- @- S
  378. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>' v" L" L- Q, M% S
  379. * 时间                        :        2020-02-02
    7 W. c3 U: h% l: U
  380. * 最后修改时间         :         2020-02-026 {  M7 V, h/ D' f( ^2 X! d
  381. * 说明                        :        不会检查GRAM大小,请确保GRAM
    " X0 D% W9 N- V& }, h
  382. *************************************************************************************************************************/( H: s0 Z% w& F$ r
  383. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)
    2 D; X: ]. K% _( I. `( E: \7 W' a
  384. {: l  |8 b! w2 U; u
  385.         GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);
    , F8 y4 B, G+ J' D0 @; D" _
  386. }
复制代码
! I+ ?, j8 H4 C. e  K
  A' I# A0 T) o) b2 p
  1. /*************************************************************************************************************
    9 d# I; T3 _  X6 C) T4 B9 y
  2. * 文件名                :        DMA2D_GRAM.h# v1 G/ I/ g  {$ t% y* x" w4 v, p
  3. * 功能                        :        GRAM相关操作" J# I% \5 _# w4 ~. ]9 D
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>. V8 _& I4 i3 ~* ?+ M
  5. * 创建时间                :        2019-10-30
    ! T7 w- l1 M% E  }6 P* H! v
  6. * 最后修改时间        :        2019-10-30
    . H8 ~1 `# A5 y' K
  7. * 详细:                        显存相关操作接口
    % }. l( E, J, p4 M6 v$ G
  8. *************************************************************************************************************/        
    * L7 `  A% n3 K& q7 S2 B
  9. #ifndef __DMA2D_GRAM_H_
    1 }9 y  S4 i9 m* K$ c) ?  Y
  10. #define        __DMA2D_GRAM_H_           ! y& K/ d" x& A* Q/ W
  11. #include "system.h"
    % Q9 k+ ~- T! T# W
  12. #include "DMA2D.h"4 P4 F: {" N6 r, C4 O" @
  13. #include "SYSMalloc.h") B% @0 i* H, I! C! b. U8 p- m

  14. 6 m. U. k$ t+ I! q% z4 F
  15. //初始化状态id
      d5 a  @  p: y0 d/ _$ U0 {
  16. #define DMA_INIT_OK                0x1234423        //初始化成功(不可以释放)
    ' F' m9 o  \0 {# u0 x8 p6 s
  17. #define DMA_CREATE_OK        0x3643423        //创建成功(可以释放)
    & d; Z3 l1 S' z5 ^# M  J/ Y
  18. " l7 d& o$ L2 X. ~
  19. //颜色模式
    * F. b- t3 G- u5 v2 Q# J) ~; t
  20. typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;/ H& D" Z  b  B' n
  21. 3 g# \  P1 W2 r- k  f% B+ R
  22. , V( t, b6 ^0 b# R
  23. //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告); w* `! j$ V/ M. U: B$ E
  24. typedef struct
    ( x" ?# C: b+ p( g# q
  25. {1 U4 s" ?% t; D+ Y( z: ?# y: o3 V. t
  26.         void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //绘点函数
    $ b1 f/ _$ a( r+ \) B
  27.         void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                        //填充( C" X& S& z! l/ K$ E
  28.         void (*pClear)(void *pHandle, u32 color);                                                                                //清屏
    " |0 M% `# d9 k  x0 l* ^
  29. }GDI_BasicInterface;
    " p" I) U/ A6 o! N$ l( P1 p

  30. ' Q$ s" s/ }$ H% q* ~
  31. ' v- L9 e$ n7 |  \. [- w
  32. //GRAM相关接口-16bit
    / w% v4 _3 _6 i3 G3 L  Y. e( v
  33. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;6 F) ]% H2 L7 \- j( G) @( a0 }3 m
  34. //GRAM相关接口-24bit: p' I4 g6 C- M
  35. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;; v" Z9 A/ l+ L4 c% ^! {
  36. //GRAM相关接口-32bit
    8 ~* P( X9 H9 y1 b3 M2 K
  37. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;0 S& {- }2 k9 J! `% A) R
  38. 3 i* u  T7 O  X- ~8 q5 l7 I7 L9 _
  39. //所需的内存申请接口
    6 v" }8 J4 T& P9 E2 X
  40. __inline void *GRAM_malloc(u32 size)2 f" `& P4 V9 r. b/ _/ w) I( V
  41. {
    - O  M9 M6 j  Q1 B. ^% v$ e0 z
  42.         return mymalloc(SRAMEX, size);                        //内存分配(外部调用)-使用外部SRAM& ~3 ?$ \) B* X8 n( c
  43. }
    $ d0 |. ~$ H- n6 i3 f

  44. - A) J! U% m1 [3 K4 @
  45. //所需的内存释放接口+ H9 [- A, N' L/ Q; z, K' y
  46. __inline void GRAM_free(void *ptr)
      a8 U# k9 ?; W% p
  47. {
    9 s5 p7 @5 Z+ G8 n) v
  48.         myfree(SRAMEX, ptr);                                        //使用外部SRAM9 r4 C( D/ F5 l: E) n
  49. }5 |) k+ r5 m. g  W
  50. . K# g1 T7 m/ L8 |

  51. ) [$ N3 W. t$ a1 f' b6 n$ A  [
  52. //显存句柄$ [) q/ x% Z1 s$ L0 U) Z' H' U
  53. typedef struct
    , t5 x; `# N: `7 P) y
  54. {
    " I+ X6 p1 N4 c+ T4 }7 y
  55.         u32 InitStatusId;                                                                //初始化状态id1 m  s: e* k1 S
  56.         u32 GRAM_Addr;                                                                        //GRAM地址
    1 I) ^: P% {9 f' v: |4 [) v
  57.         DMA2D_COLOR_MODE ColorMode;                                                //GRAM显存像素格式
    7 L" h% V! A+ U5 y/ e
  58.         u16 Width;                                                                                //GRAM宽度
    + m6 G+ R5 C2 e9 Q+ D; l) Y# v) r, w
  59.         u16 Height;                                                                                //GRAM高度3 P; ~0 z% j3 g4 i' V$ d
  60.         u32 *pGRAM_32bit;                                                                //32bit颜色模式下显存指针
    & c  _' H: b. ^
  61.         u8 *pGRAM_24bit;                                                                //24bit颜色模式下显存指针7 C% a, B: ]/ F# J
  62.         u16 *pGRAM_16bit;                                                                //16bit颜色模式下显存指针
    6 d. O) j; g* v+ @  F
  63.         const GDI_BasicInterface *pBasicInterface;                //底层GDI接口( c) b, o  b2 _) l
  64. }GRAM_HANDLE;/ l, x$ O8 I) V  i* D& h7 R* J

  65. % M8 Q$ _* u' t, O1 Y: e
  66. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);        //GRAM句柄初始化(不会申请内存)/ f, ~- ~& m5 o' ^
  67. void GRAM_Delete(GRAM_HANDLE *pHandle);                                                                                                                                        //删除一个GRAM(会释放内存)
      M0 J& }# J+ q3 q9 ^* P
  68. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                                                        //GRAM矩形填充(使用DMA2D)" t: R) j1 ?1 U) e/ h0 l, n$ D
  69. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color);                                                                                                                //GRAM清屏(使用DMA2D)' D, @; `, h& f6 l1 a6 v
  70. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);                                                        //创建一个GRAM(会申请内存)) K: L4 l, j& x& _0 @
  71. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, , l/ ^3 F- Z4 d  b  [8 m9 v
  72.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);                        //GRAM局部拷贝(支持Alpha)' x7 }- I8 B; T) T
  73. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
      a% T. N4 A% ~% l& N2 s
  74.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height);                                                                                                        //GRAM局部拷贝(不支持Alpha)
    0 K, d$ \% _' r$ k

  75. + G& h3 `% B, v- p0 L9 D- Z
  76. #endif //__DMA2D_GRAM_H_
复制代码
  1. /*************************************************************************************************************# [; z+ q) `+ Z% h& W5 t8 U
  2. * 文件名                :        GDI.c
    + H: w! |3 ^! x! k8 j/ G2 l
  3. * 功能                        :        图形设备接口(Graphics Device Interface)
    4 I: N. ~5 N  F
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>1 u' }8 d" b: x! h5 D1 R: L6 s& j
  5. * 创建时间                :        2019-11-02
    8 _8 E" `' j$ c# T# F* t) o1 g
  6. * 最后修改时间        :        2020-02-02' Z! T! [# W# j- s+ c9 U" m
  7. * 详细                        :        STM32F7 图形设备接口* I9 g. C5 I, ]& r3 F+ Q# W' m3 R4 \
  8. *************************************************************************************************************/
    % x! h, v4 f, N
  9. #include "system.h"
    3 T, l7 [% r5 ?6 n8 I
  10. #include "DMA2D.h"
    ' m1 z; Q. S' k! j" ?$ ^7 }' p
  11. #include "stm32f7_ltdc.h"8 P4 L# {0 d( f0 U
  12. #include "DMA2D_GRAM.h"
    # ?3 t+ X4 B# I$ \) O1 I; u! \
  13. #include "GDI.h"
    % r, J  Y* I- c1 O! b
  14. - A1 o$ C6 q# |
  15. //显示器Layer1 GRAM定义
    $ n3 t% |6 O5 I& t; ^1 X4 f
  16. const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle = 2 h& v5 q! P# N
  17. {0 |1 a; J+ p9 `+ b" @2 R+ d
  18.         DMA_INIT_OK,
    & z; {  k3 ~: m3 p, A* y7 v" a
  19.         (u32) &g_LTDC_BUFF_RGB888[0],        //GRAM地址8 u( {% ]' ]% S1 w. J  J+ x
  20.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    ; |. j- y1 z. u# ]
  21.         LTDC_WIDTH,                                                //GRAM宽度
    ! P$ b, \/ Y. B, Z* p  t6 c* P
  22.         LTDC_HEIGHT,                                        //GRAM高度( U7 o$ A. a- x! N5 R
  23.         (u32 *)&g_LTDC_BUFF_RGB888[0],        //32bit颜色模式下显存指针
    $ U4 R- A; s) `% l
  24.         (u8 *)&g_LTDC_BUFF_RGB888[0],        //24bit颜色模式下显存指针
    ' g8 G1 {  ~0 I2 T3 O% [
  25.         (u16 *)&g_LTDC_BUFF_RGB888[0],        //16bit颜色模式下显存指针
    ; c. _" p( `! G: D# J1 n
  26.         &cg_GDI_GRAM_Interface_32bit,( |* Y6 ~( }0 V8 M
  27.         - J' A7 T: }. T& J; N
  28. };4 q( u4 ~3 o2 t( t

  29. 3 i( U) i! s- c  ~5 f. ]! B+ ?1 r2 a9 X
  30. //显示器Layer2 GRAM定义
    / F5 O2 o8 d0 }* F2 u  S) y( M
  31. const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle = 5 X1 k  ~5 Z% m
  32. {- H' ]) T4 d0 V6 ~
  33.         DMA_INIT_OK,
    ) P% b$ j) Q. R6 B( q7 H( p
  34.         (u32) &g_LTDC_BUFF_RGB888[1],        //GRAM地址5 D. J6 C4 ^) B* n3 j# ^- I7 W8 Y  Q7 u
  35.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式/ g& R2 X/ }5 q% `: p0 `$ C
  36.         LTDC_WIDTH,                                                //GRAM宽度7 f  y0 B% E$ V* Q6 V5 I1 v5 z) r+ u
  37.         LTDC_HEIGHT,                                        //GRAM高度+ N5 m) i, w0 `6 s$ s  F* d+ W; E
  38.         (u32 *)&g_LTDC_BUFF_RGB888[1],        //32bit颜色模式下显存指针! x0 A! j, d( H" ^  ^
  39.         (u8 *)&g_LTDC_BUFF_RGB888[1],        //24bit颜色模式下显存指针( o+ M7 s0 N' Q3 c; w- Y) J
  40.         (u16 *)&g_LTDC_BUFF_RGB888[1],        //16bit颜色模式下显存指针
    3 \; K6 E: \' f+ M% e" x  C- o+ z
  41.         &cg_GDI_GRAM_Interface_32bit,1 x7 C& G$ w, A% S, Y1 X# I
  42. };: [! Y/ S! v& D6 q
  43. + U7 }4 c1 x+ D( ]( }, o

  44. . E+ l) ~; N& c) a& ~2 m$ i! `) B
  45. /*************************************************************************************************************************
    : O6 w6 B9 P' g* M' B
  46. * 函数                        :        void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
    4 p! U0 x1 g2 h
  47. * 功能                        :        绘制空心圆
    ( _. {0 d% Z/ Z: S: s" ]0 B) w3 ~
  48. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色
    8 c+ c0 T5 U( k. o+ c* V
  49. * 返回                        :        无4 v3 a) U+ B+ V) S' a( p0 m
  50. * 依赖                        :        画点函数* n( G* I7 P2 z# U
  51. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    : g7 i: Z: ]) v3 K2 ]/ u
  52. * 时间                        :        2011-09-20
    0 s$ q# Z2 k5 o, `* q, S
  53. * 最后修改时间         :         2019-11-02  F, y' u8 H6 ~) i6 C
  54. * 说明                        :         无
    / w+ U$ c5 W' i4 U
  55. *************************************************************************************************************************/
    ) K/ q) o9 Z* T/ v
  56. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
    ' s1 i3 R. s( ~) l1 D
  57. {3 B7 R8 C8 L1 u8 Q
  58.         int a = 0,b = Radius;
    & H3 Q# ?* V% C1 C
  59.         int di;8 m8 _( V$ l1 P' n5 @/ d5 ^9 H
  60.         di = 3 -(Radius << 1);           //判断下个点位置的标志$ Q6 S+ d4 M4 c" Q2 @9 B8 K4 w1 i

  61. : J0 y  }0 T, g4 d/ l
  62. #if(GDI_PARAMETER_CHECK)                        //参数检查
    0 `8 U7 r8 B! u+ v. W
  63.         while(pHandle==NULL)2 @" J. l0 |+ o8 B9 F2 G, O
  64.         {1 p4 F$ @9 t8 J% o* L6 g
  65.                 DEBUG("无效的句柄 pHandle\r\n");
    2 {' b$ I" o% E" r6 s, W3 g( M
  66.                 SYS_DelayMS(1000);
    ' U5 k% C& W  `9 Z
  67.         }        & U# W; l  s& ?- T8 ^$ t
  68. #endif //GDI_PARAMETER_CHECK
    ' i( U3 Y7 a$ d' x9 ]) |
  69.         
      i, P# J; q& Y& _- F
  70.         while(a <= b)
    ; A4 X/ ~' K0 W( G5 P6 H. j7 W
  71.         {2 X2 E0 `( s+ z0 Y9 |
  72.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //3           
    ' Q. L  t2 @% Z  H! ^, s% D- S" `
  73.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color);             //0           ) {1 @8 {4 X6 n2 V8 V4 k
  74.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color);             //1       ; y1 P  Y# {# [. b8 e
  75.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //7             `7 i9 F( ?2 a2 m4 g; q/ Y7 [; ~3 [* l% C
  76.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color);             //2            
    , s9 N' X/ F! A( F' p( W
  77.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color);             //4               3 v6 e7 m( I2 V* e, b5 t
  78.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color);             //5
    ' n$ U6 d7 U8 a1 l( E/ X0 K, G5 D
  79.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color);             //6
    ' E. O" D' ~7 g0 P
  80.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);             : m" A" i/ Z4 B
  81.                 a ++;
    8 \% A& ~: V. t$ B) r# W; B
  82.                 //使用Bresenham算法画圆     
    ' {7 K) X" P7 r7 c% E) ~- Y
  83.                 if(di<0)
    + D4 Z  o. d# {3 X% s' t
  84.                         di += 4 * a + 6;                                                                                    
    # \- o0 U" T% _9 [( I6 d
  85.                 else
    - n9 F, n  v6 U& t8 b8 h$ g
  86.                 {
    5 _5 Q2 C: k( g/ ^
  87.                         di += 10 + 4 * (a - b);   % ?* H6 E7 S( i5 N  o& m
  88.                         b --;/ K0 p8 x) v0 w  O) k1 X( u  b8 c) t
  89.                 }                                                                                    - T& t8 \2 f9 h5 S3 e0 I' W
  90.         }                                                                                  : j! J' H$ K8 V, }
  91. }9 n8 P0 v' G+ A2 P0 M# g( h7 v
  92.                                                                                                                                           
    3 i# q9 w, d/ k, Y  l

  93. 3 z8 b6 L' B6 o% [
  94. /*************************************************************************************************************************4 j: q8 r2 C! {# i. }
  95. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    " D; p9 j; a3 V
  96. * 功能                        :        绘制直线(可以倾斜)# [' t! h' M$ j) N
  97. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色
    & E, M: ~9 w9 B& d3 ?
  98. * 返回                        :        无, A$ w. _1 \# D. S/ D: e
  99. * 依赖                        :        画点函数
    5 X- Q5 ?) @. A- @# ?
  100. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>, m& a/ S" N/ C9 m
  101. * 时间                        :        2011-09-20
    + q: U* Q; H$ ~. r; D
  102. * 最后修改时间         :         2019-11-02" G( u* Y8 z( w  T" J: c
  103. * 说明                        :         无
    % X) V, ?' U" ?% P4 J: I/ K% k7 h* u
  104. *************************************************************************************************************************/( m; D7 K9 ?) N+ @* p7 S
  105. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    5 o% w, s: d# }6 M
  106. {
    " M! }+ u- a( P4 d- K
  107.         u16 t; + E" a' U, u+ v8 k! q5 u! j; ]
  108.         int xerr=0,yerr=0,delta_x,delta_y,distance; ! P  B1 z5 @: {$ K: q+ |4 a- V% L
  109.         int incx,incy,uRow,uCol;  t5 v6 y- z# V6 |
  110.         
    ( J$ h3 f  i8 v" G3 j5 H
  111. #if(GDI_PARAMETER_CHECK)                        //参数检查- M" x4 y/ W( y4 h! x8 T  {
  112.         while(pHandle==NULL)
    # M% r4 c2 O+ h$ C3 b- c4 J
  113.         {
    , w/ I/ _& d( T$ ]
  114.                 DEBUG("无效的句柄 pHandle\r\n");3 D( s; _% s# K$ A7 M
  115.                 SYS_DelayMS(1000);
      J+ d- X( |$ l; b' Y. X0 f: t
  116.         }        / U- p: [1 i  `- b( n6 T6 Z
  117. #endif //GDI_PARAMETER_CHECK        
    : V* m( M* o) B+ ]
  118.         1 c. m' v( _; t" d+ J* I% b
  119.         delta_x=ex-sx; //计算坐标增量 # E1 g, {6 M- g
  120.         delta_y=ey-sy;
    & r" u+ J" q2 x7 g
  121.         uRow=sx; ; W- Q5 U4 u, F- u! ~
  122.         uCol=sy; . c" g+ F5 l) ^! I+ a
  123.         if(delta_x>0)incx=1; //设置单步方向
    ' V/ M7 a" J) t) G5 n
  124.         else if(delta_x==0)incx=0;//垂直线
    $ X* `) @) d( O3 H. w
  125.         else {incx=-1;delta_x=-delta_x;} 9 n1 `; t/ l0 C9 i- O( a( X
  126.         if(delta_y>0)incy=1;
    ( E) K+ p& P. X6 b" b2 X+ I
  127.         else if(delta_y==0)incy=0;//水平线
    8 _. I  \9 A2 N. Z8 Y
  128.         else{incy=-1;delta_y=-delta_y;} , I5 C9 D1 E+ g4 M4 t/ ~! c
  129.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
    % s- g8 [5 {& |  Z! F7 w& Y& k. H
  130.         else distance=delta_y; 8 I/ p# Y" ?: a! j
  131.         for(t=0;t<=distance+1;t++ )//画线输出 " t3 L" `/ P, t
  132.         {  ' E, F1 Z6 X% ^# y  P0 |
  133.                 pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点
    : [8 _4 p9 @; k$ K2 T/ p- R. Y' C
  134.                 xerr+=delta_x ;
    $ _" e7 S  @" J6 \" ?; v; u) d- e+ r
  135.                 yerr+=delta_y ;                                                                                                 3 w# e" g7 I, U% P  Z* _! r% M
  136.                 if(xerr>distance) 4 K6 M9 f, G1 ], X# M" S
  137.                 { 1 E# \6 |1 G$ o  D
  138.                         xerr-=distance; / \. _, n( v) U+ X- N
  139.                         uRow+=incx;
    & T( @$ D- g% F( ^* V, u: z
  140.                 } ! h, f, U3 b( s% j, @
  141.                 if(yerr>distance)
      [1 A/ p5 ^+ \7 s! W* @' E5 S
  142.                 { ( w( K' J* o$ u7 _
  143.                         yerr-=distance; 3 o% ]# P) p# n2 Q
  144.                         uCol+=incy; # G- i+ b9 }5 r1 k+ w
  145.                 } $ h+ D# x3 s$ ]4 G+ s
  146.         }  # R4 J9 S- H6 D- r4 ?$ x3 i# C8 r
  147. }
    % ?  i0 k# Q# e; u

  148. : q( [( \7 _3 I3 p
  149. : H9 R6 |5 H0 e  P" b1 L
  150. /*************************************************************************************************************************
    # P$ d/ O1 c$ b
  151. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    & [$ n' l! ?7 T, @
  152. * 功能                        :        在指定位置画一个矩形" {* Z- {& a9 W- @: s' @
  153. * 参数                        :        pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色* Z9 \- I) S& M, o; {
  154. * 返回                        :        无* `0 U" q! I/ k& R
  155. * 依赖                        :        画线函数0 g4 ~2 O3 f) f3 E% h6 Z
  156. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    8 s6 ^' d7 d& k6 j
  157. * 时间                        :        2011-09-20
      W; k. q8 B% t/ ~5 y- e
  158. * 最后修改时间         :         2019-11-02
    / y8 D( x, ]/ |
  159. * 说明                        :         无) @, m$ z& Y% Q' @) s3 m
  160. *************************************************************************************************************************/! Y8 ^* @; f" G8 j' I6 z
  161. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)
    ! o( n; [3 @' O
  162. {9 l0 H& G$ j1 u2 j1 G, D) D) u) L
  163.         5 R5 b5 H( J1 [* V2 W
  164. #if(GDI_PARAMETER_CHECK)                        //参数检查1 q' U" F+ `# p9 }  i$ V7 v% d" }1 [
  165.         while(pHandle==NULL)
    0 S% @/ i* }, ]7 ]; r
  166.         {
    / B# P3 l  ^' X
  167.                 DEBUG("无效的句柄 pHandle\r\n");2 ^2 X- R. a8 [% y
  168.                 SYS_DelayMS(1000);
    . Z  C3 ]! l9 z% [+ r! ^7 s
  169.         }        # G; H* R6 z" ]8 E" v6 E
  170. #endif //GDI_PARAMETER_CHECK( N! {; ?* v- @- c3 i3 X/ i
  171.         
      U- G& u+ f& m. ~# I% `2 r
  172.         GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);4 Q. s4 m. A* A0 _6 j& c* h
  173.         GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);
    " i9 t5 t; j0 H9 \7 o; ^" a3 [
  174.         GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);
    , l0 |9 P' M0 z+ \7 J
  175.         GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);
    # y* N* |! s1 t+ n# S% y
  176. }                                                                           . N& y% \. X0 t7 N+ z

  177. * @! X& ?  r9 J  M# k% @3 r6 |( }- y
  178. 7 D* }1 l5 H" j2 `
  179. /*************************************************************************************************************************' H" J! X: D* _+ y/ ?# ]. K
  180. * 函数                        :        void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)* `7 R3 `$ [* B( P
  181. * 功能                        :        画一个2*2的大点
    * F8 n4 b0 [% Y
  182. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色( ^: I0 [9 J  P1 t
  183. * 返回                        :        无0 g5 y; ~: |1 ^2 z+ ~, N
  184. * 依赖                        :        画点函数, [  V+ l, t0 X8 d/ Z" q
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>" f5 X: u0 V( r5 {4 J5 F
  186. * 时间                        :        2011-09-20+ M) j, t+ a2 Z; T7 R
  187. * 最后修改时间         :         2019-11-022 C$ [5 |, \5 m' N' Q
  188. * 说明                        :         无
    0 ~4 E/ m" G3 O: x: m9 Z9 ]( n2 w! }
  189. *************************************************************************************************************************/5 a. w9 ~% }0 R8 Q
  190. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    2 ^" o" X$ k" K) N# F' K9 R3 B0 Q
  191. {        $ b) L/ y  `- I, v6 [1 o. `
  192. #if(GDI_PARAMETER_CHECK)                        //参数检查
    " j4 J# p) ^5 L9 I, I" i
  193.         while(pHandle==NULL): h' y4 |% A# k2 V  K# s, x
  194.         {# a+ Y# u: g: i- |7 y; c! P
  195.                 DEBUG("无效的句柄 pHandle\r\n");
    + t' [+ _  J8 t( f* m' x4 m+ m
  196.                 SYS_DelayMS(1000);5 s  Y% V( G) H' O! g) J! X
  197.         }        6 f5 {% x5 C) c
  198. #endif //GDI_PARAMETER_CHECK* f# F7 G, {$ H& }1 Y3 ]0 C
  199.         
    . }" y/ Y9 }* Q& ~/ D
  200.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                //中心点 % ^5 A) p2 G7 k' _
  201.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);9 {+ D$ s" x' z! t
  202.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);
    ) r3 [. o8 Z5 h" @# P. s( Z7 V+ R
  203.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color);                           
    6 C( V4 _$ o- }% u$ V6 |9 G$ S# D
  204. }        
复制代码

1 w: w  R* p; F3 n! S! Z( b) R+ Y) ~" m* u' ]1 p
  1. /*************************************************************************************************************
    2 F) b4 N% D9 P, A1 X3 E( ]
  2. * 文件名                :        GDI.h
    0 p  g1 l- N$ M  R
  3. * 功能                        :        图形设备接口(Graphics Device Interface)
    0 q3 }1 {) X2 \# I* _) [- S" f
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>9 ~. X3 [' z* j5 o
  5. * 创建时间                :        2019-11-02
    ; j& U7 ^+ R9 y. o/ W
  6. * 最后修改时间        :        2020-02-02, s  `( e5 b& E+ M
  7. * 详细                        :        STM32F7 图形设备接口
    . M% J# r* F  h+ w& z2 F+ W+ i5 x
  8. *************************************************************************************************************/& F, N+ D9 ^: n+ C
  9. #ifndef _GDI_H_
    4 F0 x6 W! Y  r- z7 e( N
  10. #define _GDI_H_9 y% p4 N* _, A' t4 G! E! _' ]( @
  11. #include "system.h"* R: F' d  y  ?" B+ P  s( w/ \
  12. #include "DMA2D_GRAM.h"
    3 p! o  y0 f7 Z% ?: `

  13. 9 B: R5 i: |* L8 w4 g/ I# V) p  `
  14. #define GDI_PARAMETER_CHECK                1        //参数检查-主要检查指针
    $ H% f' v" R$ J: G
  15. #define GDI_DEBUG                                1        //调试输出
    4 f& M2 ~  F* y4 K
  16. ; i6 S- S7 i* R3 f6 S4 P* a
  17. #if GDI_DEBUG0 {2 P3 Y- C% [
  18.         #define GDI_debug(format,...)        uart_printf(format,##__VA_ARGS__)4 T% Y0 F" G  p1 ~5 O- I
  19. #else
    / m& @+ L0 I; r. m+ e* |* h
  20.         #define GDI_debug(format,...)        /\
    , L+ N4 ^% E  p9 b2 l# @( q0 ~( M
  21. /1 V2 i  V' O  x7 _% H
  22. #endif        //GDI_DEBUG
    0 A: }  i0 X( L0 M8 K
  23. 2 g# E  _4 a7 ~  A( Q7 ?' L
  24. 7 F3 M# [0 L% V2 y/ _( j
  25. * j( x% K" B  D
  26. extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle;        //显示器Layer1 GRAM定义
    $ Y) i4 s. W- v! w* `# w" x" G; D  p
  27. extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle;         //显示器Layer2 GRAM定义
      N& r7 q/ |& V+ u) s% v. h
  28.         
    ; K0 O9 h! A- {- l
  29. #define LTDC_Layer1_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle)        //显示器GRAM 1* v( t. k0 q6 x' d9 w
  30. #define LTDC_Layer2_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle)        //显示器GRAM 2
      x5 W2 i) \0 G/ W/ _, I1 ?* W" c

  31. * ~9 g7 q- W- F2 H7 C
  32. //GDI相关API2 u& N& X# r2 \9 f
  33. __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)/ d  c3 ^" n2 G/ G6 D6 g
  34. {        
    8 k* s3 Z+ U4 u6 l  W2 Y( ?/ q' Z
  35.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                                                //画点 ) z8 p9 w5 V" [$ r( w
  36. }        
    . w& J/ i: ~: B7 S3 Y4 h: C
  37. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color);                        //绘制空心圆% f3 O4 ~7 Y, |. H  i  I: I" `
  38. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color);                        //绘制直线(可以倾斜)6 G9 T9 J' a1 a/ ?0 |
  39. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color);                //在指定位置画一个矩形6 K( ^& P8 G* w# P6 R7 [' W- s9 Y# [
  40. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //画一个2*2的大点( J' {2 U0 I9 i3 p3 X  A
  41. . ^& ]( d8 Z, R3 j

  42. # ^1 D3 B; Q0 B8 u! t
  43. #endif /*_GDI_H_*/
复制代码
4 K: @- T+ d/ N4 `) f# W
测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。- L2 ~9 x0 t/ N; c- w' q

0 G3 |& {$ R# m0 u
  1. FIL *pFile;) ]4 B; D7 q  _
  2.                 FILE_ERROR mError;5 s4 j7 S' w8 ~/ n4 j
  3.                 GRAM_HANDLE *pGramHandle;
    5 s; W5 E! z# w1 B8 |
  4.                
    , l& q+ w9 m' l! V: h6 _; Q5 q
  5.                 pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565);        //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB565# O* M6 [. N3 ~0 O8 T# h
  6.                 if(pGramHandle != NULL)
    " u9 s: V0 S9 P% v# b: x9 M! B, H
  7.                 {
    & X; d9 S7 z" r8 s& ]
  8.                         GRAM_Clear(pGramHandle, 0xff00);                                                //清除显存,防止读取失败了还是现实上一次的图片
    0 M8 n' e* |5 q1 I5 [; z
  9.                         uart_printf("[OK]GRAM初始化成功\r\n");
    0 P2 g- z6 I' K0 I5 e* {2 s
  10.                         pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);+ o; f' v1 `( x
  11.                         if(pFile != NULL)1 S5 m) ~0 }* F- }( K- |3 U
  12.                         {
    6 {# e4 f& z6 E2 P' a
  13.                                 uart_printf("[OK]打开文件成功\r\n");
    9 |9 c2 L6 J0 |8 o: W6 K. J, N7 C7 ~# ~
  14.                                 if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中
    1 M4 U. j% x  X, _, S
  15.                                 {
    ' {& c( C* \2 y% Q- ~! H( j# X
  16.                                         uart_printf("[OK]读取文件成功\r\n");  M9 \8 c5 H+ n6 X& I- B1 w
  17.                                 }  u- c' H+ X, _$ a2 F
  18.                                 else
    . W  ?( t9 n2 f+ s- m
  19.                                 {$ J1 c, o) I0 u( B
  20.                                         uart_printf("读取文件错误:%d\r\n", mError);
    0 B9 `; L2 b6 S1 t/ p( F$ U+ D
  21.                                 }
    : j5 |5 K/ {7 \  c
  22.                         }
    2 [" @$ b% P* H! z; Z4 ~- @" b
  23.                         else9 B0 p2 ]3 m: x9 t9 k
  24.                         {
    5 c8 q3 Z" D  v' }2 {0 m+ H5 I" L
  25.                                 uart_printf("打开文件错误:%d\r\n", mError);
    3 Q- I) Y; p- `
  26.                         }* Y- ]4 M$ K+ o5 M( |" G
  27.                         //将显存拷贝到屏幕中
    ! J4 T9 _& |( W3 R/ H
  28.                         GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240);                        //GRAM局部拷贝
    6 v/ L- B  i& Z7 y( b$ X! P" h
  29.                 }
复制代码
7 _. m( g( L9 U8 F; C2 f; c4 E7 [

( c7 `1 C9 v& X4 _. `( C$ L2 j; \. U
8 a: E- W- _$ ?5 N. V; K# V
赞 收藏 评论0 发布时间:2021-12-16 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版