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

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

[复制链接]
STMCU小助手 发布时间:2021-12-16 21:00
DMA2D可以加快图像填充,并且支持像素格式转换。
' Y! F# _% d) f3 O! t7 k. Z# P
% N$ n8 g! `( X5 j
  1. /*************************************************************************************************************
    1 V7 j6 l! D! \1 t, `& V6 B  Z
  2. * 文件名                :        dma2d.c- q& G/ Q9 u/ u4 v( W( w( V
  3. * 功能                        :        STM32F7 DMA2D驱动" [9 K" @+ A4 G' Y0 Y* S
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ( A- U" n4 D+ p7 a
  5. * 创建时间                :        2019-10-29
    / P2 \: E6 V# _; L! _
  6. * 最后修改时间        :        2019-10-29
    * C) y: b! B1 h
  7. * 详细:                        
    ) T7 [1 ^7 o9 ?! q/ W
  8. *************************************************************************************************************/        , G, B; R/ h0 m8 H# x' `
  9. #include "dma2d.h"3 x7 f" q: M# K$ F* E9 d# C% e' n
  10. #include "SYSTEM.H"
    ! ~& @4 }% \5 `
  11. # J! e$ k: l: ?; n

  12. 5 x5 p. K5 k( W7 o
  13. /*************************************************************************************************************************  \7 q  I; |  ]' \$ j! n, L* l5 E% Z
  14. * 函数                        :        void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)& [1 j2 P, B1 g& a+ @* u) d; K
  15. * 功能                        :        DMA2D进行单色填充
    , _0 k- u, ^5 Z  C
  16. * 参数                        :        FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;
    3 K) K- x3 p0 O3 {' L
  17.                                         ColorMode:颜色模式;Color:颜色值
    9 y, [) G9 h# k" b- {) t4 j
  18. * 返回                        :        无
    7 a. a5 m+ S( C! A
  19. * 依赖                        :        底层宏定义
    5 K$ h3 D# k8 g( b0 Y& J2 o" h
  20. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>7 ^* c( `2 q' y  }; [9 M
  21. * 时间                        :        2019-10-29
    , n( g, J) y1 R; k" |! }
  22. * 最后修改时间         :         2019-10-30
    ) N9 T1 W) q7 e
  23. * 说明                        :        用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束: o6 O& _& I: a4 z# J$ ?
  24. *************************************************************************************************************************/
    ) l- F; k  K9 A. c/ x, f/ ~6 d
  25. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)
    6 J  @& ~; R* l6 P9 e
  26. {* I' j; H  _4 o% V  ^5 P
  27.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟# l7 i4 F  S% i* P
  28.         DMA2D->CR = 0;                                                                //先停止DMA2D* r% Y8 s, x2 Z3 ?1 Q
  29.         DMA2D->IFCR |= 1<<1;                                                //清除传输完成标志
    . ?( Y- m0 {9 ?) I
  30.         DMA2D->CR = DMA2D_MODE_REG<<16;                                 //寄存器到存储器模式
    * I+ ?6 U1 e) v6 h% v9 S! @
  31.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
    3 b$ a+ J8 J& @+ Z  l
  32.         DMA2D->OOR = OffsetX;                                                //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    ) }0 U/ t5 U) c
  33.         DMA2D->OMAR = FGRAM_Addr;                                        //目的地址
    ' t* Q3 j  c( I
  34.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数  o: O8 R4 ~" h2 q1 o
  35.         DMA2D->OCOLR = Color;                                                //输出颜色3 |1 K1 w: e' r2 \. ?  f$ I- C0 L
  36.   S* a4 Y. C0 i# G- H, |
  37.         DMA2D_Start();                                                                //开始传输
    / h/ g6 b7 a- V" Z
  38. }
    / Z5 \% {' W# l3 O. y/ o! ~1 @& @

  39. ' ]' o- Z% t  V5 B3 y
  40. - T  M5 b" H9 S1 p3 B+ [
  41. & @7 E# Z& h* u  n" G- J
  42. /*************************************************************************************************************************
    / x7 Q3 s0 }4 S5 Q
  43. * 函数                        :        void DMA2D_WaitTransferComplete(u32 TimeOutMs)
    4 _4 c3 @  N, ~8 A, c! P( [  D
  44. * 功能                        :        等待DMA2D传输完成
    $ [. {# ?# {: D; u' M4 O, G
  45. * 参数                        :        TimeOutMs:超时时间% J- T" \7 [" Q8 a) U
  46. * 返回                        :        无; e5 ]6 n) u8 j) C2 E) s
  47. * 依赖                        :        底层宏定义
    : q' ?2 e5 H% \3 X. m5 i
  48. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>/ _# R; [1 U/ L- q
  49. * 时间                        :        2019-10-30
    ' D, o: o- Q$ n, G
  50. * 最后修改时间         :         2019-10-306 A6 [' J- w( Y6 o3 A( Q) E
  51. * 说明                        :        超时后会取消传输% V) S2 w  E* j( j2 a, L2 d; b, y8 h
  52. *************************************************************************************************************************/; o( Z- ]: @0 h
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs)
    ; u8 Y% n- L0 L' Z
  54. {
    7 |) U( j# I9 X  S$ @4 @* O! M& w6 k. @
  55.         u32 timeout = 0;& N9 Y' f/ B9 [( ^1 f  j4 v" b
  56.         
    2 Y& F: p- h, }. i1 Q1 J  O
  57.         while((DMA2D->ISR & (1<<1)) == 0)        //等待传输完成
    6 I$ c& ]) J- N: ~6 W
  58.         {
    / ?& b) o8 o- b) L! t2 \
  59.                 timeout++;
    1 h' l% D9 B! T+ \8 \5 Z
  60.                 SYS_DelayMS(1);                                        //延时1ms* u6 z$ U2 r; W( v) _
  61.                 if(timeout > TimeOutMs)
    # b& H$ q! x4 ]8 w7 G& p
  62.                 {' _0 l. ?2 s" Y- }6 u
  63.                         DMA2D_Abort();                                //终止传输/ U8 d1 i6 O/ u0 e9 ?5 x9 e3 N
  64.                         break;                                                //超时退出; q0 ]; N2 J- E4 L' s2 g
  65.                 }% [0 p" Z. f* T4 A0 Z
  66.         }  , M7 W; q& q$ v8 p, x& B& U( v. P
  67.         DMA2D->IFCR |= 1<<1;                                //清除传输完成标志         ; q& G9 [6 C/ L
  68. }3 L; G9 G, u+ S  \9 S" D6 s

  69. ; T+ T% ]" g3 e
  70. /*************************************************************************************************************************
    & E6 x& z0 p2 B( A: @
  71. * 函数                        :        void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)
    " G4 w8 H; D& [) Y2 o1 i4 T" y
  72. * 功能                        :        DMA2D进行矩形图形填充8 @" o; a2 l2 j' R% Q; C& i: a
  73. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
    ) l8 U& v" ?- D0 _8 Y6 g
  74.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);* f9 j$ }; p& T4 E% u1 f
  75.                                         ColorMode:颜色模式
    # V" O. x, \0 H/ e. [% y
  76. * 返回                        :        是否设置成功
    ; q) p" n- i$ Y3 h
  77. * 依赖                        :        底层宏定义; k6 m3 V5 ~  F
  78. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    - N* D9 D" ]0 l  o) G9 s$ B
  79. * 时间                        :        2019-10-28( d  l5 u6 t9 h  p' c; X
  80. * 最后修改时间         :         2019-10-28
    : L  G2 P& K, u5 w0 Q& ^& V
  81. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束9 {3 O5 F! G' @: O# j
  82. *************************************************************************************************************************/4 P  u! i1 ?, G$ v0 {
  83. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)- Z# Z9 S/ n  M7 D8 [. j4 o3 V8 |
  84. {
    $ [# k+ h: S3 f4 H2 x
  85.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    * F% k' [9 D/ W: M2 Q
  86.         DMA2D->CR = 0;                                                                //先停止DMA2D
      c% D; U% _! \6 {/ E
  87.         DMA2D->CR = DMA2D_MODE_MEM<<16;                                 //存储器到存储器模式
    ! i7 F: I! H& `. U$ d6 u+ m3 \
  88.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    , G# {  K: t$ c/ b; x6 S
  89.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
    # r3 m* _$ _. r" S5 n: x' d
  90.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
    ' O" e& d- q# o' K# D
  91.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移 $ b3 A2 I  |% F% A* `
  92.         DMA2D->FGPFCCR = ColorMode;                                        //源图像颜色格式
    4 `( H: v  `9 m, ]8 g: N4 m0 X& M
  93.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    / d3 z# X! j, x3 h2 S8 }
  94.         DMA2D->FGMAR = SourceImageAddr;                                //源地址7 i# J2 C- Z- d' d* R$ k
  95.         - [$ k) w, ], F: |
  96.         DMA2D_Start();                                                                //开始传输
    8 z: ^  P8 X; j" q, H% [& \/ i* R
  97. }2 h7 a5 E, K$ v2 P, |- C3 Y$ g6 I
  98. . a% b4 a& B9 @8 Z. v

  99. 7 J/ ^! c$ R7 |( ]' ?
  100. /*************************************************************************************************************************
    " |1 n, N& @( }% s! G" a
  101. * 函数                        :        void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, 7 o0 S- _+ g4 R5 v- _' e8 H9 l) r  M
  102.                                                 DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)% `" B. a; Z: N2 k
  103. * 功能                        :        DMA2D进行矩形图形填充(会执行像素格式转换)7 b# L! V  z$ d5 P+ T5 O6 T( Y
  104. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);$ x$ Q# P/ h, f- K  X+ z8 N* P7 E
  105.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    9 ~" l( h# X1 n6 d- {4 k6 O
  106.                                         SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式# L/ f' I2 X4 t7 M- [/ w7 G$ f8 p
  107.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    1 E+ I( X3 m. L+ n; i5 A! E
  108. * 返回                        :        是否设置成功
    & c8 `( K8 l; v/ _8 Y9 g
  109. * 依赖                        :        底层宏定义  |8 L/ q" h. _& h5 R$ s4 ?( [5 f
  110. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>6 n& Y/ `* p5 p3 G6 z% j/ r
  111. * 时间                        :        2019-10-28+ W% y# {7 `8 N* M. _6 m
  112. * 最后修改时间         :         2019-10-28' {+ a1 @% ~8 Y7 }) t$ y2 l
  113. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    : ]  ?* n, v+ x
  114. *************************************************************************************************************************/  C# o- w9 i. g7 l& T4 T; T$ D
  115. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    ! o9 e8 G; V' s/ \
  116.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)& x6 [# e7 R5 W) n# O& S% }% S
  117. {6 d: S' d, m& k, a$ \8 r. d  ]6 a% _1 H
  118.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟! `; `8 \% j0 c, E! y- y1 K
  119.         DMA2D->CR = 0;                                                                //先停止DMA2D
      E2 B3 B( M  e1 v$ P
  120.         DMA2D->CR = DMA2D_MODE_MEM_PFC<<16;                        //存储器到存储器模式-激活PFC
    . ?% X3 [, b/ c9 J0 m9 G
  121.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数, u5 d/ m: D7 B# i
  122.         DMA2D->OPFCCR = DestColorMode;                                //输出颜色格式( {8 x/ F! ~4 f& x5 z* r) |4 \$ z
  123.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
    % A5 P) F( {: i' u  K: B9 z1 J& K: e
  124.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移 " j* s7 u1 R- H* q) Z0 d) y
  125.         DMA2D->FGPFCCR =((u32)Alpha << 24) |  ((u32)AlphaMode << 16) | SourceColorMode;                        //源图像颜色格式
    + z- U/ S9 ^7 U" w7 m3 v
  126.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充' A- ?# O2 m4 g& l
  127.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
    9 ~  [. V! D- b+ F
  128.         % S, ~8 E% E* X! |, v8 a
  129.         DMA2D_Start();                                                                //开始传输
    " L8 {/ m) K, S" I3 t
  130. }
复制代码
  1. /*************************************************************************************************************& T0 J3 c9 c$ L# c0 @: X: l# M! b2 Z
  2. * 文件名                :        dma2d.H
    3 E0 ~* |' V% [  w0 G
  3. * 功能                        :        STM32F7 DMA2D驱动
    7 Y' }/ J; c# t* K$ j
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>2 a$ D0 J9 N) \/ ~
  5. * 创建时间                :        2019-10-29, B  f' k  A% O' X+ t/ T6 w1 K
  6. * 最后修改时间        :        2019-10-29
    4 e/ T& Y0 l, W5 L
  7. * 详细:                        ' e# u' C* ^5 w
  8. *************************************************************************************************************/        ) j  i* m  W6 v
  9. #ifndef __DMA2D_H_
    , j; ?) T/ ]4 m! P8 m& w. \
  10. #define        __DMA2D_H_           " l6 u& l* O& G6 E, |
  11. #include "system.h"
    $ o. ]2 P! Y; p9 n8 I
  12. 2 @) `' y0 X' H/ {

  13. 3 w9 z' Z% E0 V/ r( R4 A
  14. typedef enum
    & x8 {* T7 j1 i. U. E0 b4 A
  15. {
    0 H7 x( ?* }5 i9 e
  16.         DMA2D_MODE_MEM                =         0,                //存储器到存储器(仅限 FG前景色 获取)/ s/ {: Q  C5 I" L
  17.         DMA2D_MODE_MEM_PFC        =        1,                //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)
    $ N" M& _% ]; ], V7 t" x; `
  18.         DMA2D_MODE_MEM_MIXED=        2,                //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)* s4 _* _( w3 l# u3 F# x
  19.         DMA2D_MODE_REG                =        3,                //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)" Q( Y! O% t. l- g7 o, ~, r
  20. }DMA2D_MODE;2 r+ G4 m/ E8 C2 }

  21. " ~; D& i7 T! h  }; N6 G
  22. //颜色模式
    ' e+ m' X( n- B1 _# i3 o; ^
  23. typedef enum  H6 b! R, W0 c, x% u; ~5 V+ L
  24. {
    ! W; s( J% v9 w2 U( v  d
  25.         DMA2D_COLOR_ARGB8888         = 0,0 ^9 p  d, v' ^( \8 S8 M1 v
  26.         DMA2D_COLOR_RGB888                 = 1,
    ( g$ T2 z- O, u% k$ N
  27.         DMA2D_COLOR_RGB565                 = 2,
    % o/ K! ?" g' \: o
  28.         /*DMA2D_COLOR_ARGB1555         = 3," o7 C5 b0 w  z
  29.         DMA2D_COLOR_ARGB4444         = 4,
    # p! H' v" T: H  g- M; ]+ [# i
  30.         DMA2D_COLOR_L8                         = 5,        //8 位 Luminance9 a- M% U: q! H% M8 e  }' l0 p1 k
  31.         DMA2D_COLOR_AL44                 = 6,        //4 位 Alpha,4 位 Luminance
    . O; y/ Q6 F: P+ `
  32.         DMA2D_COLOR_AL88                 = 7,        //8 位 Alpha,8 位 Luminance7 i' x/ `/ N! S& [
  33.         DMA2D_COLOR_L4                         = 8,        //4 位 Luminance
    - u9 F  `" R0 S/ f
  34.         DMA2D_COLOR_A8                         = 9,        //8 位 Alpha
    . B; k3 @$ s, d# n  `6 @. v
  35.         DMA2D_COLOR_A4                         = 10,        //4 位 Alpha*/
    % X' r9 x) `2 M9 t
  36. }DMA2D_COLOR_MODE;
    0 c+ V8 r/ c2 C7 [

  37. 5 X  Q( P( d4 o5 z; B
  38. % g. n* I/ T' v0 n' [; X
  39. //Alpha 模式+ ~9 X* q& H* X
  40. typedef enum
    ( a0 a" O6 W  ~3 M) l
  41. {
    ) ?5 B" M( C# y! e% i0 e& c: R
  42.         DMA2D_ALPHA_NULL        =        0,//不修改前景层图像的 alpha 通道值$ b4 [4 ^% ~# B6 y) o
  43.         DMA2D_ALPHA_REPLACE        =        1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]
    $ ?0 t/ }9 E% x; q/ I
  44.         DMA2D_ALPHA_PRODUCT        =        2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积
    $ E% `* U6 k5 S9 k7 G9 D: U  K# G, t
  45. }DMA2D_ALPHA_MODE;. a* _7 t" B0 G0 z! ^

  46. 4 v2 F# E; Y, i: u

  47. ) s$ E! N; b' ?1 j
  48. __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;}                //终止传输
    " \5 [, Y% t3 G- ?- b$ b
  49. __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;}                //挂起传输% d8 J7 }! C7 @! h" D; u
  50. __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;}                //开始传输
    1 a0 D' ^* |3 f! @( \

  51. " C1 r3 q3 D7 I/ |, }
  52. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color);        //DMA2D进行单色填充7 o% X6 n3 v4 o* }
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs);                                                                                                                                                        //等待DMA2D传输完成  `3 ~7 |1 k- ~( F7 K. M
  54. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充
    ) {; e, F0 k! p  M8 o
  55. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    7 |% t2 J/ w) l$ X! y* D
  56.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)
    " m! J6 I2 L: j8 T- A
  57. #endif //__DMA2D_H_
复制代码
  1. /*************************************************************************************************************! S4 \( }  L) W5 O
  2. * 文件名                :        DMA2D_GRAM.c( N% n* q. ?+ F! m; s: U
  3. * 功能                        :        GRAM相关操作: l+ C7 B* g% t& |
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    5 d3 B# d1 K! m" p7 Z( c* F
  5. * 创建时间                :        2019-10-30
    4 F  j! y6 q/ o8 x% X; y6 ]: p6 M, `5 e# x
  6. * 最后修改时间        :        2019-10-30
    3 f) ~- d! |) |8 [+ v+ U
  7. * 详细:                        显存相关操作接口* ~$ p; z9 h. m
  8. *************************************************************************************************************/        $ U% z4 v7 {9 r8 k1 O, |0 Y
  9. #include "dma2d.h"& M8 F  p9 B! ~9 S8 C% y; X
  10. #include "DMA2D_GRAM.h". P& H! b3 ?3 e4 h+ ^+ ]
  11. #include "SYSTEM.H" * o0 w/ x9 K% a  d

  12. ! ]$ w/ k& v  L1 B, x6 C5 |; O, r
  13. //基本接口
    + W& j% i/ y. Q  q9 x
  14. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //32bit色彩GRAM显存画点5 p4 H* K7 [& O& D: z6 Y
  15. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //24bit色彩GRAM显存画点# [+ P9 O* V$ b2 Q9 x
  16. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //16bit色彩GRAM显存画点% t8 I: E, i& _( P) j$ X' s
  17. & p9 ]! X7 ]; I+ d4 o' T
  18. . l: k# D! W9 o
  19. //GRAM相关接口-16bit
    % |' N0 u( n8 x1 c0 K, g7 b
  20. const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit = 2 Q& C9 {9 a% I3 S2 H$ t% [
  21. {/ A3 F( r8 y* s. U; w+ a
  22.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit,                        //GRAM显存画点(RGB565格式)
    % X6 Z/ H& h' [" c* a
  23.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充. N8 N, }6 A/ V$ Z0 \/ ^0 ~$ |
  24.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)# i4 s' H! l3 [8 N  B& P9 U# Y
  25. };
    7 Y# g7 U$ Q' }5 Z. p# |! b
  26. 6 m) H  l- l8 }9 ?0 N
  27. //GRAM相关接口-24bit1 R2 f. }/ ~5 p: X
  28. const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit = ) x5 j4 p, I/ n6 F" N$ `
  29. {# d/ ^& L* |2 P+ |" S9 }
  30.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit,                        //GRAM显存画点(RGB888格式)
    9 H8 v0 I9 d) s+ Y; K+ z1 M
  31.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充! I6 ~) W- q; R: R- C* W
  32.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)" V$ G. l& h& m  x& f
  33. };2 m1 H* m; M* j0 i! N4 L

  34. , m% [$ C9 V/ c. g) F* W
  35. //GRAM相关接口-32bit; d+ \% @* I2 S" m0 W5 J1 Y, C5 J
  36. const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit = ' r* Z: s& \6 Y% C6 k& v) x# q: p
  37. {( d! @! ?" V% a: M# f
  38.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit,                        //GRAM显存画点(ARGB8888格式)
    ; K$ d+ k8 c4 p* \9 U6 ?
  39.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    8 \6 l. s( P5 j8 ?9 Y
  40.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    # R' m+ `( ]) N3 }9 l6 @( V' c
  41. };: b- O4 I5 S! w/ M( x  V+ d

  42. * p* I$ Y/ t7 R. K$ H/ N7 P( k
  43. /*************************************************************************************************************************- N+ M1 ?! N' F/ `* L
  44. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
      S# w4 T1 U. s8 |- [& n
  45. * 功能                        :        GRAM句柄初始化(不会申请内存)
    . B2 g- P; ?9 ]3 V
  46. * 参数                        :        pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式
    : v  U7 x$ j, ~" g3 \! V
  47. * 返回                        :        无
    9 e* M" s4 j! c& F& ^
  48. * 依赖                        :        底层宏定义  i1 }5 J; l1 g% b! M1 H
  49. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    # Y( J0 d  i  q2 V
  50. * 时间                        :        2019-10-30" F% Z# y# L6 U) Z
  51. * 最后修改时间         :         2019-10-30$ @- Y+ [! m( i  V- m3 R2 |
  52. * 说明                        :        初始化显存" p# x# P" g7 C, @( I
  53. *************************************************************************************************************************/
    ! m5 g& |* g( \1 |/ T
  54. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    9 I. d" z$ b7 ]  _  v) Z: L5 N  V
  55. {
    ) P% e6 }+ g' K6 z
  56.         while(pHandle == NULL)
    ) f7 p9 b) l: g" J2 G; }# C
  57.         {
    0 |# h5 e" T0 G% O* Y3 Y
  58.                 DEBUG("无效的句柄pHandle\r\n");9 f) @2 q" C: x/ i0 [
  59.                 SYS_DelayMS(500);4 _5 C, r, M% m" w, s$ I% U& |
  60.         }
    5 q$ t0 a7 X# y! R( m  L: \
  61.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
    ) [  \% a* `, f
  62.         pHandle->Width = Width;                                                        //GRAM宽度# F1 l* {0 x3 K
  63.         pHandle->Height = Height;                                                //GRAM高度( i% I- j% K/ ], `  G
  64.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
    2 D# z% C& u: y# l: W
  65.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针
    ) ]. a: n2 e: n# d
  66.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针
    ' K2 a" w; {9 o) s& }' h
  67.         //像素模式
    / I7 {4 F. Y( s8 H6 B# K
  68.         switch(ColorMode)
    0 r6 ]" U/ I; V8 L6 ], Z+ [3 |
  69.         {5 D1 P6 d9 F/ \, |. H7 ]0 ^' t
  70.                 case DMA2D_COLOR_ARGB8888 :
    ! ~) C; z8 s$ z
  71.                 {
    " W: S6 p- F5 K' E+ H
  72.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
    ' \( n! ?% i; L& \& M# j' ~9 u; h/ g5 z3 C
  73.                 }break;% R  L; T7 |1 W# \1 V- [  p
  74.                 case DMA2D_COLOR_RGB888 :# \# o- N" Y5 Y
  75.                 {* h8 G) N: [2 }8 X
  76.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
    : r9 V1 `5 s$ A" [
  77.                 }break;$ G# [: J6 W4 j0 f( x
  78.                 default: //DMA2D_COLOR_RGB565
    % h9 \( W& K; R: y' v% d) X
  79.                 {
    / E+ Q1 A7 }) I- r
  80.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
    & q4 H9 L' M9 K
  81.                         ColorMode = DMA2D_COLOR_RGB565;
    : N& o, b( z1 c( d( P
  82.                 }break;
    / o2 g4 H) ]8 h. `8 z0 r
  83.         }1 q9 H% ]' G2 Q' h6 W: i% z
  84.         / T& g. B* Z4 v7 ~& a& P' C
  85.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式% f! \  E/ M4 s3 F! Q. k# F6 F1 P; v
  86.         pHandle->InitStatusId = DMA_INIT_OK;                        //初始化成功" o9 K( N3 j) ~0 O9 I0 k
  87. }- Q' C, m8 j3 t* O) p) _& n8 k

  88. % L4 y/ ^5 m6 x$ D
  89. /*************************************************************************************************************************; n, t  M- |8 k$ M8 a- B
  90. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)8 y' H# w% Z% n  n0 I
  91. * 功能                        :        创建一个GRAM(会申请内存)
    . j- a3 J/ R) f/ t
  92. * 参数                        :        Width:显存宽度;Height:显存高度;ColorMode:颜色模式7 ^# O& J0 E# z# `, e
  93. * 返回                        :        NULL:失败;其他:GRAM句柄
    * Z# v  Q8 i7 ]4 z# w+ o7 A
  94. * 依赖                        :        底层宏定义
    8 P  K5 E$ V( [  c6 s
  95. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>3 D* o0 R% ]$ S# }, |, J  n
  96. * 时间                        :        2020-02-02
      p( I% {  `  p% Z
  97. * 最后修改时间         :         2020-02-02$ B9 M+ |7 n. Z  O2 Z9 n; P, r
  98. * 说明                        :        初始化显存3 v! V6 U% D+ J' [: e
  99. *************************************************************************************************************************/3 D9 |9 g/ _; z/ B
  100. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    - e0 j, V/ S4 i6 o% n
  101. {
    2 S& W/ P- a6 x
  102.         GRAM_HANDLE *pHandle = NULL;5 D  v+ {0 u& S. M$ N" P( R1 k
  103.         u32 GRAM_Addr;& s6 p( P# m9 g1 z5 X5 K
  104.         ; \1 T0 A4 T2 \' m; [; D
  105.         pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE));        //为句柄申请内存
    ) U$ |& T/ w0 w% n) P
  106.         while(pHandle == NULL)% a9 w2 k# P9 _* K2 N/ q1 n* l
  107.         {
    6 `/ n& h* C; _8 m& l& \
  108.                 DEBUG("无效的句柄pHandle\r\n");' M  @8 ]& \0 ?+ H; b
  109.                 SYS_DelayMS(500);0 {7 B# d& G- C0 P% e- {% k
  110.         }
    $ i7 X& y$ B* u5 x
  111.         0 M5 o, ]+ _' J
  112.         switch(ColorMode)
    4 N" e3 F7 Y5 K, {
  113.         {
    / I( ~& X) m+ l8 Z! J; m) J& \
  114.                 case DMA2D_COLOR_ARGB8888 :
    % _& t- y& l' t+ }/ C: k/ s) M
  115.                 {
    & t: K% z: Y/ M
  116.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存7 F2 l" q- z9 b* T$ S; L
  117.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
    1 C, U& T: }  C5 [
  118.                 }break;
    % v% r" x: a6 B
  119.                 case DMA2D_COLOR_RGB888 :9 G1 M, H/ ?" i3 m3 @. r6 n  a
  120.                 {# ?. Z# n0 A) U
  121.                         GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height);                        //为显存分配内存5 M; o0 ?6 E6 S2 [0 v' C
  122.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
    6 H9 m- J$ L. x
  123.                 }break;
    ' s) y8 i) k. _: b5 c
  124.                 default: //DMA2D_COLOR_RGB565  X& |; l; @) b$ I5 m- g% o
  125.                 {
    0 `9 @: ~, r2 F, a
  126.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height);        //为显存分配内存, S9 c& q7 l9 L# M. Q+ G
  127.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;1 \; }  [# w% Y2 G
  128.                         ColorMode = DMA2D_COLOR_RGB565;
    8 ]+ q- [/ _. T8 S
  129.                 }break;
    / x2 H9 V% F1 H  H# `
  130.         }) X& S8 p+ g. o1 n
  131.         
    9 f: E" q: }" S3 F
  132.         while(GRAM_Addr == NULL)2 m' P4 g. n  D9 Z9 ?) c" B! i% ?9 Y! l
  133.         {& V2 e+ Q3 [/ A5 A: \& L# N
  134.                 DEBUG("显存申请内存失败\r\n");
    ) Y' p/ X! {" W9 p
  135.                 SYS_DelayMS(500);
    4 |( {" ]. p& S4 Z6 l2 S
  136.         }
    4 k# O' W& c/ {8 y( f
  137.         . w: n4 l; g; [$ ^8 ]0 r9 L* r
  138.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
    & {% e, D; h' `( _3 h+ M
  139.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式# Y' m+ {- G% i4 y
  140.         pHandle->Width = Width;                                                        //GRAM宽度
    7 @6 F( _2 {( N9 i1 m' ?% F
  141.         pHandle->Height = Height;                                                //GRAM高度9 g+ h1 L6 R; ~
  142.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
    4 C$ B; V" o5 w- G: R1 y
  143.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针- i2 b  Q; v. a) ^6 V- B" N5 u
  144.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针# r3 N& P- t" @* G( w
  145.         pHandle->InitStatusId = DMA_CREATE_OK;                        //创建成功, H1 S9 m& C2 h2 x7 [: @! \, t
  146.         
    4 h3 k. N) V1 L$ b( A' F
  147.         return pHandle;
    + Z& s$ D: m; A0 x
  148. }
    5 I0 L5 d0 T. ~: _
  149. + `& y) S5 h0 o  G
  150. ! v6 J" V/ O$ S9 \+ |
  151. 5 X! j2 _! v: T- ?  Z, o4 w
  152. /*************************************************************************************************************************
    # Q$ t3 D7 c" `) Y' a
  153. * 函数                        :        void GRAM_Delete(GRAM_HANDLE *pHandle)
    & f/ |# c( U" k
  154. * 功能                        :        删除一个GRAM(会释放内存)& Q# e2 f8 R# V: k5 N
  155. * 参数                        :        pHandle:GRAM句柄8 G2 c, m8 u% H6 \% _
  156. * 返回                        :        无) J6 G5 _% V1 @& Q/ m( b$ j
  157. * 依赖                        :        底层宏定义
    , }5 }, A/ @6 l5 O5 F
  158. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    + G8 y! r+ M  I5 ~% l+ o
  159. * 时间                        :        2019-12-16
    , t9 c) R; W$ a7 S2 o$ T$ z  E
  160. * 最后修改时间         :         2019-12-16# q. F' L: r0 D% \( d1 C( a
  161. * 说明                        :        用于删除显存,释放内存& e" t6 p% q: G
  162. *************************************************************************************************************************/
    - c0 m- p! c) Y# H) K9 m' z% ]
  163. void GRAM_Delete(GRAM_HANDLE *pHandle)4 X5 ]* v- [- L/ Q2 w2 O
  164. {+ t6 x7 E2 s5 j! I
  165.         if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)
    * j; g" J0 ~; z. }, E
  166.         {" A; |/ U  Q8 h4 u3 Q
  167.                 if(pHandle->GRAM_Addr != NULL)4 ~# M- O/ T& q" K
  168.                 {8 x. g, T8 T8 S/ C- {2 f$ k
  169.                         GRAM_free((u8 *)pHandle->GRAM_Addr);                //释放显存内存
    & c, G4 i5 C5 G5 w0 K6 D
  170.                         pHandle->GRAM_Addr = NULL;
    3 u4 I, `) s& L! g4 H4 R
  171.                 }. @6 |* I7 q: Y9 {! t
  172.                 pHandle->InitStatusId = 0;
    5 d& s! j+ u7 |1 h, ^4 ?' L* D+ u5 e. }
  173.                 GRAM_free(pHandle);                                                                //释放句柄内存0 i& m8 Z$ x8 `
  174.                 pHandle = NULL;/ T( V2 w4 ^: `$ C, b1 V
  175.         }
    * B" L: m% [/ z: E/ J( B
  176. }9 u% e3 a* L8 I0 N8 i
  177. , x' t' i6 Y% i4 J- l1 X4 n
  178. : `" A7 u7 ^7 M3 I# c/ w( w
  179. /*************************************************************************************************************************
    % l( Z( M" z& T
  180. * 函数                        :        void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
      G: d" p! c& D* y
  181. * 功能                        :        32bit色彩GRAM显存画点& V" P$ [, l/ G+ m- o: \
  182. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    & l, l8 b  N. Q
  183. * 返回                        :        无
    2 H; `; s( b. v) @
  184. * 依赖                        :        底层宏定义
    0 R' p5 v# F7 _1 Q! [
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>; Q% \3 x1 I# b/ g
  186. * 时间                        :        2019-10-30; U2 I5 h" z: r$ w& l1 y! [
  187. * 最后修改时间         :         2019-10-30
    * w7 J" R, |: X% x  k
  188. * 说明                        :        在显存中绘制点5 t0 t$ c! n) c2 k7 R, s* C
  189. *************************************************************************************************************************/
    ! i+ }5 Z% w9 s  S* J, O
  190. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    ; ~- r6 u# W0 y
  191. {
    " _* ^1 ?7 [' K/ N. y
  192.         pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;& Z5 i8 U" G8 `- P% Z: {
  193. }6 D" ~; z2 m. g) v  Z% S

  194. ) f* n" K- Z3 _; M, \

  195. & W. g$ U8 G* |" @. J5 D& M; @" M
  196. /*************************************************************************************************************************
    8 y7 s2 K% r& H7 ~" d
  197. * 函数                        :        void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    % i( X, i) C5 M. X; E/ b
  198. * 功能                        :        24bit色彩GRAM显存画点
    8 N- g* o9 _; Z$ G8 k6 P) ^6 `
  199. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    7 p& H/ J, n4 Y4 p
  200. * 返回                        :        无# u7 l" Z$ h* p! r# w4 b! e
  201. * 依赖                        :        底层宏定义/ ~7 `0 f. {9 D5 ?
  202. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    3 Z# b2 b: ~$ M! v" {) _
  203. * 时间                        :        2019-10-304 v$ D8 o+ _: S+ v, y& @
  204. * 最后修改时间         :         2019-10-303 _" Z' @  E' C
  205. * 说明                        :        在显存中绘制点
    + D$ }5 r5 w+ @% G1 @  m9 M
  206. *************************************************************************************************************************/
    0 _  |% ]& q5 {# E# e5 z8 |+ V
  207. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    9 O0 N* z* b- O1 [1 B0 |
  208. {4 G, X+ i! z. I
  209.         memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);
    6 k' z) U8 i0 {9 ~+ s
  210. }, E' j5 B+ j- l8 Z

  211. 5 u4 u. |2 P+ `" Y

  212. ) o6 s: X$ j1 C: j- H& i1 T
  213. /*************************************************************************************************************************
    , v9 Z; M& i' V% n
  214. * 函数                        :        void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    % b2 Y) A) h) z0 l& t' k/ U) z, u
  215. * 功能                        :        16bit色彩GRAM显存画点8 k0 ^  g  x) B4 \0 }
  216. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色$ A/ H  D7 C! e- _8 m0 I# Q
  217. * 返回                        :        无: |2 O" }( X6 S( l1 q
  218. * 依赖                        :        底层宏定义! J2 K, N1 ?5 `( S% h- c5 _0 s
  219. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>4 R& _$ j9 L" j5 L) O7 E5 i* ~4 @
  220. * 时间                        :        2019-10-30
    1 S: ], ~! T2 N5 e, C8 Z4 a! w
  221. * 最后修改时间         :         2019-10-30
    , h4 i0 o& f9 Y+ }9 P
  222. * 说明                        :        在显存中绘制点
    - l# `5 n" r6 h" U7 I) [
  223. *************************************************************************************************************************/
    . f$ ^& L0 v) C! `" v
  224. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    ! P" v) i4 C3 X8 g! G7 z4 D5 d
  225. {- P) Z. G* z8 Q2 n% R
  226.         pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;! ]9 g" w6 Q: M
  227. }+ M" j' L) @4 q; `0 f/ L

  228. 0 ~: o5 a4 j- X2 ~! n
  229. : E: u1 A% v3 m; F) t" _' x, c

  230. / m7 P6 m3 C8 c3 _, H( I$ S7 Z9 F
  231. /*************************************************************************************************************************  E: S: _& y7 [) u1 O: J2 G
  232. * 函数                        :        void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)        5 A. m# u. E% v9 |
  233. * 功能                        :        GRAM矩形填充(使用DMA2D)% d# ?' z* o: w$ m- c/ T. g
  234. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色
    6 F2 X2 Z0 U: t. h3 B" x
  235. * 返回                        :        无7 U8 k+ _  ?) `" }' ?6 }) c8 a
  236. * 依赖                        :        底层宏定义
    % a' B  o2 F# r# M
  237. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ; I4 z1 [/ y+ c" l
  238. * 时间                        :        2019-10-30% E' @" O5 c% [3 f; j0 R# [
  239. * 最后修改时间         :         2019-10-30
    5 ]% K3 Y* ^! @- s  Z+ J% O. H
  240. * 说明                        :        采用DMA2D实现: l+ ~' B- Z# `6 s
  241. *************************************************************************************************************************/* V) [4 T/ c; ]$ `! S5 z
  242. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)5 |' C4 F  ?& O$ H- d9 |" h$ t
  243. {
    0 s) D: {, b$ Z+ _4 V$ T- m% S
  244.         switch(pHandle->ColorMode)
    6 d) B; l; X& k. p8 y, C
  245.         {
    4 b# g/ q  s5 S0 }
  246.                 case DMA2D_COLOR_ARGB8888 :5 y2 ?: I, ]: F9 C. g2 N* V
  247.                 {, N) I: c: ]$ {. B
  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进行单色填充
    . j6 M& w4 }* N$ \; x+ }# N
  249.                 }break;
    ) d: {. |* b  _0 x8 |. k- ]
  250.                 case DMA2D_COLOR_RGB888 :
    8 j: x8 V$ r$ x
  251.                 {' Z/ y% b0 V0 q0 a- G$ g! V' S2 g
  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进行单色填充* s6 F- X8 x( a- T# p
  253.                 }break;. ~5 y$ d: q2 E" {* D8 n
  254.                 case DMA2D_COLOR_RGB565 :7 C" K7 b# n$ T5 F
  255.                 {
    . o* Z0 _% ?1 K4 q1 s/ Z6 q* N
  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进行单色填充
    4 j/ ^2 ]' r3 I  t' F" b
  257.                 }break;/ }0 {& }& l9 W2 K; `
  258.                 default:return;  @* S5 I* p) n- S
  259.         }4 s3 L/ m' C: c$ d1 a* ~' C
  260.         
    : u( w( `) I8 p: [0 X: q$ X
  261.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                                                                //等待DMA2D传输完成$ ]% \8 u3 l1 U8 W  l2 s8 G
  262. }
    + |9 o2 M' c6 P- B8 t. H1 }

  263. & C! ]; G9 }7 z+ F3 L
  264. 1 ~5 o3 X. f! L3 z% d8 h3 U  G/ {
  265. /*************************************************************************************************************************
    ' p/ j4 \8 ]0 O$ n/ T
  266. * 函数                        :        void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)+ O9 z! V+ }+ `& }" d2 q: z
  267. * 功能                        :        GRAM清屏(使用DMA2D)
    $ b. l  P% Z+ F
  268. * 参数                        :        pHandle:GRAM句柄;color:需要填充的颜色
    : Q( }  Z, k5 O3 T( l" |
  269. * 返回                        :        无. V3 T" J& S: J
  270. * 依赖                        :        底层宏定义
      K" r% g+ r3 L7 J
  271. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    # Q6 e2 p6 W$ B4 V# B
  272. * 时间                        :        2019-10-30# s0 f" H, E2 T$ d6 o
  273. * 最后修改时间         :         2019-10-308 S3 d5 y$ Z* C
  274. * 说明                        :        采用DMA2D实现0 ?0 [$ \9 U6 r" V9 y8 L
  275. *************************************************************************************************************************/4 B8 {; K/ k8 s) ]0 J7 K' i, x. K
  276. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
    % m! P1 p4 x2 m+ G4 ~5 n7 @, X
  277. {
    - J/ `5 [$ t# Y5 T  |9 W
  278.         switch(pHandle->ColorMode). r% L' W  }5 [9 J1 \6 m
  279.         {. ?, I2 W' {6 i5 [
  280.                 case DMA2D_COLOR_ARGB8888 :
    # j$ M; q, ^" L' q: x) H
  281.                 {& [4 m% ^! R5 t+ ^# X. e3 e1 g' {
  282.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color);        //DMA2D进行单色填充
    6 g4 ~4 ]' h/ O: k
  283.                 }break;% Z! ^  U" H& ]& D9 I1 `2 A
  284.                 case DMA2D_COLOR_RGB888 :
    1 i& R2 W7 ~; P$ k
  285.                 {
    ( p0 N. j% Q) U$ h; g# B$ A/ ~4 |
  286.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color);                //DMA2D进行单色填充
    ' S; l/ l! `8 T2 h
  287.                 }break;8 A: d4 V+ a7 U3 g0 o
  288.                 case DMA2D_COLOR_RGB565 :* @1 R0 o- A0 v7 o8 R
  289.                 {! h7 F( m' e3 [# F$ R
  290.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充4 b: }2 t; Q8 g  K1 f
  291.                 }break;1 f$ P; Q3 I6 e0 B3 z
  292.                 default:return;9 j, H. M; v8 l. w) ?
  293.         }3 K$ }# e1 ^( Y' W" k: a
  294.         SYS_DelayMS(5);2 S' |$ _" T4 n' B, A' N, R" U
  295.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                //等待DMA2D传输完成
    " n3 f4 h7 ]4 F4 e* i7 D# V
  296. }
    $ a7 d# [9 b3 H9 G" g
  297. & v5 V1 }9 w# I- \
  298. + y& ^0 `9 D$ p. K/ \' g
  299. /*************************************************************************************************************************" C" |. A  n0 Z4 s  u
  300. * 函数                        :        void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
    % {; g- `3 m! }# |) f3 i4 h
  301.                                                 u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)- }: m, \+ ?1 `4 k. o
  302. * 功能                        :        GRAM局部拷贝(支持Alpha)3 d7 G' o7 |8 q0 B/ R: D6 p1 c
  303. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;$ H0 s! A" }; j$ x5 I, N
  304.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度
    2 r: A9 u( k+ M1 i3 r/ D" U& G
  305.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    " H3 o, M0 X4 p9 W
  306. * 返回                        :        无6 S6 E$ ~0 y/ q0 |( F7 q: e
  307. * 依赖                        :        底层宏定义
    & k' s8 w) n  j) `9 l3 W% W+ t
  308. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    1 ^% X4 L+ l1 J( u$ n( I
  309. * 时间                        :        2020-02-02
    ( y# B3 P7 Y6 Y4 S4 z4 m/ i
  310. * 最后修改时间         :         2020-02-02( `) c4 D& ?+ u4 _, R5 P3 m
  311. * 说明                        :        不会检查GRAM大小,请确保GRAM
    : w* }# Q5 d& d5 U  Q
  312. *************************************************************************************************************************/9 C1 Z# k) U3 z9 h2 m
  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)
    & q2 d/ o1 s9 d& ]
  314. {
    / S; T) F5 j* a7 H
  315.         u32 SourceImageAddr;        //源图像地址(通过地址控制开始的X,Y坐标)
    % l7 ?1 T! p$ t1 E9 u
  316.         u32 DestGRAMAddr;                //目标GRAM地址(通过地址控制开始的X,Y坐标);* z& v) W( c, M7 d0 J0 [: O0 y
  317.         u32 PixelByteSize;                //像素字节大小
    4 }( ^% c# K  X  \( T+ v0 C
  318.         
    " u, j& T  n) u) y' [, X# S1 }+ J
  319.         if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL)# W, N9 Y9 K5 g. A9 x" D
  320.         {
    5 t- q& n3 g# }
  321.                 DEBUG("无效的句柄,pDestHandle\r\n");
    8 y- T# X% Q' ~8 n1 h7 N( N" J
  322.                 return;  T6 ~4 I4 F! s
  323.         }
    : U- l0 J, M' w6 i! y+ {4 |& ~
  324.         if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL)
    6 I4 A0 y/ s% }( w; R& d
  325.         {* T7 ^( y/ O, ^3 T, Q+ \) j+ T
  326.                 DEBUG("无效的句柄,pSourceHandle\r\n");
    7 Q) E, f* a# V  J2 W/ S8 z
  327.                 return;  k; u/ [* R& G/ j8 O3 I3 C
  328.         }$ [- \! ]; `  n, p8 R$ G' o
  329.         //源图像地址(通过地址控制开始的X,Y坐标) 计算- H7 u* W$ C' q
  330.         switch(pSourceHandle->ColorMode)6 p: x# N: k. ~3 C
  331.         {8 [8 A3 V" q* n
  332.                 case DMA2D_COLOR_ARGB8888 :
    % z) G' ]. l5 K0 G# u
  333.                 {
    ) L" v; Q  N9 G; |6 C/ M' Y0 y/ I5 X9 D
  334.                         PixelByteSize = 4;& @& _! ~. f1 k
  335.                 }break;
    8 N5 V  t7 p  e( ~. L3 ?
  336.                 case DMA2D_COLOR_RGB888 :
    6 C5 y4 ~7 f* D
  337.                 {
      t  t* E: ~) f! I8 E/ M
  338.                         PixelByteSize = 3;
    5 m! w% `# o- ~( y9 J
  339.                 }break;
    * _( H$ m- g. [3 R
  340.                 default: //DMA2D_COLOR_RGB565: l. u4 U. y: I7 M/ |
  341.                 {) N4 _5 A4 k' g1 \% z8 j9 p
  342.                         PixelByteSize = 2;
    $ w' y6 _4 Z7 U! }0 ^+ Q
  343.                 }break;& g- \$ w, X. S& r/ Z
  344.         }
    , ^5 [5 j0 h/ r, I3 C  N+ s
  345.         SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize;        //计算源开始地址
    # a3 m( Q$ H" V; v: z
  346.         
    ( S6 O: }) o' M' K4 j  b$ [" Q
  347.         //目标图像地址(通过地址控制开始的X,Y坐标) 计算$ D" J. F5 x2 V9 ~+ K. C- I. N
  348.         switch(pDestHandle->ColorMode)
    . {) h/ t4 Z9 C  Y! I6 O
  349.         {) G& u# z. Q0 b) c0 K* T& D
  350.                 case DMA2D_COLOR_ARGB8888 :( V- n& r- ~" g% O1 Z* e
  351.                 {
    6 B5 i" O, O6 E8 X- e6 G
  352.                         PixelByteSize = 4;/ T- X. [4 G1 u. T# ^8 Z: w5 R
  353.                 }break;
    : E/ Q0 `- S7 A$ X/ V, q
  354.                 case DMA2D_COLOR_RGB888 :1 {6 T4 ^" t7 ?: _$ b% ^2 F
  355.                 {: J9 d7 S) Z6 v  f5 @& f* ~3 w
  356.                         PixelByteSize = 3;1 e1 N+ X  l2 D6 p; [1 M
  357.                 }break;. `  E8 p, s7 s) a3 N( I& R
  358.                 default: //DMA2D_COLOR_RGB565$ \0 |4 P, _; [+ e/ ]# f
  359.                 {
    . D) P1 W, T, a( L8 S* Y  ?
  360.                         PixelByteSize = 2;; \# x! m# l- F  V& g2 V
  361.                 }break;
    - G2 s8 H. ]4 ^- I- f. d
  362.         }
    4 o4 |3 o/ X4 w
  363.         DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize;        //计算目标开始地址
    $ P4 T  R# S- J8 _& _7 m7 G  S
  364.         //进行拷贝  p  `& k( d! h8 [1 H; c
  365.         DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode,
    % p, N: t  q8 \; [7 z# \! l
  366.                 pDestHandle->ColorMode, AlphaMode, Alpha);                                                                                                        //DMA2D进行矩形图形填充(会执行像素格式转换)0 H' D  p, O0 t* N
  367.         DMA2D_WaitTransferComplete(200);                                                                                                                                //等待DMA2D传输完成
    : M( y# Z3 n  G$ \- M( f( U
  368. }
    8 `4 Z: M3 ~! c& W9 ~2 g
  369. 5 U. p. c2 n- C. N& Z# }5 q+ v9 @2 `
  370. /*************************************************************************************************************************
    % e! ]. ?- W5 p3 U2 {: X
  371. * 函数                        :        void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
      x2 W: C8 R6 ^3 J% t( w% J  Q+ d" A
  372.                                                 u16 Height)6 k4 J" N, F/ ~! d- L
  373. * 功能                        :        GRAM局部拷贝(不支持Alpha). ~* _( G- k$ i. Y. t7 x
  374. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
      R* L1 }' j3 W. A0 r$ \- j9 K" y) A
  375.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度* }" W; t- K! ^3 S# @
  376. * 返回                        :        无2 k) ?' e: {1 x+ n3 c9 J
  377. * 依赖                        :        底层宏定义8 f4 C# X4 L! V3 e5 q3 l! x/ ]
  378. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    1 B9 x& m5 [% ]* h8 H, B' W
  379. * 时间                        :        2020-02-02
    ( _  e4 y" z. [' D9 |1 m
  380. * 最后修改时间         :         2020-02-02
    ! s1 z6 [! ?" B9 w& C
  381. * 说明                        :        不会检查GRAM大小,请确保GRAM
    ! [9 y; @$ T: V0 M* k! U' Z( Q
  382. *************************************************************************************************************************/
    7 u' U# Y$ b  A
  383. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)8 f# Q8 h5 j7 ]) c
  384. {% K- V- e+ |* S
  385.         GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);
    . H6 M# ]% n0 _9 E# i& @1 j" x+ o
  386. }
复制代码

& }( ]8 z8 o3 f& \( l; g5 h
- [* O  h2 O& H( w; j. u
  1. /*************************************************************************************************************
    ' }3 k  P0 V; O2 w; A4 ~
  2. * 文件名                :        DMA2D_GRAM.h
    : o* W% ?/ R! o( t! H8 b5 @; _
  3. * 功能                        :        GRAM相关操作- \: K8 |( K6 v2 A) i+ H# i+ _
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>, g4 o4 ^; i0 O6 I  p3 c, s3 Q0 z( a
  5. * 创建时间                :        2019-10-30- n5 m& x. ?0 I( u! C+ w
  6. * 最后修改时间        :        2019-10-30
    - M( k/ C$ T* M* o
  7. * 详细:                        显存相关操作接口
    3 l0 }7 r+ H9 E5 Z+ ~9 o5 F" O. n  I6 y
  8. *************************************************************************************************************/        
    3 J2 A& Z+ _8 ^# C4 T
  9. #ifndef __DMA2D_GRAM_H_
    + O) m2 y7 v. w! K* ]. {$ F% [* T
  10. #define        __DMA2D_GRAM_H_           ( A( |4 J* Z: p& a9 l+ a
  11. #include "system.h"
    ; G8 O' Z( O! x  r9 U
  12. #include "DMA2D.h"
    : G0 u5 R* V/ U+ \' Y
  13. #include "SYSMalloc.h"+ u( ]# w" h+ ]
  14. ! ~+ [0 P0 p% A! R( a4 b2 H
  15. //初始化状态id
      \7 D2 d4 R. K! c$ e2 R8 j/ \
  16. #define DMA_INIT_OK                0x1234423        //初始化成功(不可以释放)% `. Z7 N1 E  b0 b: F/ @' T
  17. #define DMA_CREATE_OK        0x3643423        //创建成功(可以释放)
    : m; T: l, e6 a9 H9 t  M4 U
  18. ( ~5 p3 K' v( M1 ]$ ~
  19. //颜色模式
      _% ]) j* B1 y2 l5 D" h6 o
  20. typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;
    4 E6 E, w, a3 q& i& r
  21. * }- Y+ r' {" G, B' C4 F1 ^
  22. ' q3 E* O$ s) `+ K% K$ l% p
  23. //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告)( K: m4 z( ?/ i& @+ C% y: ^
  24. typedef struct$ i7 ]- k/ E* K7 n. b! a) d
  25. {( U+ l" H( i/ m  P
  26.         void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //绘点函数" v7 ?# I; a0 E' r. n& F
  27.         void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                        //填充# k9 t1 I/ B# |$ ?$ _3 @+ [
  28.         void (*pClear)(void *pHandle, u32 color);                                                                                //清屏
    $ d& D. d. f8 W" x+ _* [% L7 c- s- h
  29. }GDI_BasicInterface;; s" Q* [* c/ c$ O6 g9 X% p- u

  30. # r0 e4 d  h5 f6 C% n* H

  31. 6 W, o! m1 M1 {! H( z
  32. //GRAM相关接口-16bit
    # @8 j6 V# F; F, q9 M& K
  33. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;4 u9 l9 u3 s8 u' J5 |$ p2 U5 d
  34. //GRAM相关接口-24bit
    $ S  l  C( x8 N. G! {6 d6 d
  35. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;% p: {$ Q( h3 W& ?( [, m" C
  36. //GRAM相关接口-32bit9 d. W2 _( N: W
  37. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;1 K5 @( b! t+ o8 \

  38. ' E' K# {, F* h. e, c
  39. //所需的内存申请接口$ \2 L8 Q  v$ h# l9 @
  40. __inline void *GRAM_malloc(u32 size)
    " P9 `$ `7 Q4 a6 U! n/ S
  41. {
    + W( z9 C; S( F- z. B; y
  42.         return mymalloc(SRAMEX, size);                        //内存分配(外部调用)-使用外部SRAM  F- W& a) N/ I+ k
  43. }7 e: ~7 J  Y- Q5 y
  44. # k1 @7 `0 D1 ?0 S
  45. //所需的内存释放接口5 F+ x/ V6 D* {: p
  46. __inline void GRAM_free(void *ptr)) p. q6 F& Y4 n1 H* C! [/ q( D2 b
  47. {  b) Z; L" r. M/ a- U
  48.         myfree(SRAMEX, ptr);                                        //使用外部SRAM
    : A' g, }) ?# w  b: s( p  B3 g
  49. }4 O0 ^% E- b) m3 p3 R

  50. 1 A( O9 s7 p  G  @
  51. : ]1 r7 E8 a9 Z- `
  52. //显存句柄
      A" u" Z2 ~, Y" k! S* N0 e4 n7 Z
  53. typedef struct
    8 D7 Q" e2 v9 V) y+ j$ W, ]
  54. {- X# ^" r) `) ?1 ]& ^+ M* ]
  55.         u32 InitStatusId;                                                                //初始化状态id
    + Z: J% Y; i$ a$ ^1 V  x3 `
  56.         u32 GRAM_Addr;                                                                        //GRAM地址. ^* Z7 h* a: y: r$ E; ~9 |5 _% H0 q
  57.         DMA2D_COLOR_MODE ColorMode;                                                //GRAM显存像素格式0 a. O4 Y  k' ]4 N1 }5 m1 F
  58.         u16 Width;                                                                                //GRAM宽度
    % i; X6 m# c9 _
  59.         u16 Height;                                                                                //GRAM高度
    , ?. n' S1 I7 h0 g2 W  d7 m
  60.         u32 *pGRAM_32bit;                                                                //32bit颜色模式下显存指针# [& D/ y8 t* r: L/ I& F
  61.         u8 *pGRAM_24bit;                                                                //24bit颜色模式下显存指针
    5 v+ ?# H0 M& K/ Z
  62.         u16 *pGRAM_16bit;                                                                //16bit颜色模式下显存指针
    ( ~) M0 g' X  J. q! K. s
  63.         const GDI_BasicInterface *pBasicInterface;                //底层GDI接口
    ) k* p1 S' _4 ^% ~7 ~4 f
  64. }GRAM_HANDLE;
    9 h/ B+ |3 z' E

  65. * }( g! P% m4 n
  66. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);        //GRAM句柄初始化(不会申请内存)$ c  c# j3 R) Q. n& ]) U/ Q, V2 H
  67. void GRAM_Delete(GRAM_HANDLE *pHandle);                                                                                                                                        //删除一个GRAM(会释放内存)) `6 t' L( j: t9 K2 T7 t4 {) f8 Y
  68. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                                                        //GRAM矩形填充(使用DMA2D)- G- a+ v' t; f- U+ t2 s" Y
  69. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color);                                                                                                                //GRAM清屏(使用DMA2D)" F) h% Z, p) L. _
  70. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);                                                        //创建一个GRAM(会申请内存)
    6 K' |3 r& S1 s4 Y+ G4 E# l, g0 i# Q& {
  71. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
      E, a3 c( A" m; ?* ?* J0 |
  72.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);                        //GRAM局部拷贝(支持Alpha)
    6 T7 o$ I  N9 N7 T$ x
  73. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, / y6 ]' A  t' {0 O
  74.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height);                                                                                                        //GRAM局部拷贝(不支持Alpha)
    # Z4 u  d& K% k' s/ M

  75. " w3 M' x, ~' c! {: H0 H1 Q
  76. #endif //__DMA2D_GRAM_H_
复制代码
  1. /*************************************************************************************************************
    2 k% j& ~/ y' S" O' ?4 J& `
  2. * 文件名                :        GDI.c
    ! c/ d( Y1 v- W; v8 w4 v" G
  3. * 功能                        :        图形设备接口(Graphics Device Interface), Y  W& I1 q$ @4 _$ l
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    3 b% R& |! r$ A# k/ a1 `9 r4 c
  5. * 创建时间                :        2019-11-027 p$ N8 R$ l  J8 z3 _: Z
  6. * 最后修改时间        :        2020-02-02
    / e7 O  m% s$ A7 U; o
  7. * 详细                        :        STM32F7 图形设备接口
    / J4 T$ ]/ k* Q
  8. *************************************************************************************************************/  y8 F! Y- e* x1 P- T; t' g
  9. #include "system.h"5 l# O  G7 z4 g& I
  10. #include "DMA2D.h"
    ( J4 ]  i& h2 v" F6 ~4 n3 t9 u
  11. #include "stm32f7_ltdc.h"
    $ i5 I  ~2 x1 f3 h9 Y" [( v) v  M1 L
  12. #include "DMA2D_GRAM.h"
    ) ^/ ~; U6 N  ^2 E
  13. #include "GDI.h"
    ! w0 {1 q& O, n4 F& E- w7 n! b- k
  14. 9 z# _$ X# ]2 C
  15. //显示器Layer1 GRAM定义
    9 n  C7 t% D  z
  16. const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle =
    # {; R6 J# K5 U- n( t& l% |2 @
  17. {
    . k0 G4 [7 f: V7 {: n
  18.         DMA_INIT_OK,
    " f" R/ S7 B/ D8 S! |% P6 R
  19.         (u32) &g_LTDC_BUFF_RGB888[0],        //GRAM地址
    , N! X3 z7 F/ E
  20.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式( O$ ?9 X/ n# o4 Y( U+ R" J2 }& Z  ]
  21.         LTDC_WIDTH,                                                //GRAM宽度
    9 r9 {4 {2 P: R+ c' M5 ?$ C
  22.         LTDC_HEIGHT,                                        //GRAM高度2 n* s1 Z4 Z1 U& t, e# m4 b+ |
  23.         (u32 *)&g_LTDC_BUFF_RGB888[0],        //32bit颜色模式下显存指针
    " O5 f) M( A' K$ {/ x6 z
  24.         (u8 *)&g_LTDC_BUFF_RGB888[0],        //24bit颜色模式下显存指针
    ! w0 h: b2 B; N
  25.         (u16 *)&g_LTDC_BUFF_RGB888[0],        //16bit颜色模式下显存指针
    ' d1 o  t! @" i1 g! a" Z8 H
  26.         &cg_GDI_GRAM_Interface_32bit,9 v- ?7 J- ?& T, P0 s  @
  27.         9 s* d/ z% ~9 ~
  28. };
    3 c* D9 o# H4 f8 @

  29. 5 ^; ~3 ?3 n% h0 F, o0 _
  30. //显示器Layer2 GRAM定义! L# v! j* D; N, v4 u
  31. const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle = . a- z0 K( c' ^; g2 F
  32. {% a/ a  C" X' S: z
  33.         DMA_INIT_OK,
    $ h( w% |2 H6 A) Z* o+ y/ ^
  34.         (u32) &g_LTDC_BUFF_RGB888[1],        //GRAM地址1 d; u$ T! N0 B" A9 u; s  v
  35.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式; f5 p, J/ q6 X
  36.         LTDC_WIDTH,                                                //GRAM宽度
    4 S/ Z4 x+ o- g: K! A: E9 ]
  37.         LTDC_HEIGHT,                                        //GRAM高度
    ) I( c8 l5 S; k. ], J! U) U2 L
  38.         (u32 *)&g_LTDC_BUFF_RGB888[1],        //32bit颜色模式下显存指针% n+ U, E! A0 b2 ~
  39.         (u8 *)&g_LTDC_BUFF_RGB888[1],        //24bit颜色模式下显存指针
    / Q( [1 `) O9 \
  40.         (u16 *)&g_LTDC_BUFF_RGB888[1],        //16bit颜色模式下显存指针6 h4 G' C/ ?7 T4 h+ ]  K6 M( s
  41.         &cg_GDI_GRAM_Interface_32bit,8 t+ T5 O+ ?: i$ x$ R2 D2 `
  42. };) Z) i: l( D; |

  43. % }5 u6 j. T6 V0 A( n8 {, M

  44. 4 S7 t9 l3 @2 C% |' P, V1 L8 w4 V
  45. /*************************************************************************************************************************2 k% M% |  T+ m
  46. * 函数                        :        void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)# K" F* R, q. Y, u. P
  47. * 功能                        :        绘制空心圆
    5 E, N' T# o+ V. g6 }
  48. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色
    , W$ d1 R' y  S: S! D: {
  49. * 返回                        :        无
    7 P; z) Z4 g+ A/ D
  50. * 依赖                        :        画点函数
    ! X8 `. ?( {$ p3 U
  51. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>; |% ^+ J# f8 {. B7 O
  52. * 时间                        :        2011-09-20# R5 _" v9 g0 Q  Q  p# P( [4 M
  53. * 最后修改时间         :         2019-11-02. z' U' ~/ j# U
  54. * 说明                        :         无
    . q; |8 H3 T; D* G/ A1 {# ^
  55. *************************************************************************************************************************/8 \/ R# e  m" t/ A  L
  56. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
    ( c, [3 F. F0 p( M
  57. {$ T7 I1 z: T5 T8 R, E
  58.         int a = 0,b = Radius;
    / q5 R: |+ w- [# h
  59.         int di;8 X+ D* i  W$ ?/ o. q
  60.         di = 3 -(Radius << 1);           //判断下个点位置的标志
    ) r( H, J% y+ ]0 E- U
  61. 0 v- J( @- Y! z1 I$ U# W: S0 M  q
  62. #if(GDI_PARAMETER_CHECK)                        //参数检查
    ; `6 f' v/ ]9 i# d0 p) \
  63.         while(pHandle==NULL)
    1 P+ l9 k$ ~7 L
  64.         {* [/ T& ~  |. g: a; [; w7 q
  65.                 DEBUG("无效的句柄 pHandle\r\n");
    ; o# G5 j6 j; C9 v- b. L
  66.                 SYS_DelayMS(1000);
    % \) ^3 N7 [- W. Q' ~2 d, E
  67.         }        ' z' O# w6 ]0 p$ f5 [. U
  68. #endif //GDI_PARAMETER_CHECK
    ( h/ V: l5 G5 U3 e( B
  69.         
    - D3 }- a7 q: c6 j* K/ M- ~
  70.         while(a <= b)
      S/ c1 u4 e9 W1 `( s
  71.         {
    . o4 T/ [* X7 C* \, @$ l
  72.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //3           1 F' Z$ z* K) k9 I4 a
  73.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color);             //0           
    ' j. k% J3 H; x
  74.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color);             //1       8 T3 j, V! p- y8 Q
  75.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //7           : e! A3 `' M: N( Z: q
  76.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color);             //2            
    + H; ^4 ]4 l1 p- ~0 e
  77.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color);             //4               
    9 ~7 ?" d  T! l- ]. G3 g
  78.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color);             //5' W" c7 J5 ^/ t) U; B
  79.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color);             //6
    , }2 }( ~0 ^2 C% ~$ x4 k
  80.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);             + D) v0 Z& o5 Z, Q3 v
  81.                 a ++;
    3 j5 ^/ `# [# W; M( C. C- h6 S: t. T
  82.                 //使用Bresenham算法画圆     
    7 E% V3 `/ ~# Q! p" z
  83.                 if(di<0)% Z0 P- j7 M, g4 ~: K
  84.                         di += 4 * a + 6;                                                                                    
    ( T3 v- h% V5 \7 U
  85.                 else( u) \( U! c: q# ]. g
  86.                 {4 i. E- w( H5 ~. f$ D1 ?
  87.                         di += 10 + 4 * (a - b);   # {0 A- F0 D0 g! [" J  l4 }
  88.                         b --;# ?% W& c( P9 a! c2 P6 l
  89.                 }                                                                                    ' J9 ~/ h1 P5 w: }, Y$ r# @
  90.         }                                                                                 
    ( O, Z4 o( X# z4 }5 N8 ?5 \+ e
  91. }
    4 a, j. E) d# n$ K7 m4 b4 Y0 v
  92.                                                                                                                                           : N5 F5 \5 [) s

  93. ( I7 |# F1 @( }# N  n8 n
  94. /*************************************************************************************************************************( C0 i- H/ k+ V& d3 D
  95. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)5 s2 K0 ?6 `0 ?: T/ c
  96. * 功能                        :        绘制直线(可以倾斜)
    $ e5 p4 R$ K  @) g
  97. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色
    ! ?1 A* U. q5 p
  98. * 返回                        :        无
    $ s# C9 e' a7 k6 }' B# ~3 n: m
  99. * 依赖                        :        画点函数
    : F8 F6 ?& c. r. O& X# E" f2 m
  100. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
      U. T2 u, \' h3 c, \
  101. * 时间                        :        2011-09-20) l! j# ^2 V5 E+ z( G9 Q8 _
  102. * 最后修改时间         :         2019-11-02
    ) H. y! n5 `0 Q! ?: h7 x" x6 R
  103. * 说明                        :         无( S: Q: ?* f" k) |! {$ @3 P
  104. *************************************************************************************************************************/
    " P$ j6 t& F2 y; g
  105. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    ; a1 t3 _' e  y* v( `; F
  106. {
    ( p1 o- ?7 l! s8 o0 P. ]" A9 S
  107.         u16 t; . k) ^  r4 t7 Z0 h0 s
  108.         int xerr=0,yerr=0,delta_x,delta_y,distance;
    . c- G& ~( o2 U2 ^& U5 {
  109.         int incx,incy,uRow,uCol;" M' {; j% B2 k  v3 R) G
  110.         
    0 A& U1 ?* t0 Y1 Z* _2 y! ^
  111. #if(GDI_PARAMETER_CHECK)                        //参数检查+ f6 h. m" Y8 C1 q
  112.         while(pHandle==NULL)& A2 y; h, I2 e- T' ~
  113.         {. U# E" ]) t3 r) ~+ @6 }6 N( o
  114.                 DEBUG("无效的句柄 pHandle\r\n");
    4 }& B, _3 {1 B' v0 u+ n
  115.                 SYS_DelayMS(1000);+ W- c7 D0 S9 l2 U# V) |
  116.         }        
    & |& ]: c; d% V& H' H! i+ M8 `
  117. #endif //GDI_PARAMETER_CHECK        
      ?8 c/ A& k. u6 v* z  \
  118.         7 o' K+ P& }: t1 {3 R' z! L
  119.         delta_x=ex-sx; //计算坐标增量
    1 g- Q) I4 k; c2 l1 A9 u4 }6 O1 I
  120.         delta_y=ey-sy; / e6 ]) ?% U! d  }+ y* k& q, n
  121.         uRow=sx; ! Z7 q8 V1 K* g+ d( C
  122.         uCol=sy; # ]3 {* V$ `# x) m
  123.         if(delta_x>0)incx=1; //设置单步方向
    + L# V6 j! H' q' S; ]# e1 \
  124.         else if(delta_x==0)incx=0;//垂直线
    " G- j1 o: P5 C) h& w( H: j' i
  125.         else {incx=-1;delta_x=-delta_x;}
    / @- j" u( S% b- O! z
  126.         if(delta_y>0)incy=1; ; N- j7 l' d& ^: k) E; V% _7 Y
  127.         else if(delta_y==0)incy=0;//水平线
    & L8 X# Q$ Q  l5 e  P) ^. B/ a( L
  128.         else{incy=-1;delta_y=-delta_y;}
    5 F7 f/ M/ c4 R4 b9 r8 s2 f
  129.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 % u2 y' i" f. T/ G9 `% o! x4 u
  130.         else distance=delta_y; 1 ~3 [5 y' a& e6 P2 V
  131.         for(t=0;t<=distance+1;t++ )//画线输出 # v4 g2 s3 X$ z3 S8 q' g
  132.         {  
    1 ?+ X, q8 `& Q! d4 y
  133.                 pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点
    * M: v9 E8 h/ c+ i- Y3 J
  134.                 xerr+=delta_x ;
    * r6 l1 F7 x6 P! D# y4 A$ E. i
  135.                 yerr+=delta_y ;                                                                                                
    4 r- u- P! j5 ?& n
  136.                 if(xerr>distance)
    3 m* [8 [! }- }' Z9 t: I
  137.                 { 6 H2 r: H, J3 A9 T; q
  138.                         xerr-=distance; % I% M' q- r6 `% Y% _
  139.                         uRow+=incx; 1 L5 l9 r- _. p
  140.                 }   A' ?. H4 A7 W" f! y
  141.                 if(yerr>distance) % d6 p, [; X' l, q" ^
  142.                 { 7 u6 n9 c4 `4 N* ]6 z) Q0 @
  143.                         yerr-=distance;   Z4 y& V; @) {% u
  144.                         uCol+=incy; / w3 I+ x. q5 f6 j+ k& Y
  145.                 }
    2 i2 k- Q% E3 ]3 [) N( \$ D' u
  146.         }  / j# Q! k- c6 T" B! h8 Q
  147. }
    : I- _. L( h: u$ D

  148.   [, f3 w+ R) m! Y8 C$ V% y5 S

  149. * s% l' @/ U& o" K
  150. /*************************************************************************************************************************& g0 i# r3 n4 l
  151. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    / f- H- X. c9 |  p
  152. * 功能                        :        在指定位置画一个矩形
    4 S  g" l4 f2 M8 x
  153. * 参数                        :        pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色$ q  {5 N  x* K7 u
  154. * 返回                        :        无
    ( R. l$ Z# ?8 Z! r, p
  155. * 依赖                        :        画线函数$ y: a6 s8 F3 J! @, u
  156. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>. Y! I+ l( [: p/ }; `  z9 a" w
  157. * 时间                        :        2011-09-20, o5 x. @! u3 p
  158. * 最后修改时间         :         2019-11-020 R- |; w2 X7 U- ^0 U% B* B" f
  159. * 说明                        :         无
    / {$ T% a* `9 A3 O0 d* n7 a5 x
  160. *************************************************************************************************************************/4 C  C3 d1 M, b) q" }+ j( D5 K# g
  161. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)- F* X5 A* I* Y5 d; f; I. X/ h
  162. {
    ! d! s' b* K/ K- T) S
  163.         
    3 m, x, p  C5 w1 u* l( c8 o
  164. #if(GDI_PARAMETER_CHECK)                        //参数检查  U" E. F. I5 V# ^
  165.         while(pHandle==NULL)9 Y# L3 w; G% v9 M
  166.         {
    * ^" ?& Y: Q- x! l
  167.                 DEBUG("无效的句柄 pHandle\r\n");- R; v. ]! B8 l  _1 g
  168.                 SYS_DelayMS(1000);* N$ g' r! d% k: Z( q
  169.         }        - V# H6 F4 ~+ P8 U& C
  170. #endif //GDI_PARAMETER_CHECK
    6 A) p1 H% h% ?
  171.         
    9 g8 Q6 {) H* R
  172.         GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);7 g4 \* T& T: r/ f) m
  173.         GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);
    ) x! C9 e* @- s6 K$ e
  174.         GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);& v& Q( k  _1 N6 t
  175.         GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);& f5 W4 R2 s9 K4 t
  176. }                                                                           
    5 `5 D+ Z% o- x; m+ N3 e# w& X6 ]

  177. ! U; s9 P1 m$ p. v1 y% X
  178. 8 {4 H  I' B' y5 ^& D
  179. /*************************************************************************************************************************
    5 Z. X; P( H: X; b
  180. * 函数                        :        void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    * p7 ]2 m( G: g$ x- o
  181. * 功能                        :        画一个2*2的大点
    * O: k. m4 W& k
  182. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色
    - q5 f; K% n7 d5 @1 g3 o
  183. * 返回                        :        无
    % _3 B7 x) }( F0 Z  }  k7 q
  184. * 依赖                        :        画点函数
    & s9 e1 Y0 R# Z) Z' A
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 f* s& S; n+ v  x1 u; g
  186. * 时间                        :        2011-09-20
      q4 ^' e, l) D* S2 `
  187. * 最后修改时间         :         2019-11-02
    ) q4 u1 U7 ?( T8 R+ L
  188. * 说明                        :         无
    0 F- X1 C' S  I  e7 }* x: y; p
  189. *************************************************************************************************************************/0 n2 m3 g$ h/ i9 B" X
  190. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
      x, H1 K. J* J4 m) Q
  191. {        
    ) ~/ B: @3 h, e
  192. #if(GDI_PARAMETER_CHECK)                        //参数检查
    5 X* d" E( W7 L9 N4 S# o
  193.         while(pHandle==NULL)
    5 G0 E' r' p5 v# G' g
  194.         {
    ) a0 E- q0 b: m$ K7 E
  195.                 DEBUG("无效的句柄 pHandle\r\n");, M* g5 Y9 j8 j: [: N. q
  196.                 SYS_DelayMS(1000);. W3 f, L( {1 |% b0 n% {& V
  197.         }        
    + b& h, t# p  h1 }' Q0 j7 {
  198. #endif //GDI_PARAMETER_CHECK
    " Y* J/ c8 O5 f% B2 p3 m' x; E) {
  199.         " d% R3 X4 w/ i  X, p+ ]  T1 U/ e
  200.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                //中心点
    - `5 l( m# y+ Q, ?# I0 O4 L
  201.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);* l9 V' @, k  V/ {4 i+ u
  202.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);
      x2 B% d5 `  ^0 j* x
  203.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color);                           9 n  }* i1 `/ u
  204. }        
复制代码

) m) J; D/ Z  i  k4 f
; r! V. t. I# h* D3 R' `
  1. /*************************************************************************************************************
    1 O& H8 G. p% x7 T) c9 K
  2. * 文件名                :        GDI.h
    # `7 M) ~5 r9 M( w! J, H
  3. * 功能                        :        图形设备接口(Graphics Device Interface), e: p: u8 {& k9 k0 F7 S% d
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    5 G& f: g% l. b5 {) v* J
  5. * 创建时间                :        2019-11-02
    4 t+ w6 x2 n8 H
  6. * 最后修改时间        :        2020-02-02
    4 E) l- ^8 \0 `% R
  7. * 详细                        :        STM32F7 图形设备接口
    2 V7 J$ j" a& ?8 z' E7 Q
  8. *************************************************************************************************************/& {3 G/ Y) K  O: v, E7 E) g
  9. #ifndef _GDI_H_
    : s) r' U& x$ K  x- l
  10. #define _GDI_H_8 i$ Q2 r! M! H
  11. #include "system.h"* \. X2 s5 [& W- s! T; l; h1 M
  12. #include "DMA2D_GRAM.h"
    9 ~. Y* b* e' R8 J& ^, V6 G

  13. ' G0 G( x- M% X9 ~- k5 J# b
  14. #define GDI_PARAMETER_CHECK                1        //参数检查-主要检查指针
    2 R/ ~& p5 _6 @+ L: }9 Z
  15. #define GDI_DEBUG                                1        //调试输出( h) ]2 E- \, G# m- Y% Q) G
  16. * n' H. G) K" T$ p' A) y
  17. #if GDI_DEBUG+ ?% y7 }: s2 l" H! R
  18.         #define GDI_debug(format,...)        uart_printf(format,##__VA_ARGS__)
    3 w+ y$ u6 H, k' n" v4 L
  19. #else
    - V' |/ e6 s  H7 X) F
  20.         #define GDI_debug(format,...)        /\
    + o( ]. ~! y, S
  21. // b2 K' o0 v$ L3 q( |- a
  22. #endif        //GDI_DEBUG$ Y9 j6 n& U$ J- t
  23. / j4 g4 _& N3 b4 F

  24. 0 K( T$ J! @  t" C9 p0 o2 _
  25. + g! A, }3 H: ]- u9 G- c' g+ Z
  26. extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle;        //显示器Layer1 GRAM定义# C: v1 x0 T0 v% L  V0 \. W
  27. extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle;         //显示器Layer2 GRAM定义
    ; f! x! M9 F! b6 N3 J
  28.         
    / m% K3 F! o( Q* R$ a
  29. #define LTDC_Layer1_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle)        //显示器GRAM 12 v, F% e0 Z/ \1 l  J. J
  30. #define LTDC_Layer2_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle)        //显示器GRAM 2
    9 y) o- p3 U) N+ T
  31. 4 H6 r" N6 ?  W) G- t. l
  32. //GDI相关API0 m2 Z: ?! R& V/ K+ S1 W
  33. __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    8 b" ^; u  r# v
  34. {        
    5 X6 X2 M. m% \8 h6 k
  35.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                                                //画点
    ( X# ^: x" N& v' E- I
  36. }        
    # S: j' H5 v6 E" v1 B6 D. _) Y
  37. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color);                        //绘制空心圆
    * F& I: a- }8 v$ U/ p) \( ?# l
  38. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color);                        //绘制直线(可以倾斜)
    ; x3 r" F! j  u9 k0 o) |& V
  39. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color);                //在指定位置画一个矩形3 |) W  W, B: C2 F, o
  40. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //画一个2*2的大点
    9 m) e/ C  H+ x- N- e5 u

  41. 0 O& D3 F  f3 h' o4 E6 j

  42. & C% h* H: |" y- [
  43. #endif /*_GDI_H_*/
复制代码
6 N# x8 S* b8 |+ k
测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。4 H/ V7 K$ }+ T; {
3 }  i7 c- k5 Z5 i" W
  1. FIL *pFile;
    0 L; G3 a' j/ W5 }# p2 `! T( l7 [
  2.                 FILE_ERROR mError;
    . b& U' c6 u$ M  M  m
  3.                 GRAM_HANDLE *pGramHandle;, V2 L- v7 B# B& Y: P+ {! h
  4.                   P9 N/ L' A- h% `% o& o
  5.                 pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565);        //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB5653 }3 I% s2 b* r" M0 [8 R
  6.                 if(pGramHandle != NULL)$ R  D( g  e2 {: K0 g' A
  7.                 {$ _* w) y0 K$ t- e
  8.                         GRAM_Clear(pGramHandle, 0xff00);                                                //清除显存,防止读取失败了还是现实上一次的图片+ p& C! ?+ l& G, @4 _" s+ \
  9.                         uart_printf("[OK]GRAM初始化成功\r\n");
    8 [) G4 Z; x* T# e
  10.                         pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);) ?& c/ {% Y: {4 {% `1 a  ^
  11.                         if(pFile != NULL)
    4 H: c4 X5 s, W* ^1 l9 a
  12.                         {
    * r2 a" ^) D# S  ^7 [" K2 i
  13.                                 uart_printf("[OK]打开文件成功\r\n");
    : _- d7 K! j6 {& _8 ~5 K* X- A
  14.                                 if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中8 s& ]. R; k; ]) x6 b; z/ N+ b2 Z
  15.                                 {5 N. U0 n% A' O, d( s
  16.                                         uart_printf("[OK]读取文件成功\r\n");
    / K& N( g9 A+ m2 r# G+ V; M
  17.                                 }0 `6 t) V, \! K  M( c
  18.                                 else
    # j5 ^: ^9 y9 K! F4 g- n2 W
  19.                                 {) i# P6 |0 z" B& Q
  20.                                         uart_printf("读取文件错误:%d\r\n", mError);4 y2 F+ [: v; U
  21.                                 }
    0 t8 g4 {) w: d3 }6 a
  22.                         }
      F/ o/ ^% Z6 K6 f6 U
  23.                         else
    7 i% G9 X; r4 t% j3 n6 g
  24.                         {. V# _6 Y2 a, b4 U
  25.                                 uart_printf("打开文件错误:%d\r\n", mError);
    . ?! G" X! I; m( h9 Y5 {, P! F
  26.                         }
    4 c# T$ A- |- \/ k5 t, j8 y
  27.                         //将显存拷贝到屏幕中1 q0 K5 k" a5 ]6 G+ @" ?
  28.                         GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240);                        //GRAM局部拷贝
    9 D; O8 z" l# \9 Y& y6 T
  29.                 }
复制代码

% c3 e' Z5 w$ g' `  `$ ~" K
0 x" t; C4 A+ o2 @4 }. `8 @; Y, D  ?
收藏 评论0 发布时间:2021-12-16 21:00

举报

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