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

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

[复制链接]
STMCU小助手 发布时间:2021-12-16 21:00
DMA2D可以加快图像填充,并且支持像素格式转换。; @9 |* V! ]) ^! N
1 Y  F2 ^: \  K1 @+ `8 X$ K
  1. /*************************************************************************************************************2 k' p. c; I# ?4 w, @* _1 ^
  2. * 文件名                :        dma2d.c9 P; Q) D* \2 Z& Q8 h! v% f1 |0 r
  3. * 功能                        :        STM32F7 DMA2D驱动. P8 X/ r" E0 @$ X* \0 K- I' B9 h& v
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>, I! _/ |" ]# B- t- h
  5. * 创建时间                :        2019-10-29
    ( Q9 v  u' [3 H/ |% A& I
  6. * 最后修改时间        :        2019-10-295 W& L) e4 H- V$ h7 d
  7. * 详细:                        . M* W+ O& ]7 d6 ?7 w0 ~; M
  8. *************************************************************************************************************/        
    4 g/ L2 g* V. }* @) R* [
  9. #include "dma2d.h"
    / M8 J4 s6 @% `/ a% Q$ ?1 T8 e
  10. #include "SYSTEM.H"
    * I2 A& z: l- ~; J6 I( M" j

  11. ; {# Y$ B" h7 Q+ W0 t& u3 y

  12. 9 m! R  E: r& k
  13. /*************************************************************************************************************************5 d$ q# Q1 }+ \6 q0 c
  14. * 函数                        :        void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color): Y7 X- S# B# X
  15. * 功能                        :        DMA2D进行单色填充& Y5 |& [+ C3 c+ J
  16. * 参数                        :        FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;
    . ~+ b! r8 M% W- M( c: f
  17.                                         ColorMode:颜色模式;Color:颜色值
      [' z! n/ L' v9 N
  18. * 返回                        :        无8 w* Q( r. x( Q6 L' X% E8 _) l. B
  19. * 依赖                        :        底层宏定义
    % |: d7 |! @7 t2 g# Y. O2 W
  20. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    . O/ v5 B3 _0 r; a% X4 z& E, a
  21. * 时间                        :        2019-10-29
    ; \! o. f7 U5 A! R' v; @: C4 k
  22. * 最后修改时间         :         2019-10-30
    ( o2 C, i( n- i
  23. * 说明                        :        用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    6 w; G% ^! L5 P  O
  24. *************************************************************************************************************************/, I8 D: v3 O) d
  25. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)
    0 H( \. s! L: g
  26. {* x5 a5 M+ y: {! N' \
  27.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟) O$ H" E# z6 I  \7 b
  28.         DMA2D->CR = 0;                                                                //先停止DMA2D4 {5 s6 y1 p- u: D1 X! x. e' m" z0 L1 i
  29.         DMA2D->IFCR |= 1<<1;                                                //清除传输完成标志
    4 b: t2 A' p; K; _+ N
  30.         DMA2D->CR = DMA2D_MODE_REG<<16;                                 //寄存器到存储器模式% g- K1 F3 s9 L  O3 v8 K
  31.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式. p! f4 |+ D6 Y8 }* N3 ^
  32.         DMA2D->OOR = OffsetX;                                                //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    1 n9 ^* u4 |8 W- x
  33.         DMA2D->OMAR = FGRAM_Addr;                                        //目的地址/ G' [5 m; T1 t) ?% n- [
  34.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数4 m* w% r% e* h; B/ X! M6 s# _
  35.         DMA2D->OCOLR = Color;                                                //输出颜色1 l( d2 t* Q% ?

  36. % X7 R0 z! Y9 q
  37.         DMA2D_Start();                                                                //开始传输. [, }% e7 [' E+ b. J
  38. }
    / o9 |% l( d; @. V4 J% ?
  39. 9 z0 |8 i% f. ^& ]+ O

  40. 2 L5 \$ e" z% H& `

  41. , m; U9 ^$ C7 A# |: }
  42. /*************************************************************************************************************************
    # H; M0 F  h! {8 N- E7 D7 o" z2 ~
  43. * 函数                        :        void DMA2D_WaitTransferComplete(u32 TimeOutMs)
    $ m$ Q& {5 M7 d/ W: q/ [
  44. * 功能                        :        等待DMA2D传输完成
    & I* B: E/ i* T- S, N
  45. * 参数                        :        TimeOutMs:超时时间9 [8 g- ]5 c: Q- y
  46. * 返回                        :        无( A7 R* }3 q6 Q5 d( R9 v
  47. * 依赖                        :        底层宏定义
    4 Y, b1 \7 }/ r2 G% T
  48. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ! U! I! m7 Y& P
  49. * 时间                        :        2019-10-30
    ; c  w( ]6 }$ ~! ~+ ]/ t
  50. * 最后修改时间         :         2019-10-30" R# r0 B/ x9 G; H
  51. * 说明                        :        超时后会取消传输, O; V' M5 I3 S: s; o2 N
  52. *************************************************************************************************************************/( R1 E4 A6 I9 X! n3 G8 A2 \
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs)! ^6 t. Z4 i9 K
  54. {
    2 s: y# p' G; F! O- \7 j" U% l
  55.         u32 timeout = 0;
    & _! Q& U! p" P. S# \& M
  56.         
    . |9 Q& O' I* o$ C- ]0 j) H
  57.         while((DMA2D->ISR & (1<<1)) == 0)        //等待传输完成
    1 U, |" `$ F8 y2 ~0 ~
  58.         {
    ; l# X. N& |7 A( o
  59.                 timeout++;
    & H1 ]! N; l& n
  60.                 SYS_DelayMS(1);                                        //延时1ms
    / Z0 x1 n: c( a
  61.                 if(timeout > TimeOutMs)
    , K; u0 d* N- G3 j4 C1 W1 H
  62.                 {
    / Q1 }6 ^0 j! `( ]9 r/ E1 Q- y5 X* l1 S
  63.                         DMA2D_Abort();                                //终止传输9 \1 ?+ D' D- {( i- {% R
  64.                         break;                                                //超时退出( i; z8 L6 B! b. w
  65.                 }
    : h9 U" }4 P7 w
  66.         }  + u+ o7 Y. d* I( N$ c$ y- X+ b
  67.         DMA2D->IFCR |= 1<<1;                                //清除传输完成标志         0 L2 Y: S6 ^; P
  68. }
      ^, R2 C0 Z% e( V0 @! d

  69. ' Z+ u  f5 z, p3 j- X% k) [
  70. /*************************************************************************************************************************
    $ l9 _  m5 z0 v9 n, b' c) O) G
  71. * 函数                        :        void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)9 k) T" r8 U$ m8 d
  72. * 功能                        :        DMA2D进行矩形图形填充0 g& F- `5 q' V) }/ f$ |
  73. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
    & v  F& \3 v8 Y
  74.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);& O* w( n* u0 p. D4 N: q) q
  75.                                         ColorMode:颜色模式
    / w) D9 m! f9 w+ E' T. Y
  76. * 返回                        :        是否设置成功3 w0 B% Z& z9 P
  77. * 依赖                        :        底层宏定义2 B& n1 ~! K" f7 a4 l0 _2 N
  78. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ) H* b& ^: k1 v5 ?- d) G
  79. * 时间                        :        2019-10-288 Z9 L; t$ p# x% |1 r& E( `, Q4 B
  80. * 最后修改时间         :         2019-10-28% A% @4 c% z. V/ j* I6 [  x
  81. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    - L" O1 \; W4 _  W
  82. *************************************************************************************************************************/
    & [2 S+ g& h2 \4 S" d- P
  83. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode), c! z" g6 Y/ u. X
  84. {
    2 \7 o" x+ s" i4 R% P+ K, p3 H5 O
  85.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    3 r% }+ v3 m9 \/ O! i% @
  86.         DMA2D->CR = 0;                                                                //先停止DMA2D- k2 }5 ~5 z& u- L/ W" N' c
  87.         DMA2D->CR = DMA2D_MODE_MEM<<16;                                 //存储器到存储器模式
    * u, a. o+ x; H& |5 ?
  88.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    6 c) W0 o) |: D- |7 }* ~7 E
  89.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
    & d1 Y2 x) R# M9 n/ i' ?0 A
  90.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址: ^/ R- n( {  \. N1 m
  91.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移 0 [  I7 K8 l- |
  92.         DMA2D->FGPFCCR = ColorMode;                                        //源图像颜色格式# t2 J) S% K/ T9 `, O
  93.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充, r' n  X2 Y1 Q( v
  94.         DMA2D->FGMAR = SourceImageAddr;                                //源地址, J- E  Y0 }8 g
  95.         
    ; w1 P" ?2 q5 \* g9 I
  96.         DMA2D_Start();                                                                //开始传输9 F% ^& w* J3 V" T
  97. }
    & S7 N2 z, S7 P7 s1 g' Q
  98. & U2 p$ f0 P9 c( F
  99. 5 _" u1 ^4 r9 S8 _, I6 `2 i
  100. /*************************************************************************************************************************  U7 @8 U4 X) I0 e+ A
  101. * 函数                        :        void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    . Z5 C7 z% w+ c4 [! [& Q/ F
  102.                                                 DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    * V4 I8 }% x: o  V. V2 _6 U6 {
  103. * 功能                        :        DMA2D进行矩形图形填充(会执行像素格式转换)
    ) \+ r. E/ D$ P! N( [. P7 }3 H  `- d
  104. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
    4 _' T- {# {+ f1 i6 j
  105.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);' m6 {* e) y+ \) N, X, T4 ~
  106.                                         SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式+ u* x& |+ o2 r3 G8 ?$ j
  107.                                         AlphaMode:alpha模式;Alpha:Alpha值;7 t, t. Q3 G7 T$ n7 A
  108. * 返回                        :        是否设置成功
      s1 O! Z5 w8 ?$ a
  109. * 依赖                        :        底层宏定义0 `3 R3 C7 ~( X' b) A0 J
  110. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>4 n4 {0 \; T5 m, e( f
  111. * 时间                        :        2019-10-28
    ; z' U  R' l. n4 x; h4 H
  112. * 最后修改时间         :         2019-10-288 m; v+ M' U' n& g% Z; k
  113. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    5 A% e" ^& ]) ~  ^7 v( t- `6 c0 }
  114. *************************************************************************************************************************/
    7 ^* P% F- w; R) ?8 ~. T+ K
  115. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, 9 X7 l/ d. r5 j
  116.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)/ W' e' V4 x! Q8 i% J8 z
  117. {% y& a7 ^7 @$ r, E, ~
  118.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    , U) Z6 e  j' b( d1 F8 v
  119.         DMA2D->CR = 0;                                                                //先停止DMA2D
    8 r( `" m& K% D- L2 g# `8 ~
  120.         DMA2D->CR = DMA2D_MODE_MEM_PFC<<16;                        //存储器到存储器模式-激活PFC
    + H  u4 S$ ~+ _& t
  121.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    , w- m5 l% C- X4 B5 k: [
  122.         DMA2D->OPFCCR = DestColorMode;                                //输出颜色格式
    4 I" v- i' s3 R. k6 x
  123.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址3 Q3 _* r# S# ?0 X  n! `
  124.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移
    . ]1 x7 h- [1 f$ T& w* z
  125.         DMA2D->FGPFCCR =((u32)Alpha << 24) |  ((u32)AlphaMode << 16) | SourceColorMode;                        //源图像颜色格式* H$ U  [0 `6 ]( r
  126.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    7 G% B+ V/ m. i
  127.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
    - n! O  y. Z# ?; g8 x
  128.         * N4 l' s/ Z; c7 m) Y
  129.         DMA2D_Start();                                                                //开始传输
    ( `* @. I/ r" v5 u
  130. }
复制代码
  1. /*************************************************************************************************************/ o0 ?* N7 r$ r( T* d" o# n
  2. * 文件名                :        dma2d.H- _; N% i/ x; n0 h- w6 T
  3. * 功能                        :        STM32F7 DMA2D驱动- B& O! }& I: _8 ^% H+ F- z8 a
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>* m% k; }8 V- z0 {2 p/ j' S
  5. * 创建时间                :        2019-10-295 L$ q8 b3 M4 ?# k
  6. * 最后修改时间        :        2019-10-29
    ! S+ M$ l# g' P0 u4 w
  7. * 详细:                        
    9 p: c4 ^6 p6 I
  8. *************************************************************************************************************/        ( p, I5 a$ y4 {/ B7 o
  9. #ifndef __DMA2D_H_3 n3 |8 L7 i' O5 a0 m
  10. #define        __DMA2D_H_           * b( X# i* r' [1 ~  R3 H7 k  d
  11. #include "system.h"( @; [6 e4 `$ A' F! F# z
  12. ( n, O5 L/ R3 u* G9 P* s$ Q
  13. 2 m  d" G0 I  y" z: i; t; N" ~$ u. l
  14. typedef enum
    5 Y8 l8 ?! h! Z3 m& X" g
  15. {
    & @5 q$ F6 v+ m" [. a
  16.         DMA2D_MODE_MEM                =         0,                //存储器到存储器(仅限 FG前景色 获取)) ~2 T- N; F7 e5 f' \
  17.         DMA2D_MODE_MEM_PFC        =        1,                //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)9 R9 v4 Q4 c4 j/ m- l8 Z1 t
  18.         DMA2D_MODE_MEM_MIXED=        2,                //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)! H7 K, E0 O- D; J; o+ r# @
  19.         DMA2D_MODE_REG                =        3,                //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)
    " i; `7 K/ w2 Q6 i8 \9 s+ y
  20. }DMA2D_MODE;
      B* @5 _% _* `

  21. " M$ P, {; s! Z% d  g, E
  22. //颜色模式" `. o; \; e, _2 N
  23. typedef enum( l! k; O* X  n* G! S
  24. {
    : m# @1 b6 A! J0 J. p
  25.         DMA2D_COLOR_ARGB8888         = 0,
    4 T( c) @2 }, a# ~: b, |3 Q' b
  26.         DMA2D_COLOR_RGB888                 = 1,$ s  ]- m" V% ?7 m5 h
  27.         DMA2D_COLOR_RGB565                 = 2,
    , c8 ]2 f. n1 L$ `, q
  28.         /*DMA2D_COLOR_ARGB1555         = 3,
    ! P3 l# ]2 F. ]7 Q, R
  29.         DMA2D_COLOR_ARGB4444         = 4,
    / }( i7 _7 B, J1 @- T0 k
  30.         DMA2D_COLOR_L8                         = 5,        //8 位 Luminance
    $ E4 [4 Q& N/ L; c- N, u/ W! c/ t
  31.         DMA2D_COLOR_AL44                 = 6,        //4 位 Alpha,4 位 Luminance: B/ f2 H' }  O8 T# g7 a" l
  32.         DMA2D_COLOR_AL88                 = 7,        //8 位 Alpha,8 位 Luminance
    ( V3 ^- t! @- v' g3 M8 ?9 V1 ]
  33.         DMA2D_COLOR_L4                         = 8,        //4 位 Luminance3 L& q$ O4 M3 `4 ]% L% r
  34.         DMA2D_COLOR_A8                         = 9,        //8 位 Alpha
    % a" v9 g6 Y0 d) v
  35.         DMA2D_COLOR_A4                         = 10,        //4 位 Alpha*/
    ( o9 v1 ?7 S  ?
  36. }DMA2D_COLOR_MODE;
    % G3 H6 k) q& G( E" M; O
  37. : [1 U* f3 b/ e

  38. 3 Z5 K$ p, y2 p" h1 z
  39. //Alpha 模式
    ) s. O. T2 M/ c& J- [9 i
  40. typedef enum
    . r+ h* e  l) i2 m$ b: o$ ~
  41. {
    1 _8 C# F9 |4 ]3 d( [( f
  42.         DMA2D_ALPHA_NULL        =        0,//不修改前景层图像的 alpha 通道值
    , l) e- |* K5 @9 ]( p
  43.         DMA2D_ALPHA_REPLACE        =        1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]( k# g) K. P( D. }  H0 J: K' T& e
  44.         DMA2D_ALPHA_PRODUCT        =        2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积0 B: m, r6 d6 \, _8 S. G  O3 t
  45. }DMA2D_ALPHA_MODE;  V7 J: I) A, c* Y% G% @+ j

  46. $ g4 m  w; U3 J

  47. / Y: j8 {! M! u5 Q
  48. __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;}                //终止传输
    3 @. k) L! f' }$ F8 x% {+ K* x% M
  49. __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;}                //挂起传输
    ( p8 u# T5 U0 m9 `
  50. __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;}                //开始传输$ c: e3 v  s8 V0 m  S6 A
  51. ! f  w; N! p9 s$ [* E
  52. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color);        //DMA2D进行单色填充, J3 y0 q  W+ e1 c1 G
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs);                                                                                                                                                        //等待DMA2D传输完成3 O: w& v. y( q6 p( z2 {4 k
  54. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充
    9 g  P& G* E  R& ?
  55. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    , i% ]" v2 `- n; O
  56.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)) k" E$ d' S# p0 @1 D# D
  57. #endif //__DMA2D_H_
复制代码
  1. /*************************************************************************************************************2 p2 _8 d+ m2 I1 R5 Q4 b2 Z& X
  2. * 文件名                :        DMA2D_GRAM.c
    5 x- j" V& }, J1 I; J7 g
  3. * 功能                        :        GRAM相关操作
    ( C1 U5 i0 f) M6 e+ l% w
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    / j1 U& K, ]  B7 w$ F8 M$ y7 l
  5. * 创建时间                :        2019-10-30
    $ V; K/ V! I( l
  6. * 最后修改时间        :        2019-10-30
    - i9 t4 x* }) ^. S
  7. * 详细:                        显存相关操作接口
    0 r$ t6 D3 z& W  }* t0 E2 g% c2 l
  8. *************************************************************************************************************/        
    2 u# e+ e- ~# `6 n% u% e
  9. #include "dma2d.h"6 P. I' ~" L* y; y& `  U; x8 z
  10. #include "DMA2D_GRAM.h". ]3 ^  B7 b  ]8 l' d  c
  11. #include "SYSTEM.H"
    3 J' ~5 H- |8 T. N% }- U
  12. + A0 ~( M8 o/ |" O. P8 M
  13. //基本接口5 a: G4 X9 b% p7 N
  14. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //32bit色彩GRAM显存画点7 {, M1 o( ]" d/ ^, i
  15. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //24bit色彩GRAM显存画点
    & X) ^' ?: }6 n
  16. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //16bit色彩GRAM显存画点' c+ T- m8 E- b- p/ r8 t
  17. 4 a; U' a, p6 ]# u0 p7 y4 m
  18. $ i3 T  |6 M  z- d% l7 S
  19. //GRAM相关接口-16bit5 Y; V5 @& X* D' l6 N2 F
  20. const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit = # y- n( R: ]7 K) s; l: \4 @$ e. l
  21. {4 ]1 h& i- L4 l2 O2 ]- n
  22.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit,                        //GRAM显存画点(RGB565格式)
    * W1 W+ S$ ?# Z0 O5 S0 W/ M; c
  23.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    3 r% @8 C" D  u# }% o
  24.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    1 Z1 a9 v5 {) W: A
  25. };1 U5 k3 {5 L6 }; \

  26. ! S# P1 U# @3 W% Q' @' d8 S
  27. //GRAM相关接口-24bit
    2 P) r" x0 A$ [8 A5 \6 O
  28. const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit = # Z% Z$ {, A0 [+ u
  29. {
    . w/ q5 n2 s  q% z
  30.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit,                        //GRAM显存画点(RGB888格式): i3 p: ]5 u; g8 l6 l- s
  31.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    - W6 G/ b; j6 F* C* h; E
  32.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    ( P8 R7 B4 X: U, L  w+ B5 f
  33. };  m2 l( h: W+ S2 k
  34. 7 `3 s$ ]' N; T; |) A% {  _+ p
  35. //GRAM相关接口-32bit3 ^- L* A" u0 x) h, h  ?( q4 z
  36. const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit =
    1 T. ^; [" n- C% K+ i! t" _+ v$ s6 X
  37. {! O. R$ C% y, `1 [$ }0 A- |
  38.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit,                        //GRAM显存画点(ARGB8888格式)1 S; X+ G9 J. t' U7 K/ Q
  39.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充, n% M; V% l, i$ w
  40.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)4 Z8 S( \' S4 ?* x. f) b. P" i& _
  41. };9 M: R. J" ?0 ?( H5 Z

  42. 2 H6 b  o$ O5 E& A7 G6 U: G2 k
  43. /*************************************************************************************************************************
    4 }3 G! N8 U0 F+ J2 d
  44. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)4 O! f) r) w( ?# r% v* T
  45. * 功能                        :        GRAM句柄初始化(不会申请内存)
    4 w' p' i4 n4 D  ]2 W1 I
  46. * 参数                        :        pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式* U& b# _0 n# x5 [  {0 D
  47. * 返回                        :        无8 b7 _/ n$ S9 Y
  48. * 依赖                        :        底层宏定义4 z2 t3 L6 M" K2 {4 v/ A
  49. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>3 O2 t" j+ E5 J! U9 M$ q( H* ]7 n
  50. * 时间                        :        2019-10-30$ m5 {  ^3 v5 x. c: m
  51. * 最后修改时间         :         2019-10-30; M- N5 q+ [+ p" _" U
  52. * 说明                        :        初始化显存% T9 Y' A* }4 v& {
  53. *************************************************************************************************************************/
    4 i; Z/ d: x0 S: q4 [
  54. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    & N/ G  ~, y, _; ^  d# G7 f
  55. {
    ; X0 X- S" E9 Y. G0 ^9 P
  56.         while(pHandle == NULL)7 V; m+ u) l5 c8 O' z' P
  57.         {
    4 ~4 j( u4 G; x# \0 y
  58.                 DEBUG("无效的句柄pHandle\r\n");
    ' R5 Y$ K' s3 R2 U/ e) C4 x: y
  59.                 SYS_DelayMS(500);5 Z* Y- Y+ L7 p' i* N- t
  60.         }; ^9 N- K- Y, Y$ l, \. |
  61.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址1 t  w# k0 z' b
  62.         pHandle->Width = Width;                                                        //GRAM宽度
      S/ q5 K$ F2 b4 R* |
  63.         pHandle->Height = Height;                                                //GRAM高度$ u& ^/ G6 ~2 f" @4 X
  64.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针0 D5 J  K+ h& B1 n$ k
  65.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针
    ; b2 w% }9 Z3 W& @$ f" F4 Q
  66.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针$ s; Q: k# l5 v3 N, G4 D# I5 i
  67.         //像素模式
    8 J4 T' I9 h* x2 ~% N$ D
  68.         switch(ColorMode). e) e7 y; S' r- S
  69.         {2 U3 F" Q8 `$ V; E
  70.                 case DMA2D_COLOR_ARGB8888 :' S4 |  s% Z, B2 V) o" s/ m) S+ z
  71.                 {: g. u3 T4 E/ K$ j9 z
  72.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
    % z6 P9 v8 r- ?8 J
  73.                 }break;, k& e8 r. V. |2 ~' K
  74.                 case DMA2D_COLOR_RGB888 :
    - V# e& s5 ?* g5 j% Q
  75.                 {
    - M( G5 i7 b' y5 u; k
  76.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
    & E; T4 I/ A: d9 A
  77.                 }break;
    6 ~6 ]" ^; ^! W5 Q) `6 _" _8 p
  78.                 default: //DMA2D_COLOR_RGB565* ~2 j4 T, T5 a( D- T
  79.                 {% c% n9 h# B9 O) a: e# [9 e
  80.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;4 i  F2 o( c  C
  81.                         ColorMode = DMA2D_COLOR_RGB565;
    - @- l" q4 d, W, ?) J2 O# }8 o- r
  82.                 }break;, I6 q1 K! ~1 q' f+ A5 c
  83.         }8 |2 R' T" K" h/ o" m- I
  84.         
    ! {0 K1 `: ?; [9 Q8 m9 ^
  85.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式
    4 i8 U5 v: Z! u* e: o# @2 m3 S
  86.         pHandle->InitStatusId = DMA_INIT_OK;                        //初始化成功, J4 S/ F: a9 x% ]( S2 T
  87. }/ I9 b' R7 J  l. H5 _

  88. % s6 m0 ]" |0 h9 s9 c
  89. /*************************************************************************************************************************' W5 X3 z( x6 B+ _/ Z5 e! a9 g7 v
  90. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)
    " f2 a8 o" c! a, T; i
  91. * 功能                        :        创建一个GRAM(会申请内存)
    6 u8 P# }) `6 h1 D6 {! ~  N8 V
  92. * 参数                        :        Width:显存宽度;Height:显存高度;ColorMode:颜色模式3 z! b4 l0 E- T6 D$ A7 ]
  93. * 返回                        :        NULL:失败;其他:GRAM句柄  P0 D* k0 {$ q" k/ B8 H! q
  94. * 依赖                        :        底层宏定义+ U/ H% ]% \" U) U( m5 Q: m
  95. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ( }. i3 p2 t2 n( m. a6 a
  96. * 时间                        :        2020-02-02
    . v! o& K' ~/ N+ y& P
  97. * 最后修改时间         :         2020-02-02/ o) z1 `+ K* X
  98. * 说明                        :        初始化显存
    ! K0 v  i' U1 \% Y3 r0 u  M
  99. *************************************************************************************************************************/1 |0 w7 ^0 R, W7 M3 I
  100. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)4 I& [" {( @/ m! x$ S- @$ ?$ e
  101. {
    $ V, V9 K: T9 O
  102.         GRAM_HANDLE *pHandle = NULL;
    # p( x2 A0 o& N4 v
  103.         u32 GRAM_Addr;
    8 V* r4 r; w/ T* v/ C8 }
  104.         
    7 v7 N- v$ I+ u3 w3 l( t) j
  105.         pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE));        //为句柄申请内存3 ]8 _) X. B- F; F: S) O( c
  106.         while(pHandle == NULL)
    8 v4 b+ G5 R" v( d6 ?
  107.         {
    : i4 w: `* V, z7 D' Y
  108.                 DEBUG("无效的句柄pHandle\r\n");1 x; L, [' _2 o* \4 _. n
  109.                 SYS_DelayMS(500);
    - ^4 E2 _4 P& z( W1 C) }) q0 ]
  110.         }
    5 h' y! V4 g# b4 E+ l
  111.         
    ' N9 K1 U3 h6 W2 d4 J8 r; j
  112.         switch(ColorMode)
    8 T' e( m& h" X# `0 P& T7 N: \6 I- g6 n
  113.         {6 s; z' ^, w5 ?3 i/ ~6 d5 L
  114.                 case DMA2D_COLOR_ARGB8888 :
    $ v' b* T) o8 o7 d# V/ j- \
  115.                 {6 X6 s! E1 X, [/ S5 z$ G1 x
  116.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存
    ( V" @, T3 k; N7 o
  117.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
    " o7 E, w' u% h
  118.                 }break;0 O- C( M' V8 P: i! {
  119.                 case DMA2D_COLOR_RGB888 :! ~' A& k  x+ K3 D, U. e) P2 b
  120.                 {( ~# D8 @2 q6 n" |% o/ c7 ^
  121.                         GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height);                        //为显存分配内存& Z5 Y" P8 T  B  O. n' u7 j+ R3 u
  122.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;/ U! `+ b9 Y5 a7 ~0 B; n: }0 b. Y
  123.                 }break;9 G8 {- S6 L6 w6 m5 u# ]
  124.                 default: //DMA2D_COLOR_RGB5650 R9 n) ~& W/ }" j3 h0 x5 e1 `  j
  125.                 {3 ~4 ?$ ?8 \- c2 }
  126.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height);        //为显存分配内存
    7 n4 Q7 N, T  Y+ ?
  127.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
    * ?: r7 g1 r4 P2 A" Q- B
  128.                         ColorMode = DMA2D_COLOR_RGB565;8 ?7 N+ q- ?0 D# t
  129.                 }break;- O( f! \; ]/ Z0 v8 Y/ E+ S
  130.         }+ t; c6 i8 t9 k! V8 {& T
  131.         
    3 K5 s# t  ]8 n
  132.         while(GRAM_Addr == NULL)% [5 b$ u* b6 F/ U( ?. M/ \# A( b: [
  133.         {4 q+ ^0 O  @, Z5 s" F7 U8 `4 N
  134.                 DEBUG("显存申请内存失败\r\n");2 g+ q* _& C, u" W0 u5 q2 e
  135.                 SYS_DelayMS(500);' H- {5 m9 b  [3 j) l
  136.         }
    * k  }; |9 N* [/ `5 z7 }- H, W* V: o7 m
  137.         
    * I5 }, J  N! k' `% _: n. c2 Y
  138.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址" R! E' t; f/ ~) T; j$ |
  139.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式3 |, q+ z+ a! C! M7 l
  140.         pHandle->Width = Width;                                                        //GRAM宽度4 [% o1 p$ C' h2 R2 y# f4 b9 z, E. s
  141.         pHandle->Height = Height;                                                //GRAM高度" T$ ]2 K3 U" t* u9 L
  142.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针- N4 i# B4 ?( y, }2 I  y+ `( f: Y
  143.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针% l/ T( Q% A: z; [  d
  144.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针
    8 w* F# c& N0 u; q5 ]
  145.         pHandle->InitStatusId = DMA_CREATE_OK;                        //创建成功4 R: g& ~* K  z  m
  146.         
    " I6 E$ H$ Q3 J) T7 A4 T3 J
  147.         return pHandle;0 C3 t: o5 ~. I7 V
  148. }* p8 b1 k% c. X1 _' q

  149. ! @5 B/ L1 S. j. e
  150. ( a/ g/ h+ c- \: r; T7 X) u6 f
  151. 9 j$ b: H+ U  S7 s
  152. /*************************************************************************************************************************" I. \$ ]' ^0 H  G) i* g- `
  153. * 函数                        :        void GRAM_Delete(GRAM_HANDLE *pHandle)
    ) o7 w  K' M3 T% z0 d1 k
  154. * 功能                        :        删除一个GRAM(会释放内存)
    ! A$ W9 E+ z. F! S" s) C' x
  155. * 参数                        :        pHandle:GRAM句柄, j4 C8 z( T. i
  156. * 返回                        :        无
    ; ]2 t' D$ q& l! T& n
  157. * 依赖                        :        底层宏定义
    ; ?$ c6 Y* Y" H
  158. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    6 O# F) K: T9 r: I! f2 N0 O
  159. * 时间                        :        2019-12-165 R$ s! `% e3 G0 k# |
  160. * 最后修改时间         :         2019-12-16
    9 `) n) v9 J  {6 A0 L5 R
  161. * 说明                        :        用于删除显存,释放内存) x' J/ Y' B3 c/ A, h
  162. *************************************************************************************************************************/$ F6 [" \1 S0 P- Z; f& A
  163. void GRAM_Delete(GRAM_HANDLE *pHandle): w6 J/ b$ [3 Y# a# {) P
  164. {' C1 U1 t' P4 f; D/ z& v8 M. D
  165.         if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)1 ^/ O4 e3 M+ r4 Q% w+ Y
  166.         {
    , y- R: a4 B9 r
  167.                 if(pHandle->GRAM_Addr != NULL)# N! z) V& Z* g
  168.                 {
    8 |* N. X" Q: R) d) v' d3 `$ A
  169.                         GRAM_free((u8 *)pHandle->GRAM_Addr);                //释放显存内存
    5 o8 O" C/ ?: g/ H
  170.                         pHandle->GRAM_Addr = NULL;& O# ?' }6 k, D" E
  171.                 }
    , I) o4 m- C- M$ a4 h. B
  172.                 pHandle->InitStatusId = 0;* c" ?+ C$ B# F6 u3 y
  173.                 GRAM_free(pHandle);                                                                //释放句柄内存
    ' V# ^; e5 d% g1 P' p
  174.                 pHandle = NULL;; r0 `- B( V8 z8 N% f* Z
  175.         }; S/ H) b3 L8 s: D: `# Z
  176. }: n3 V, \& b. V; ^1 o% A

  177. ( i+ \0 U! p7 l1 c
  178. 1 i8 o+ _0 `5 W/ J7 A" k" l
  179. /*************************************************************************************************************************  \8 E/ z) F; [8 u4 ]. H2 b
  180. * 函数                        :        void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    - c' T7 j/ r! w2 f) ~; @/ J5 q' q$ r
  181. * 功能                        :        32bit色彩GRAM显存画点1 D( p) Z( v3 [. h1 q! m8 z8 ~
  182. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色3 @$ o( t: U+ x: ]( l. n
  183. * 返回                        :        无5 t6 f  f# K5 c1 f6 n- |" b( K
  184. * 依赖                        :        底层宏定义
    4 K7 r: K1 P& w. W2 e$ L, ?9 y
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ; R# ^; u7 q) B! M" l" G7 G! Z
  186. * 时间                        :        2019-10-30
    ; t. A% i  I/ @7 ^# C( ]
  187. * 最后修改时间         :         2019-10-30' G6 a! X( V/ t' T# |( c
  188. * 说明                        :        在显存中绘制点$ w- A0 f2 @4 d9 i# I  i; V
  189. *************************************************************************************************************************/
    ! [- h: ?3 c  z. V; D
  190. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    $ `2 @; J, ?2 ?; B5 W: Q. e- O
  191. {0 {. k1 H% b8 E7 }1 L) X8 O  g0 d1 k
  192.         pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;6 ?2 ]/ K0 K+ ~  a
  193. }
    # Q' J0 g* z& x$ G' Y. w9 Y
  194. + r1 j% x- R3 {, p. M8 l) F
  195. . U4 E& b% n+ F0 m9 I" T  }; e' D2 E
  196. /*************************************************************************************************************************4 E& S8 C+ G" m. l" B9 C8 C, V7 [1 G
  197. * 函数                        :        void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)" s. X) j8 n! g
  198. * 功能                        :        24bit色彩GRAM显存画点
    ; T% S+ d2 m, p
  199. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
      L; m& L0 c3 ^  ^! r; J
  200. * 返回                        :        无5 n2 j6 S/ B2 O; }3 o; Q: [) P( v
  201. * 依赖                        :        底层宏定义) u+ v/ L" r3 @+ I3 m
  202. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    6 \2 ?6 @: ~. W4 z% J+ R5 D
  203. * 时间                        :        2019-10-30; _; H' n4 H* |* Y- l7 Q& ]
  204. * 最后修改时间         :         2019-10-309 D) O6 p: E' x9 s7 R3 S
  205. * 说明                        :        在显存中绘制点
    4 e% R  U5 ]1 l) E, _% @4 J2 K! H
  206. *************************************************************************************************************************/
    , ~$ A* ~! _+ U6 h$ h
  207. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)% @& D  ?& w3 p
  208. {
    8 L. q1 k2 E" F, n
  209.         memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);& z: J' f, A- Y6 d6 g
  210. }% d$ g, U- ~% H4 c+ w

  211. ( X* F, S8 k( C# F
  212. ' F* q+ r2 t8 K, C, Z( t, E
  213. /*************************************************************************************************************************. Y! |% A- S; \: Q7 {/ g
  214. * 函数                        :        void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    + w4 e: k5 k( K0 [8 M; |; F" u
  215. * 功能                        :        16bit色彩GRAM显存画点
    5 A! ^. {0 v7 y2 n
  216. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    . a0 W. ]7 Q) h2 {2 V2 X
  217. * 返回                        :        无2 @  @8 J" J: X5 Z/ g, _0 [+ A/ o- x
  218. * 依赖                        :        底层宏定义4 J( _6 |( ^. }2 O/ B
  219. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    8 r: h7 q  b1 T& n2 B: Z6 n
  220. * 时间                        :        2019-10-306 Y' o. j. M' M9 _
  221. * 最后修改时间         :         2019-10-30
    + i5 ?9 m+ _& ~! I# b$ X3 q
  222. * 说明                        :        在显存中绘制点1 n: s. f7 _) h, r$ [
  223. *************************************************************************************************************************/
    , G. Z# B, d0 j3 u0 {0 S
  224. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    5 ]; t. Y; G1 y7 |* l' S
  225. {2 a5 f# ]( O, M
  226.         pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
    " o3 p, M2 M2 `+ ?# @/ f
  227. }
    $ T' C3 V* C  S9 u* R  T
  228. " `, R/ z2 B/ v& [6 X

  229. " O! N$ r) z- R7 W7 n: u8 n

  230. - s% Z) X! ?/ u, P
  231. /*************************************************************************************************************************0 H$ _: s& q( D
  232. * 函数                        :        void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)        
    ' J6 W& ?8 `9 M8 T2 V# q5 Y; _
  233. * 功能                        :        GRAM矩形填充(使用DMA2D)5 T! D# ^. }2 g+ W& W
  234. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色
    - ^8 x- `- \% k
  235. * 返回                        :        无6 w( z. c4 U1 ?: h- z
  236. * 依赖                        :        底层宏定义6 p" J* q* P4 R! Q
  237. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>" A0 a& G+ _4 M" P
  238. * 时间                        :        2019-10-304 t+ m& W7 e2 w- t
  239. * 最后修改时间         :         2019-10-307 [, Q5 r; V, B+ |% Y8 f
  240. * 说明                        :        采用DMA2D实现
    2 Z; T9 R0 z; J1 x0 b- L' I
  241. *************************************************************************************************************************/2 `& w/ i1 D4 B# G8 m5 N& P4 e
  242. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)6 w0 Q$ ?4 n9 _4 ?  ]) Y$ k; F
  243. {
    ' z$ Y/ q3 o0 I5 t% ]  H
  244.         switch(pHandle->ColorMode)
    ' D7 i) ]- E" W9 ~9 R) L% X
  245.         {3 B4 n) V; Q1 B. c4 h
  246.                 case DMA2D_COLOR_ARGB8888 :
    - s& |* T7 g! D  b( R/ J
  247.                 {
    0 ?9 |6 h$ o, `
  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进行单色填充# D0 `  G  Y& U, d0 `8 R
  249.                 }break;
    6 d& y+ g, Y( W
  250.                 case DMA2D_COLOR_RGB888 :
    & e  M! G) e- w# \/ j% B$ q
  251.                 {8 U  q7 E# S- j7 {
  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进行单色填充
    # G" T6 B  [) H
  253.                 }break;
    * K7 Z2 E. r2 C
  254.                 case DMA2D_COLOR_RGB565 :
    1 C( y' H# K- j
  255.                 {) U4 c: x3 Q" M7 k! G
  256.                         DMA2D_FillColorToFGRAM((u32)&pHandle->pGRAM_16bit[(u32)sy * pHandle->Width + sx], ex-sx+1, ey-sy+1, pHandle->Width-(ex-sx+1), DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充
    0 m; m6 v8 @1 V
  257.                 }break;
    $ i  _7 n/ p) g" g$ G8 x
  258.                 default:return;3 I" G# z9 Z5 Z" z; U
  259.         }( }6 N- g7 F: E1 K
  260.         ) y- }7 S* O/ U4 `. F4 S
  261.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                                                                //等待DMA2D传输完成7 ^9 f5 d1 U! B4 L7 b
  262. }) N% J- `- a2 J3 \

  263. & Y+ |# \" H. ]

  264. & w( w& W. @: ]+ I/ T
  265. /*************************************************************************************************************************
    6 u& L; d7 y3 d) X& {% ]: x1 z
  266. * 函数                        :        void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)) F- T+ d% f: Z: j
  267. * 功能                        :        GRAM清屏(使用DMA2D)
    ; }! [* P! |5 t& ~" X, z% i3 z
  268. * 参数                        :        pHandle:GRAM句柄;color:需要填充的颜色0 w+ e# g+ ?4 n4 r  ^  [; `+ M
  269. * 返回                        :        无
    * s0 v6 p+ v: X  i
  270. * 依赖                        :        底层宏定义" @9 h( d8 }; _
  271. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>7 g% h+ r% o( P- L6 o
  272. * 时间                        :        2019-10-30
    0 |$ ^4 l( f) h
  273. * 最后修改时间         :         2019-10-30+ q$ B8 o; |8 a" y
  274. * 说明                        :        采用DMA2D实现
    9 ?/ A1 x1 j  A% {5 U- A! m
  275. *************************************************************************************************************************/
    , r: [7 D; P2 c! P! r4 ?9 _) I
  276. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)4 r* j+ d- y5 c- P. w2 W4 e
  277. {
    4 e$ J0 y0 ^1 v- M! E% z" f2 k
  278.         switch(pHandle->ColorMode)+ I. |: B$ N: X, P, D% Z4 [
  279.         {
    1 H$ c+ _. u! ]8 L
  280.                 case DMA2D_COLOR_ARGB8888 :
    ) [4 L- a% o, s) [  c% X
  281.                 {
    ' l! ~  w/ h. n) ~) R5 h0 s3 K% G
  282.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color);        //DMA2D进行单色填充
    & P( J9 y% Z" `# f
  283.                 }break;* R7 S" w/ b3 ~% P" P. v* n3 A
  284.                 case DMA2D_COLOR_RGB888 :
    4 E7 o! y& L& A' E( s
  285.                 {
    " y) p8 }7 q9 V8 ~' X4 z9 N, v
  286.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color);                //DMA2D进行单色填充. T5 c: O# F) ^; D# S2 m
  287.                 }break;2 @, g6 G/ J7 d1 r- e1 K
  288.                 case DMA2D_COLOR_RGB565 :$ ^- M( z. B! J
  289.                 {
    ) ^- _- M: P6 E( L  a& {. B4 U
  290.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充
    . B. ^+ c- o! }8 p; M8 o! f6 _
  291.                 }break;2 i) z) Q8 F( l$ V3 a
  292.                 default:return;
    ) _7 c& U! p" X5 r' O6 l6 q; l6 u
  293.         }/ _* e% s# c5 o4 H. p& V* R
  294.         SYS_DelayMS(5);, T" H2 k; m3 N1 K
  295.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                //等待DMA2D传输完成
    & k1 `9 p6 J0 h
  296. }" C  |% Y4 a) V1 [& t

  297. & ^2 z% G" ]  `% y3 E/ @# ~

  298. 0 C6 [  {9 o6 q4 S1 h% y& M
  299. /*************************************************************************************************************************
    8 A6 {1 d/ R: r1 o; @
  300. * 函数                        :        void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
    1 ?2 g- g  m3 J
  301.                                                 u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    0 H9 y# z' n0 r2 N) c  q) w6 S; ^
  302. * 功能                        :        GRAM局部拷贝(支持Alpha)- a2 H/ j( I: a" S
  303. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;! o* O" u9 K5 Q4 n: d2 r
  304.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度$ b1 q3 f: Z: g+ q
  305.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    4 E* H1 U' \% X
  306. * 返回                        :        无: r1 z" v( J! S
  307. * 依赖                        :        底层宏定义8 K6 u4 U" H: F; O8 e* `2 C
  308. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>5 c  j. C( l* c! t2 F4 D( \) Y, ]) q
  309. * 时间                        :        2020-02-02: o* o; t; S9 k9 T
  310. * 最后修改时间         :         2020-02-02
    + F/ b/ {- }9 \% K5 T1 [
  311. * 说明                        :        不会检查GRAM大小,请确保GRAM
    3 G1 f! i. c- P
  312. *************************************************************************************************************************/8 p" u+ I$ a8 r% J
  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)# V  g7 P! R2 P" Z* _' M/ G8 t+ k
  314. {
    + ~* w) n2 R( t0 @4 d7 i
  315.         u32 SourceImageAddr;        //源图像地址(通过地址控制开始的X,Y坐标)
    0 z$ i/ Z. `, w( D- u
  316.         u32 DestGRAMAddr;                //目标GRAM地址(通过地址控制开始的X,Y坐标);6 H; |* `2 J* s9 V/ v" L
  317.         u32 PixelByteSize;                //像素字节大小
    # q# A+ |/ ~/ u: S9 @
  318.         ! \8 K3 T, D# }* F1 Q
  319.         if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL)1 S# V5 f& w: h3 f4 z
  320.         {
    % @: j: b( e( K, ]$ V+ C- v! v  U1 h
  321.                 DEBUG("无效的句柄,pDestHandle\r\n");: T% ?+ E2 [  {" b9 y( e/ D0 E
  322.                 return;6 }0 R0 ~( D! y9 \! j1 X
  323.         }- L: V- s- D" [, j; r8 c
  324.         if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL)) c, \  V- y. K/ b& J0 T
  325.         {/ ~! D( X5 d6 F4 a
  326.                 DEBUG("无效的句柄,pSourceHandle\r\n");  p, u7 `8 }( Y1 A+ m) Z0 m
  327.                 return;7 D, y. q1 Y* c4 ~# |7 e) Y* B
  328.         }* t9 }( d" c& C0 e: D7 b1 v5 k, e3 q0 l
  329.         //源图像地址(通过地址控制开始的X,Y坐标) 计算# N( f  a+ L; P* f0 C% [! A
  330.         switch(pSourceHandle->ColorMode)9 m( d& x6 T  U( V3 ^, @9 n
  331.         {9 S6 m7 M, V0 W& @* d
  332.                 case DMA2D_COLOR_ARGB8888 :; t$ f4 D2 {6 h; x
  333.                 {7 G4 Z2 g1 ]5 r+ G1 X5 n' ]$ O
  334.                         PixelByteSize = 4;& n* y  a5 E2 B
  335.                 }break;- ?2 j& X2 \- ~% \6 ?
  336.                 case DMA2D_COLOR_RGB888 :
    0 i, o4 h/ {0 ^7 V- n' _& W
  337.                 {) b- Z3 B  M9 V9 }; {1 K
  338.                         PixelByteSize = 3;
    / \+ n7 \4 n; M" {! }' T* ^# ]
  339.                 }break;
    * S6 M* x3 x# t) h& i
  340.                 default: //DMA2D_COLOR_RGB565
    . Q3 j: s2 ^$ _$ Q& t
  341.                 {8 v% T' H" I" i; i
  342.                         PixelByteSize = 2;1 C7 n$ f7 K' q- U9 Q/ j& E! r8 X: u
  343.                 }break;, V4 b5 n1 b% q, j3 a) C5 `0 ^
  344.         }$ v6 k. d5 r. f0 U4 i1 K8 a' Y) d9 H, P
  345.         SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize;        //计算源开始地址
    % I$ P0 ?5 y. S( V2 ^' \9 h7 S6 p
  346.         / v% y2 v+ [: s  x
  347.         //目标图像地址(通过地址控制开始的X,Y坐标) 计算
    % }% ^, l" ]+ I
  348.         switch(pDestHandle->ColorMode)2 T: e9 {( k/ L/ P3 {1 Q
  349.         {  J' R3 y+ v% \
  350.                 case DMA2D_COLOR_ARGB8888 :* I0 v+ o+ y" q: f6 [/ e# H
  351.                 {' h" @6 z5 o% M8 R
  352.                         PixelByteSize = 4;9 y  Y8 s) O3 O9 v& p
  353.                 }break;0 }9 ?  S* {3 Z5 ]9 X1 x4 Z
  354.                 case DMA2D_COLOR_RGB888 :$ F: G* N2 x% G$ m0 _# c
  355.                 {: X& {# }$ q4 i! g6 A# q6 z
  356.                         PixelByteSize = 3;
    7 @. y! J+ D9 S& \6 E, H9 Q
  357.                 }break;* g( q0 Y+ {/ S5 u; c% `% d0 s
  358.                 default: //DMA2D_COLOR_RGB565
    6 p; U  M$ ?- a  o8 O% X' u4 c  C
  359.                 {
      h; w+ t. D4 M
  360.                         PixelByteSize = 2;
    ' i+ _1 o! ]3 F- W5 G" b
  361.                 }break;" b( s& j+ R" |  ]; F
  362.         }5 V8 R; H/ K8 @& W0 a: m
  363.         DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize;        //计算目标开始地址" y# `2 \5 r# {/ i
  364.         //进行拷贝1 t% Z( l. K! f) h( U) t9 D
  365.         DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode,
    / L/ y% R4 X" g+ M6 W( S
  366.                 pDestHandle->ColorMode, AlphaMode, Alpha);                                                                                                        //DMA2D进行矩形图形填充(会执行像素格式转换)
    , x' c/ w. X2 N& N7 a; c6 s% O
  367.         DMA2D_WaitTransferComplete(200);                                                                                                                                //等待DMA2D传输完成2 L+ x* I+ {1 @9 M+ z
  368. }
    : Y. V. @4 O, J, G& v8 u! d/ O

  369. 9 W6 ~! Y* K5 L! Q' K
  370. /*************************************************************************************************************************
    3 r( H. k7 I2 c* M5 L4 A. m! M
  371. * 函数                        :        void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
    6 j+ Z4 o9 \" L" V4 ]" @/ g- M
  372.                                                 u16 Height)
    1 G9 J# |) b: Q9 k
  373. * 功能                        :        GRAM局部拷贝(不支持Alpha)# u5 n2 h; x4 ?0 A: K
  374. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;; H7 V& o4 O  K7 y( g3 u
  375.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度1 M- p3 r, k  d" V& b
  376. * 返回                        :        无
    4 E/ J0 L& O7 y& @9 A. ?0 o
  377. * 依赖                        :        底层宏定义, s* ?) j: o; i  q
  378. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 G8 p" O' X0 d: A/ W
  379. * 时间                        :        2020-02-02- }8 O! v/ F( z0 j: B, W8 l- x
  380. * 最后修改时间         :         2020-02-02; J6 B2 l- V- C$ g( ]/ u1 ~' A  }
  381. * 说明                        :        不会检查GRAM大小,请确保GRAM
    ' n9 m' d) q" |; }
  382. *************************************************************************************************************************/, o. d4 I- P0 j# V. M: L2 B3 g0 Y
  383. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)
    ! ~( @* x) }' U5 E7 \$ G
  384. {
    ( A3 V8 s/ N$ D3 `$ J- E6 T
  385.         GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);( p4 U/ m& B5 E% }: ~' m
  386. }
复制代码

/ r  F% A  f. o0 @: L8 C9 u, N5 `# `
  1. /*************************************************************************************************************
    6 ]: \; ~  x5 x  w0 o7 m
  2. * 文件名                :        DMA2D_GRAM.h
    ; l; X: \0 H+ L* ?5 {
  3. * 功能                        :        GRAM相关操作) e0 {2 W  i8 z3 a7 b3 X; Q
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    4 Y& T6 z/ p. m( v1 s+ r' P
  5. * 创建时间                :        2019-10-30, @+ u# P) Y( m) V6 D4 A0 M
  6. * 最后修改时间        :        2019-10-30
    0 l6 s7 T* f4 B% e* W: b) N% K) t
  7. * 详细:                        显存相关操作接口: {" i5 K' y" h. D# [. ~" _
  8. *************************************************************************************************************/        
      n& u/ |5 a+ e2 m$ ?
  9. #ifndef __DMA2D_GRAM_H_
    5 h2 r. n) \) ^
  10. #define        __DMA2D_GRAM_H_           ( v4 Y3 M2 T( g4 j
  11. #include "system.h"
    $ g& F5 X; K* |2 N. Z1 v- L" z( r
  12. #include "DMA2D.h"2 `- _  T4 `6 j7 ~0 q1 c
  13. #include "SYSMalloc.h"0 ?2 T3 G. o$ |7 g, H7 G& [* y. S

  14. # L' s! E% Q. W
  15. //初始化状态id
    6 Q8 y% Q! o: E/ s! Z
  16. #define DMA_INIT_OK                0x1234423        //初始化成功(不可以释放)5 G7 C, b* I8 Z3 L1 M
  17. #define DMA_CREATE_OK        0x3643423        //创建成功(可以释放): P% {1 f9 [, Y9 i) R0 B

  18. 5 g' `. Y; _# e& B3 M+ A- a0 Q
  19. //颜色模式
    1 ?8 t4 X5 D. ]( _9 [7 J
  20. typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;
    7 J& M7 V$ |: y  p  w& O

  21. 5 ~1 O1 S6 f! y' P! n3 B& {; n
  22. 9 q- f7 q: X# e  Q( B* a, z7 C0 M
  23. //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告)5 X$ f6 R  H( S# t6 Y; K
  24. typedef struct& f* E' }9 x, i5 T& q1 }) L2 _. I  U
  25. {
    % d; ?4 P9 i0 [
  26.         void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //绘点函数
    ) x9 c" q, e5 U0 U
  27.         void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                        //填充
    5 Z" i! W2 x& e. f
  28.         void (*pClear)(void *pHandle, u32 color);                                                                                //清屏
    2 T2 G" ]6 z( l. s" F! p
  29. }GDI_BasicInterface;! U; {; ^! f) W
  30. 7 t- y  f* H" X& V1 M

  31. ( z# Q, n4 z8 q0 y
  32. //GRAM相关接口-16bit
    2 U7 `. j, V3 _, @
  33. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;% L" v- t' \. z/ X" ~% ^; z" d5 v1 s. v
  34. //GRAM相关接口-24bit
    ) J- q7 h% w: m$ e! a2 A* `: U9 ^' H
  35. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;0 ]0 H: v5 J1 ^) J, a! F& S! ^! O
  36. //GRAM相关接口-32bit9 j1 _8 C0 i' J9 H( |5 ]- {" @3 g
  37. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;, @! w5 ?) u6 N$ Y7 D
  38. 1 \' ~4 F# [, E9 [6 i3 A
  39. //所需的内存申请接口
    + L" \3 J* D/ [2 q+ d% q/ h; e
  40. __inline void *GRAM_malloc(u32 size)3 D0 r% v4 Q* ~1 t
  41. {
    8 Q$ u0 c: |% F9 }% |
  42.         return mymalloc(SRAMEX, size);                        //内存分配(外部调用)-使用外部SRAM: L: J3 t2 L$ w$ F' i1 Q
  43. }
      F1 ~3 }' [: P; I/ m. u! N& }  ]
  44. / o. e; b( p  c
  45. //所需的内存释放接口
      ~8 C2 j% w9 b2 Q
  46. __inline void GRAM_free(void *ptr)
    7 {' I9 G' ?. _/ w1 l" I2 U& K& e
  47. {
    1 ~+ s4 X7 h. S% W1 n( s) b" O+ |
  48.         myfree(SRAMEX, ptr);                                        //使用外部SRAM. X: C. x- V1 q  x0 G7 P
  49. }) ]" d$ w/ m; z

  50. 6 u* ?' }' g& u" A; i

  51. - B& S# K/ z' M# p
  52. //显存句柄
    ( r. i/ b( K" Z4 x! y" u' _
  53. typedef struct) _6 X& [! n9 I: y- H; C1 [
  54. {. u4 g5 v! Z- g& _+ q* e
  55.         u32 InitStatusId;                                                                //初始化状态id
    8 }7 T: f3 k8 ~. [3 J+ }- x
  56.         u32 GRAM_Addr;                                                                        //GRAM地址
      F- y- q7 M; y; A
  57.         DMA2D_COLOR_MODE ColorMode;                                                //GRAM显存像素格式
    - p: \! C8 U; x. B; M, G: i
  58.         u16 Width;                                                                                //GRAM宽度# x, A- R1 v. d1 H$ O3 w/ ?; E; H
  59.         u16 Height;                                                                                //GRAM高度
    $ }& l/ r# B! c/ x- U
  60.         u32 *pGRAM_32bit;                                                                //32bit颜色模式下显存指针
    ) h9 @( Q+ }  p% l
  61.         u8 *pGRAM_24bit;                                                                //24bit颜色模式下显存指针( M/ W0 X1 Z1 o$ c
  62.         u16 *pGRAM_16bit;                                                                //16bit颜色模式下显存指针
    1 c. }0 e# |3 l
  63.         const GDI_BasicInterface *pBasicInterface;                //底层GDI接口) Q0 a$ I& O) l
  64. }GRAM_HANDLE;
    2 I) g' `& ]6 H% O

  65. * R. [. N: `. W" q2 y
  66. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);        //GRAM句柄初始化(不会申请内存)
    8 s, n7 V$ u) }& _1 j4 V: h
  67. void GRAM_Delete(GRAM_HANDLE *pHandle);                                                                                                                                        //删除一个GRAM(会释放内存)& e$ K. t8 a/ x1 G+ l! s7 U
  68. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                                                        //GRAM矩形填充(使用DMA2D)' B/ g/ C2 j' M) M
  69. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color);                                                                                                                //GRAM清屏(使用DMA2D)
    9 v/ D( _9 M0 O4 h& f
  70. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);                                                        //创建一个GRAM(会申请内存)0 D# [8 i3 _; P  r- R8 c0 s8 X! h
  71. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, 1 t- o4 N! p3 A/ ]$ E
  72.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);                        //GRAM局部拷贝(支持Alpha)4 y. R( J0 i/ c+ H
  73. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, # R2 i& J6 l) _
  74.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height);                                                                                                        //GRAM局部拷贝(不支持Alpha)
    2 O* {/ A- y7 i) V$ @! u. A

  75. / u+ T0 g9 d3 d
  76. #endif //__DMA2D_GRAM_H_
复制代码
  1. /*************************************************************************************************************$ L/ n7 e8 o# e4 D! O
  2. * 文件名                :        GDI.c0 e4 ^3 ]! J) L+ ~
  3. * 功能                        :        图形设备接口(Graphics Device Interface)3 ~/ s6 z; P6 |% H3 X
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>2 O4 O' P" A3 b! q" m( B
  5. * 创建时间                :        2019-11-02
    ( L6 M' F) U9 \* M
  6. * 最后修改时间        :        2020-02-021 d9 s( t, X( E8 g! A8 {0 F
  7. * 详细                        :        STM32F7 图形设备接口% w2 b/ `( j" i7 t
  8. *************************************************************************************************************// R/ s$ u9 z4 ~# V$ u  o
  9. #include "system.h"& }: ]) n3 L% k/ Y* @
  10. #include "DMA2D.h"
      V+ S5 x+ w& H6 x
  11. #include "stm32f7_ltdc.h"
    ' Z6 ]; o7 V  `+ l/ S0 H% B
  12. #include "DMA2D_GRAM.h"
    0 f1 J" v8 x. |; S* `4 O2 o; ?7 E& ]
  13. #include "GDI.h"
    6 J6 d7 G2 P& l9 ~1 e  K; }& v; F1 t% F
  14. - g9 n) S( d& ?* v
  15. //显示器Layer1 GRAM定义) H7 @; j& J2 x' i4 \
  16. const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle = ( Y8 t, A5 F9 `
  17. {% q1 Y% I! Q" W) p( c
  18.         DMA_INIT_OK,
    6 `% _8 c8 x6 J! R5 z7 [
  19.         (u32) &g_LTDC_BUFF_RGB888[0],        //GRAM地址8 U3 G5 D8 ~& f! S% H: }0 o( }6 J; B
  20.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    , o0 t4 g! q5 p5 ]- ?% f* k
  21.         LTDC_WIDTH,                                                //GRAM宽度* o: O" Q& @' j
  22.         LTDC_HEIGHT,                                        //GRAM高度
    3 ?0 u1 o7 Z$ ?) i
  23.         (u32 *)&g_LTDC_BUFF_RGB888[0],        //32bit颜色模式下显存指针
    6 b5 b, e! D& J
  24.         (u8 *)&g_LTDC_BUFF_RGB888[0],        //24bit颜色模式下显存指针7 A# w% k6 q+ Q
  25.         (u16 *)&g_LTDC_BUFF_RGB888[0],        //16bit颜色模式下显存指针
    / t: W, B' L, d. r# F
  26.         &cg_GDI_GRAM_Interface_32bit,
    * M* P4 a" d$ {& `
  27.         2 V0 E+ y% f+ ?" b) W4 |# f
  28. };! j- k, t( P4 W) U0 v1 Q
  29. 0 v, h' R& ?1 Z, x' Z
  30. //显示器Layer2 GRAM定义$ I# o' P7 N' D. m9 S! P6 }
  31. const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle = $ n0 v0 E$ J, \4 j# {
  32. {$ l) {7 L5 ]; m- s8 l
  33.         DMA_INIT_OK,4 N9 c$ {: ^: W' }3 Y" r' j
  34.         (u32) &g_LTDC_BUFF_RGB888[1],        //GRAM地址/ _# `; F7 x  t# M$ p7 Q
  35.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    % }9 L8 x9 @& U; x+ l  |( N
  36.         LTDC_WIDTH,                                                //GRAM宽度3 n1 g; [, a1 a3 \  C+ O0 d
  37.         LTDC_HEIGHT,                                        //GRAM高度
    ) i/ Z/ h$ f, Y5 b2 P0 P/ d* U, q4 v/ P
  38.         (u32 *)&g_LTDC_BUFF_RGB888[1],        //32bit颜色模式下显存指针
      ~$ Q' d3 \. t' u9 P
  39.         (u8 *)&g_LTDC_BUFF_RGB888[1],        //24bit颜色模式下显存指针
    2 q6 H5 M+ B  L0 m& G3 D
  40.         (u16 *)&g_LTDC_BUFF_RGB888[1],        //16bit颜色模式下显存指针
    / b. C3 l7 H/ z/ a! ?- S6 U
  41.         &cg_GDI_GRAM_Interface_32bit,+ l% H8 v, k4 A+ S5 r9 X: @
  42. };  i+ [4 S- z, r$ u
  43. - B6 `$ w- H  N

  44. # \' U! P2 X) }5 N6 n8 x: T
  45. /*************************************************************************************************************************% B2 C) G. L1 E# w  ^, A2 n" l
  46. * 函数                        :        void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)( q: Z) ~8 @, {# f4 _4 @! i6 L
  47. * 功能                        :        绘制空心圆
    ; p( ^# H1 x. U8 F
  48. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色, n; y% d6 a# D1 u0 y0 D
  49. * 返回                        :        无8 Q/ a9 z1 s- [/ A9 c
  50. * 依赖                        :        画点函数
    & t2 L0 ~) u8 q3 t1 d( `/ w
  51. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>  V% h" [4 K3 @; v
  52. * 时间                        :        2011-09-20
    - \1 e) y1 K; E7 ^
  53. * 最后修改时间         :         2019-11-02( A$ u2 f8 h3 I: d/ y
  54. * 说明                        :         无5 h$ Z4 m) P2 ~" C
  55. *************************************************************************************************************************/* H4 q' l' _3 S( b4 m3 v2 P, {- d: I
  56. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
    5 g3 R' O5 H1 B0 a
  57. {7 c$ r' |) w- I2 K+ h1 I
  58.         int a = 0,b = Radius;1 C) p; t  G4 a1 B" R  x# a% R
  59.         int di;
    , g( m' c; s' G' b  E
  60.         di = 3 -(Radius << 1);           //判断下个点位置的标志) H) V4 P/ k: h4 E' y

  61. 4 |# k* r& C3 u" M8 N
  62. #if(GDI_PARAMETER_CHECK)                        //参数检查/ K, u1 N1 i# g
  63.         while(pHandle==NULL)
    2 `9 w; y6 X  r8 V0 ^+ w5 k2 G- T
  64.         {
    ; \" Z8 w4 Q; k5 ?6 U+ |
  65.                 DEBUG("无效的句柄 pHandle\r\n");) v" X7 s. z% z# z+ i' m1 v
  66.                 SYS_DelayMS(1000);# `* ^, D- m* w$ s( [
  67.         }        
    0 s$ A  U# o+ p; m7 L! {3 I
  68. #endif //GDI_PARAMETER_CHECK
    ; t2 F: E1 ?* Y& @- A6 [
  69.         
    0 k8 g+ t& r* U# E3 Q2 }
  70.         while(a <= b)
    4 N- J+ k2 a5 x; O# r6 O& P! d( K
  71.         {/ h- f) w. U- u9 b. L
  72.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //3           
    " ]( W! v9 E! D1 x9 p
  73.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color);             //0           2 R: s4 O6 V# _" n; H- {
  74.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color);             //1       ; n% R0 l" |; p' z0 y
  75.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //7           
    ; F" U4 N- m4 V# y
  76.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color);             //2             ! H) @% K: O% o4 V: O& m
  77.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color);             //4               2 Q( H1 T3 n- _3 K" H
  78.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color);             //5  v5 Q! |4 o# H" e# l2 g* E* c
  79.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color);             //6
    - V6 q/ [( Y/ u! f* ]% P
  80.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);             9 u3 d# N# p3 m" L2 H( M
  81.                 a ++;
    ! i2 |4 E# J, n# u  X; V
  82.                 //使用Bresenham算法画圆     + J0 O2 s& {) S& w' X) l" B0 U
  83.                 if(di<0)1 j7 {6 B1 Y$ O# v
  84.                         di += 4 * a + 6;                                                                                     $ t3 T5 q, k  F; C! J& N8 y; A
  85.                 else
    , E5 I2 d1 N( L; Z) L
  86.                 {
    $ x5 K: `8 u- c; n. C
  87.                         di += 10 + 4 * (a - b);   0 T3 V  n$ t, T6 l# P( e3 ?- R
  88.                         b --;
    % G. R8 ^* |( G) E% a
  89.                 }                                                                                    
    : P# q, Z7 P) `9 q$ a% p
  90.         }                                                                                  ! @) M+ o8 j7 E, v+ {; x2 a! v
  91. }
    5 [) P  S' a0 G6 Q3 i% C
  92.                                                                                                                                           
    ! w/ Q) E8 N9 R. P

  93. 7 q, N; P7 Q" B7 n
  94. /*************************************************************************************************************************9 E3 o3 g% n1 {% P+ P/ h0 U
  95. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)4 ]- [( l2 G1 h
  96. * 功能                        :        绘制直线(可以倾斜)
    8 i$ w4 \" o/ c0 @
  97. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色
    7 K. ?- k2 M3 H
  98. * 返回                        :        无
    7 U& n7 E3 e2 O& c  E' f& U  i& G4 g5 h
  99. * 依赖                        :        画点函数
    3 W, t' l  T% }+ L! P0 b
  100. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ( p7 t# w; m& C( ^/ r
  101. * 时间                        :        2011-09-20) b5 G. h# y% j& b# ~& r
  102. * 最后修改时间         :         2019-11-02; M" s5 k8 w1 z& g
  103. * 说明                        :         无/ w! \8 h1 K5 P7 ?& I+ ?
  104. *************************************************************************************************************************/
    4 p; r0 \- L% D( p9 U5 u& S
  105. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)& Z( R( |8 n+ j  ^  Q9 i- u) a
  106. {
    ) k3 x5 s. B$ i& ^- d
  107.         u16 t;
    7 \/ u) k( B2 P: M& W1 S
  108.         int xerr=0,yerr=0,delta_x,delta_y,distance;
    0 J! O  J% A0 B, ?
  109.         int incx,incy,uRow,uCol;3 j8 u) B+ M0 C7 ]- h
  110.         
    0 C% y' }7 ^) v
  111. #if(GDI_PARAMETER_CHECK)                        //参数检查
    3 H$ }$ U' F, f: x% a
  112.         while(pHandle==NULL)  F; s6 k( I2 I7 q: ?
  113.         {0 p' [. A3 |+ X1 e) f# {7 w- S
  114.                 DEBUG("无效的句柄 pHandle\r\n");  P' _, y) U% L6 ?7 E
  115.                 SYS_DelayMS(1000);  E/ e2 ^% u; w0 `* A" V6 _% `; ?2 T
  116.         }        ' i- }! m# S: L) O6 T/ u% t: B
  117. #endif //GDI_PARAMETER_CHECK        
    ; ]" b3 v; B8 z1 U  Y" V7 O9 s
  118.         . q; V2 p8 L1 O- y
  119.         delta_x=ex-sx; //计算坐标增量
    : h8 C( _. C9 L5 o5 G: K" C7 C
  120.         delta_y=ey-sy; " w9 C; q6 }: W& W  I$ p1 D6 ~2 U
  121.         uRow=sx; / P6 N; W' M3 W8 U' A' _8 y% n$ x: Z
  122.         uCol=sy; ! a) M8 ]2 k) u8 d! Z& m
  123.         if(delta_x>0)incx=1; //设置单步方向 * ^+ r; A$ O# n  F
  124.         else if(delta_x==0)incx=0;//垂直线 3 O+ G. W; E2 B( v( e$ `; V& Q
  125.         else {incx=-1;delta_x=-delta_x;}
    - F- ]$ D6 i# {- f! s1 ~$ j4 t; o( i
  126.         if(delta_y>0)incy=1; + Z5 R6 \- e% d6 \) @
  127.         else if(delta_y==0)incy=0;//水平线 + _: z3 h9 N- t- j! R/ _  T
  128.         else{incy=-1;delta_y=-delta_y;}
    * r. i3 t7 `! U. R8 W' A& j* R  M
  129.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
    " S6 V: X  \7 ~  M& \' y& O* [
  130.         else distance=delta_y; 0 m$ |. p, w% Q
  131.         for(t=0;t<=distance+1;t++ )//画线输出 5 {4 D' W& p6 T9 u
  132.         {  ( B* Y9 W- B( v8 E
  133.                 pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点 ! \+ y8 [- d& \2 u$ l/ K$ m& r
  134.                 xerr+=delta_x ; 9 I0 A5 A# d" \2 F2 `
  135.                 yerr+=delta_y ;                                                                                                 7 S/ n/ f& S, h
  136.                 if(xerr>distance) 4 i1 v6 `6 v) V; p5 [
  137.                 {
    ; r! w: D3 S: J+ o9 Z- Z
  138.                         xerr-=distance;
    + n1 X8 m6 x9 Z6 U
  139.                         uRow+=incx;
    : e8 R5 H+ p9 m) D9 _9 e- U
  140.                 } 3 v, |7 l" E; ?2 `
  141.                 if(yerr>distance)
    ; h4 I6 U5 d  m/ J& [# ]" ?
  142.                 {
    5 ~' y$ N' y& y# v0 R( _7 O/ W
  143.                         yerr-=distance; - P9 r# C/ l) S" t0 C9 C( Y
  144.                         uCol+=incy;
    . N2 Z8 P+ ?- U, {. Y' C
  145.                 } ' U' j6 O/ ?0 w
  146.         }  & K! P. k0 ~) u% ?  Z
  147. }
    ' a; u- s: ~; i6 u! V3 q/ z

  148. 9 u4 r5 l8 @; R0 s
  149. $ s4 s! G5 `6 g8 S" Y
  150. /*************************************************************************************************************************3 ?' W. ?4 r, X& _
  151. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)8 H1 U' ^  d7 S# d  j
  152. * 功能                        :        在指定位置画一个矩形; K& ]/ `+ {! k* P9 _# ]
  153. * 参数                        :        pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色8 k8 z) v( D3 ^1 Y
  154. * 返回                        :        无
    6 E6 p( B+ K9 Z
  155. * 依赖                        :        画线函数
    * ^" z" j( ]  S, R* ^0 V* F5 e' E
  156. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    8 F8 t* O0 n3 P5 N7 P/ R  f& ]2 B- P
  157. * 时间                        :        2011-09-20
    ) _7 {1 N1 h* g' O0 ^7 F
  158. * 最后修改时间         :         2019-11-02
    , H8 \* D7 f- ~% ^  n6 Q" `% X0 a% X- e
  159. * 说明                        :         无+ N0 E3 P; m$ d  S/ [; S( Q# k
  160. *************************************************************************************************************************/
    0 P4 {- Z* \& ^5 N9 G/ N' a4 [
  161. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)3 {: N, H" ]; e  U/ W7 T+ u
  162. {' H+ Z/ d5 P, d* \
  163.         
    : m9 |6 R' W+ w% m
  164. #if(GDI_PARAMETER_CHECK)                        //参数检查; \$ b& L6 |5 p4 g. Z7 U
  165.         while(pHandle==NULL)
    / X) K' U5 U/ w2 Z* Z
  166.         {
    0 d5 e- J+ A5 t) G/ }" D
  167.                 DEBUG("无效的句柄 pHandle\r\n");1 b) W9 m3 M- `2 F2 v8 G
  168.                 SYS_DelayMS(1000);3 ]+ ?" R/ d9 J- o. q2 ?' J% B
  169.         }        : D: k' U2 G8 E* {+ p% }& Z
  170. #endif //GDI_PARAMETER_CHECK* T; x& Y9 z* G# c
  171.         
    * W) P! R: ?; ?( K
  172.         GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);+ p, J3 s4 N, C  E7 Q6 S1 P% _8 J
  173.         GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);
    ; g9 Z% t( E! Y- z' A; O7 U4 F- o
  174.         GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);3 L( B, g6 A4 M- w8 t1 T  v
  175.         GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);8 v6 I6 T. y1 A' J
  176. }                                                                           ' k) ~" X+ P! Q! T8 d$ T8 f9 b* O2 G
  177. * c: Q0 P& P, V7 J' i$ ]! S
  178. 5 D$ N. P; @# H" A: o  K
  179. /*************************************************************************************************************************) }3 D' W6 I" [9 O/ n, f
  180. * 函数                        :        void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    + x# C/ z- Q5 i' L- J2 }8 T0 f
  181. * 功能                        :        画一个2*2的大点/ e7 v- ^3 v* C3 d( a
  182. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色7 O% w6 M+ B0 ?# T
  183. * 返回                        :        无
    * }6 P3 ?# [, z
  184. * 依赖                        :        画点函数
    $ t$ q4 g* N! J8 n, `8 y# @4 W
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>6 Y9 ^0 ~3 f8 s9 V9 k6 R
  186. * 时间                        :        2011-09-207 Q, H6 y4 m$ _3 `$ }! C3 u
  187. * 最后修改时间         :         2019-11-02
    7 m) I. x- [- G2 D; G* N
  188. * 说明                        :         无
    : \) S7 A( ?% q' p
  189. *************************************************************************************************************************/! q7 t. k/ [- m' i
  190. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)9 P9 B% A" U$ C' u( T) E* m1 u
  191. {        
    % s1 ~" I( g* g) b  a
  192. #if(GDI_PARAMETER_CHECK)                        //参数检查' G9 ]+ v0 g. N5 W3 W/ l8 @3 y
  193.         while(pHandle==NULL)' M* ~: h) Z2 c$ p9 o
  194.         {
    # c& Q6 k1 P$ U: C. H
  195.                 DEBUG("无效的句柄 pHandle\r\n");. T3 R5 z6 w2 n0 K
  196.                 SYS_DelayMS(1000);0 _% J' d9 A/ Y9 C
  197.         }        4 \4 ?6 p1 d8 f  V! @7 a
  198. #endif //GDI_PARAMETER_CHECK0 {4 i4 F3 }1 @/ j3 z
  199.         
    ( z4 a, R* T. H, v& |" Y
  200.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                //中心点
    - `5 Z& T8 ^: ]% W. i
  201.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);
    % R' a6 N$ \3 X# ^
  202.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);' R) P$ J- E" T" p, U
  203.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color);                           2 B) K4 b* W& X2 L: v5 K8 S. Z/ _
  204. }        
复制代码

! @+ x6 v+ `& C* Y) d! I+ H
, Q+ r4 U+ |0 X! Y/ x, V) k
  1. /*************************************************************************************************************+ Y5 N7 n. `; e
  2. * 文件名                :        GDI.h. D- J% ]5 `' o- y0 J
  3. * 功能                        :        图形设备接口(Graphics Device Interface)
    * E7 R# P2 l4 M  w
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ! O/ m0 n$ C! B( o0 P; t" w6 }- [2 x
  5. * 创建时间                :        2019-11-020 }, g* s5 R! M( ?' _# h
  6. * 最后修改时间        :        2020-02-02  ?1 B0 Y. w9 H9 |" R
  7. * 详细                        :        STM32F7 图形设备接口6 Y2 {/ g7 [4 A' c3 D" A: k
  8. *************************************************************************************************************/9 C3 @! h6 |/ Q9 o7 C5 t' j* G
  9. #ifndef _GDI_H_
    7 V4 b, u3 t; c; V8 b' R" ~
  10. #define _GDI_H_6 a$ S2 }7 m  R) E* D1 p
  11. #include "system.h"2 u$ G# z  f8 H" T$ c
  12. #include "DMA2D_GRAM.h"
    $ z2 Z% ~& x9 i+ [2 l
  13. 9 M3 M4 ^0 n$ N5 E9 I. O( g
  14. #define GDI_PARAMETER_CHECK                1        //参数检查-主要检查指针: Q4 i  ]1 k* e4 D% y( y" E
  15. #define GDI_DEBUG                                1        //调试输出
    % C- J: u, G6 R1 v7 h
  16. ! ]* t2 R) K2 q/ A1 _% H7 }
  17. #if GDI_DEBUG
    + [; D( O1 _9 g& v
  18.         #define GDI_debug(format,...)        uart_printf(format,##__VA_ARGS__)
    ! l( g( z4 j1 m3 R; o' R& n
  19. #else4 j6 ~# q' ]! g+ U* Q2 Y
  20.         #define GDI_debug(format,...)        /\  r) Z" p: L" i7 L
  21. /# ?; P- b' I1 L& `( s$ A6 ?0 U
  22. #endif        //GDI_DEBUG# H  M$ ~* f# o: k7 k9 y- t9 F

  23. 4 \+ `, U$ w; j; n* c# t
  24. 5 T+ u; ]& D: u6 O

  25.   r, {9 X' S7 O2 a
  26. extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle;        //显示器Layer1 GRAM定义  s! {$ P8 A+ {
  27. extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle;         //显示器Layer2 GRAM定义, K! W8 d2 T6 d% {4 T
  28.         
    , e5 e+ k# ?6 ^/ o5 L1 O
  29. #define LTDC_Layer1_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle)        //显示器GRAM 1
    + V, ], P# U; g
  30. #define LTDC_Layer2_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle)        //显示器GRAM 2/ @0 a$ O/ J- K

  31. 4 @/ ]$ O& I4 Q+ s
  32. //GDI相关API+ V2 r7 o0 x  p1 U; x
  33. __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
      L- u% \9 x% B5 [& B/ M7 I& |
  34. {        
      f. m/ V& n6 w) t8 }/ o$ N
  35.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                                                //画点
    + R" U# H; e1 [5 t# ~
  36. }        
    # B3 X2 |( h; {1 P1 @- Y9 ]- Q
  37. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color);                        //绘制空心圆
    3 `4 [! Z) j. W) |- b  s
  38. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color);                        //绘制直线(可以倾斜)
    0 n, D2 V- T4 H% l, n
  39. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color);                //在指定位置画一个矩形3 r: @2 ~# B: v7 N
  40. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //画一个2*2的大点+ D* ^' [9 ^/ u: j1 D

  41. ( E# ?( S% H% k9 |- f0 _
  42. + |& [8 x) M) t7 w
  43. #endif /*_GDI_H_*/
复制代码

1 w: C/ x  T* A! n: m测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。
+ f: S8 s% }# Y- B% |/ K- X" k* Z7 r( y. L1 I
  1. FIL *pFile;6 K0 f3 \" g9 w' @! m# A* |& M" |
  2.                 FILE_ERROR mError;6 z9 E) ~! L- O1 ~6 M. G
  3.                 GRAM_HANDLE *pGramHandle;
    ; p: u  C  P. O! H  S
  4.                 1 q1 Z8 H1 i1 A
  5.                 pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565);        //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB565
    8 i$ A9 |+ b& ^
  6.                 if(pGramHandle != NULL)
    & n6 a6 Q" d" o4 j! s
  7.                 {
    6 R2 ?, X9 b9 y' ~/ X1 Y
  8.                         GRAM_Clear(pGramHandle, 0xff00);                                                //清除显存,防止读取失败了还是现实上一次的图片$ I/ O0 m2 @9 {. w: U
  9.                         uart_printf("[OK]GRAM初始化成功\r\n");) w7 M# B0 o; ~3 E% s
  10.                         pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);
    # j4 V" _& L1 R* S, U$ }
  11.                         if(pFile != NULL)+ _( E- [. y+ j. J. A' \
  12.                         {4 v  e# `7 V$ I# g1 Q
  13.                                 uart_printf("[OK]打开文件成功\r\n");
    & v  Z# H/ L) s; h! s# L) y  P2 [
  14.                                 if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中+ @. h, B& U9 K7 ?6 P
  15.                                 {
    ; a$ }- D4 F$ c& Q2 p+ X% U
  16.                                         uart_printf("[OK]读取文件成功\r\n");
    # J4 o  R/ s0 G8 M' b# c
  17.                                 }
    9 P- u  F9 W8 l7 H) L
  18.                                 else8 y: b" B# J- R6 A% U7 s0 L: Y
  19.                                 {0 I/ `! R) j2 |
  20.                                         uart_printf("读取文件错误:%d\r\n", mError);, @' w+ H& J$ ]4 m6 r
  21.                                 }( K  c+ i# o0 c  U$ Q
  22.                         }# M% ~: [  `. U% F# m: y; A
  23.                         else
    . ~  \5 v: m( @! T8 S
  24.                         {
    , M. Y4 t( [! C+ Q/ N
  25.                                 uart_printf("打开文件错误:%d\r\n", mError);
    + n. J9 X1 O+ [6 T" k0 J( @
  26.                         }
      ?* w2 X$ Q0 r! N; x8 Y7 |
  27.                         //将显存拷贝到屏幕中
    . p. A" i- r3 M. w1 n& J
  28.                         GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240);                        //GRAM局部拷贝
    - A) c( F: J% \
  29.                 }
复制代码
  \) d. x3 e1 @( Z  H! z3 }" p

% I) F/ ~" N) Y) w/ w$ C% a! x- C& R7 e
收藏 评论0 发布时间:2021-12-16 21:00

举报

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