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

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

[复制链接]
STMCU小助手 发布时间:2021-12-16 21:00
DMA2D可以加快图像填充,并且支持像素格式转换。/ D+ C6 E0 g( N/ c8 @' ?% `
" o# U: M$ y& S# {* s  J
  1. /*************************************************************************************************************
    1 w/ ~. H5 J2 E6 A% \" L/ A
  2. * 文件名                :        dma2d.c$ H( O8 P( h* X: V  B
  3. * 功能                        :        STM32F7 DMA2D驱动# ]6 C, T2 D. S1 _/ Y
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    6 B+ t5 }2 w# O+ N2 m3 D
  5. * 创建时间                :        2019-10-29
    / [4 t6 s/ T+ |; I  Y
  6. * 最后修改时间        :        2019-10-29% N1 r5 J; Q# H
  7. * 详细:                        
    ! T4 G/ G0 u( q2 T, W, G, s
  8. *************************************************************************************************************/        
    6 [7 r' q) K! T; x4 h, `5 |$ V
  9. #include "dma2d.h"
    ( I. _" d2 c4 r
  10. #include "SYSTEM.H" * L6 m3 L9 u. u2 D

  11. & |' i: X; b9 p; b- W2 @$ t0 @% R3 T

  12. - B4 T6 ?: m4 g9 j! ^
  13. /*************************************************************************************************************************: o& l* P8 j* k: f  ^
  14. * 函数                        :        void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)
    , y+ c' p% i; K
  15. * 功能                        :        DMA2D进行单色填充7 e2 O/ ]% ^1 F9 N
  16. * 参数                        :        FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;  V0 T. g) _5 P, B% b, R
  17.                                         ColorMode:颜色模式;Color:颜色值+ w) B5 X( o" _1 c, z  O
  18. * 返回                        :        无# K3 \7 O8 d) G$ n0 \9 a' G
  19. * 依赖                        :        底层宏定义/ E) d: D2 \( a$ c9 k% C& r( c/ g
  20. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>- {6 j: x9 ~; z$ y
  21. * 时间                        :        2019-10-29
    ! t9 R# T$ B7 R! t
  22. * 最后修改时间         :         2019-10-30' B7 }) ~7 ~3 B2 ?' S5 o  G  c
  23. * 说明                        :        用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束1 E+ E; ?4 }' J% `
  24. *************************************************************************************************************************/
    7 k+ \5 h- G. P/ ~  z; e
  25. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)/ K4 N* G6 U# E2 n
  26. {9 l" T0 c" {3 K' M5 J
  27.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    / x% @0 N0 w  {8 O( K; Y
  28.         DMA2D->CR = 0;                                                                //先停止DMA2D
    1 |9 n5 T( E9 i! o1 H" q7 s
  29.         DMA2D->IFCR |= 1<<1;                                                //清除传输完成标志
    ) I8 T# R1 _, d4 F9 M$ J
  30.         DMA2D->CR = DMA2D_MODE_REG<<16;                                 //寄存器到存储器模式+ U7 H' g$ m; b3 j4 ^' R5 a. `
  31.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式0 |" I  l4 |" e
  32.         DMA2D->OOR = OffsetX;                                                //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充$ {' S" J, b* }. j* w! v
  33.         DMA2D->OMAR = FGRAM_Addr;                                        //目的地址
    / p# R/ J& b# I8 ^; ~: }
  34.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数/ P& t' {$ Z: E  E/ b+ Y" S
  35.         DMA2D->OCOLR = Color;                                                //输出颜色! W' X' [% k$ V1 G# _4 F; n
  36. " f, t# E- \& d$ z, T7 q
  37.         DMA2D_Start();                                                                //开始传输0 x- k8 \$ t5 s- S9 w
  38. }
    7 `# i* t/ q1 K9 {5 h7 O

  39. . |) k* Z  C4 p; @2 y' k
  40. 7 K  }- c$ w( g- @7 n
  41. ( J7 `& t9 t' \# {
  42. /*************************************************************************************************************************
    0 f( ^8 q% O1 X; Z9 C! p$ x( O; f
  43. * 函数                        :        void DMA2D_WaitTransferComplete(u32 TimeOutMs)# w9 r# n$ l* W; J" u
  44. * 功能                        :        等待DMA2D传输完成
    , R$ m7 `  e* K& x# d2 p, @8 J  M' z
  45. * 参数                        :        TimeOutMs:超时时间
    8 s0 E; O  n* \7 p* j1 ~& J
  46. * 返回                        :        无
    1 ~6 c4 y2 F; _1 U' n+ A1 x  u
  47. * 依赖                        :        底层宏定义
    $ S1 u( ?/ k" I. z. _
  48. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ! r+ V2 ~$ k8 O2 x
  49. * 时间                        :        2019-10-30
    7 F6 r& S; ~' a. K- Y
  50. * 最后修改时间         :         2019-10-309 Q5 ^# s' T6 i: s! L+ p
  51. * 说明                        :        超时后会取消传输9 l4 M* Q: Y# F1 M, J
  52. *************************************************************************************************************************/
    3 m( X- M9 u7 g& l7 k8 L$ B
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs)
    $ r% w- B. _9 K0 l# L/ P/ Z# Q! s
  54. {9 f6 ~+ i0 @9 W# Q4 j4 U; ^
  55.         u32 timeout = 0;8 G/ @$ w" m) O
  56.         2 [7 j' P4 J9 M8 j! Z
  57.         while((DMA2D->ISR & (1<<1)) == 0)        //等待传输完成
    0 x  B0 V+ T6 f1 X
  58.         {
    3 X  ]1 w* i+ {! Y
  59.                 timeout++;
    # @1 K9 P! Q& k5 ~; J- u, n! X
  60.                 SYS_DelayMS(1);                                        //延时1ms5 f% a3 l$ I# L6 x7 R. \
  61.                 if(timeout > TimeOutMs)2 C, E6 B" [6 B& S: s
  62.                 {
    2 O$ M2 S) t$ [0 }" {
  63.                         DMA2D_Abort();                                //终止传输
    $ u/ v3 D. R- X! V+ [$ \, g
  64.                         break;                                                //超时退出0 k6 U* R( L- }: h7 J
  65.                 }
    ) X9 N" ~5 C: X; o. y9 @
  66.         }  : C0 `% q/ D" u# A3 ]
  67.         DMA2D->IFCR |= 1<<1;                                //清除传输完成标志         
    - z6 f' L: @, Y. s( }8 V
  68. }
    + G5 l* l  w3 X8 C

  69. 6 ]0 B4 H$ d/ z, D; D# {
  70. /*************************************************************************************************************************
    ! ~+ |7 i6 j$ y5 c1 C% H
  71. * 函数                        :        void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)5 V7 W, h( }  u8 C9 S% W
  72. * 功能                        :        DMA2D进行矩形图形填充9 P& J/ k7 }/ t2 y
  73. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);" J/ Q' R$ u$ S( ~
  74.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    . X  l- J; c7 H8 H2 r
  75.                                         ColorMode:颜色模式# t1 c$ q$ s% |, i6 Q: N) ?+ _
  76. * 返回                        :        是否设置成功
    % z+ w# j5 E8 }$ i9 A
  77. * 依赖                        :        底层宏定义! o1 x$ D9 H- ~; m+ f" s2 S4 E
  78. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>2 l% k8 N/ O8 \1 Y! C
  79. * 时间                        :        2019-10-288 u( d3 X8 o, O9 h4 h- \& i) f5 N
  80. * 最后修改时间         :         2019-10-28
      Y9 B8 `3 G2 K0 N! a
  81. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
    2 ~/ z1 s/ y9 `2 K7 `  z: V. h
  82. *************************************************************************************************************************/9 }, z8 d9 ^6 c* M3 _1 W
  83. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)
    6 ?. O2 z. j% f
  84. {
    $ ^9 D- D' ]# e( g2 J
  85.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟6 D+ R4 ?" A/ \* T2 u( i
  86.         DMA2D->CR = 0;                                                                //先停止DMA2D
    9 |" K- c& m$ y/ F# f& ~& r
  87.         DMA2D->CR = DMA2D_MODE_MEM<<16;                                 //存储器到存储器模式
      t4 h6 L3 U6 }- ?* T
  88.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数/ L! Q6 a7 f3 m# o! p
  89.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
      B( i7 K% e6 X8 a6 p
  90.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
    9 r& ^; ?" [! r: d
  91.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移
    ( }" _* c( o/ M  z0 `3 e# Y, g
  92.         DMA2D->FGPFCCR = ColorMode;                                        //源图像颜色格式$ O+ I) r' l3 t1 C1 I! {
  93.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充! ^* l' Y8 n5 N' r5 ^2 D9 X, a
  94.         DMA2D->FGMAR = SourceImageAddr;                                //源地址8 F& V$ ]- _0 Q( M* t( _
  95.         
    5 c. N3 s0 [! M
  96.         DMA2D_Start();                                                                //开始传输! m$ e( V( l  w0 ^! E% o; @0 S5 N2 M
  97. }
    9 ?5 |4 A9 T% U8 y6 G' u, f

  98. . n- R* o" g- h2 D2 }' E

  99. 6 x) \" E% }! `, c* z/ f
  100. /*************************************************************************************************************************+ K3 H5 _3 x& t( F1 W3 g
  101. * 函数                        :        void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,   o* B- k; r+ v' |* t9 v+ X
  102.                                                 DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    + ~6 k" s8 _) C- v1 F, S& S8 a& v
  103. * 功能                        :        DMA2D进行矩形图形填充(会执行像素格式转换)8 `, z, L' p7 t
  104. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
    , b$ _; `# W6 b4 f
  105.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    $ d" k+ Y* [" u( t
  106.                                         SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式
    8 k' ]4 D% X; r% g+ A8 ?
  107.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    & }0 ^3 `6 x* ?  \
  108. * 返回                        :        是否设置成功
    , e, u0 L; w; H, u' j
  109. * 依赖                        :        底层宏定义
    6 Y% f2 Z: K4 |" l$ E
  110. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    , H2 K( @+ P+ y0 V& ?7 d9 l
  111. * 时间                        :        2019-10-28
    8 }8 l* H' o9 [7 K. E2 }
  112. * 最后修改时间         :         2019-10-28
    , W1 o3 k) ?# K( B# {
  113. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束3 @9 O: v% Y) g: {! g2 M
  114. *************************************************************************************************************************/4 d: b! P/ L* d0 `/ A) ~  l
  115. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, # C7 S* S" A7 o9 @& H6 s# V3 k; N
  116.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    ; a+ D9 g8 C% D0 A
  117. {
    " M7 c3 e; A: y6 E% @
  118.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    , x7 k" I5 l, c9 ^' n) n$ Z
  119.         DMA2D->CR = 0;                                                                //先停止DMA2D; t/ O+ a: L+ A9 h7 x
  120.         DMA2D->CR = DMA2D_MODE_MEM_PFC<<16;                        //存储器到存储器模式-激活PFC& I6 h3 G/ F/ {
  121.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数' S" I% C8 R3 [6 m$ t# A
  122.         DMA2D->OPFCCR = DestColorMode;                                //输出颜色格式
    7 e; v  R! K) X* }1 V' T! p
  123.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址
    6 _: A) V1 W# t
  124.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移
    ' g# u; P, r' |1 X
  125.         DMA2D->FGPFCCR =((u32)Alpha << 24) |  ((u32)AlphaMode << 16) | SourceColorMode;                        //源图像颜色格式
    & x1 g+ w! D# c- x
  126.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    : s! k# K+ r' \- x
  127.         DMA2D->FGMAR = SourceImageAddr;                                //源地址, _. Y5 x  L( e% W& W/ T1 J
  128.         9 w5 t: Y9 ^0 I; @! [7 u
  129.         DMA2D_Start();                                                                //开始传输
    + d+ ^* N; ^/ k
  130. }
复制代码
  1. /************************************************************************************************************** M0 l3 |0 g/ h- D$ k
  2. * 文件名                :        dma2d.H
    : g' }# B& F5 `1 H) c. w. N
  3. * 功能                        :        STM32F7 DMA2D驱动
    # M" l6 f) }9 L8 [7 x% l
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    / d  ^5 d5 r& C* Q. ^7 t
  5. * 创建时间                :        2019-10-29/ D& e3 w& H$ X8 y# @3 S. N# m
  6. * 最后修改时间        :        2019-10-290 e7 a+ b/ t2 D/ m# E" N
  7. * 详细:                          F* }4 w3 c2 V7 Y
  8. *************************************************************************************************************/        5 `7 H" P5 D' L8 U
  9. #ifndef __DMA2D_H_
    1 J0 z. I3 v5 Y0 t& v5 _# M6 J
  10. #define        __DMA2D_H_           
    $ v- K/ A; B. U3 W9 A
  11. #include "system.h"
    9 d+ N# A- C4 G# X
  12. 9 x3 i+ x5 l" k/ {
  13. - M  N, W7 x' z. ^, [. j  k
  14. typedef enum% z: L* x" r) X; ]9 m) W. ?
  15. {
    " k/ c1 @$ v, i" ]$ \  m
  16.         DMA2D_MODE_MEM                =         0,                //存储器到存储器(仅限 FG前景色 获取)1 {. I+ B" A: d
  17.         DMA2D_MODE_MEM_PFC        =        1,                //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)" ]- K( E3 v9 O# B3 @7 z: J2 F
  18.         DMA2D_MODE_MEM_MIXED=        2,                //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)2 K/ f: ?: @1 h4 W+ a* w) Z
  19.         DMA2D_MODE_REG                =        3,                //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)/ b( R3 j' n% h; b5 S: I$ }
  20. }DMA2D_MODE;' ?2 I! X+ u8 i/ W

  21. ) F* m5 f/ t+ Y- ?; ]2 F
  22. //颜色模式; u- O4 Z! p# N! Y/ `! K% T
  23. typedef enum
      M( [* }: Q* e0 N
  24. {' s4 i. \4 y0 B6 |
  25.         DMA2D_COLOR_ARGB8888         = 0,
    7 X4 K, z1 ^0 b' @3 I0 w8 @
  26.         DMA2D_COLOR_RGB888                 = 1,
    ) k2 y$ O% _. |, _3 f' I# y: S
  27.         DMA2D_COLOR_RGB565                 = 2,
    , r: \: b+ h& ]& P
  28.         /*DMA2D_COLOR_ARGB1555         = 3,
    7 }' h/ `/ s2 e/ ~0 ~& D
  29.         DMA2D_COLOR_ARGB4444         = 4,1 Z. _# d7 r( v( `
  30.         DMA2D_COLOR_L8                         = 5,        //8 位 Luminance
    5 z% R6 F1 S6 U4 A0 X
  31.         DMA2D_COLOR_AL44                 = 6,        //4 位 Alpha,4 位 Luminance& [' g! P) R, Q8 O; q2 S0 v
  32.         DMA2D_COLOR_AL88                 = 7,        //8 位 Alpha,8 位 Luminance
    5 Q% X, y7 P- q2 K  }& C% \- g7 O3 D
  33.         DMA2D_COLOR_L4                         = 8,        //4 位 Luminance
    8 j+ D2 F, Z4 a: e! E
  34.         DMA2D_COLOR_A8                         = 9,        //8 位 Alpha
    6 s: |& q& S0 z, W
  35.         DMA2D_COLOR_A4                         = 10,        //4 位 Alpha*/
    , ]+ I9 Z$ J; _5 f" {; d4 z
  36. }DMA2D_COLOR_MODE;- a' o3 }+ S5 [- [1 b+ z

  37. 5 y% {1 l0 N+ `7 B% e9 i
  38. ( S8 F' d0 a1 N
  39. //Alpha 模式8 M, q& [: E/ \  j- C
  40. typedef enum
    : Q4 Y# ?; y1 k8 Z$ I; o" E1 r
  41. {
    6 D" T: \) w4 h7 G% A
  42.         DMA2D_ALPHA_NULL        =        0,//不修改前景层图像的 alpha 通道值
    - ]7 ]! R+ S" s. Y% f* F4 A
  43.         DMA2D_ALPHA_REPLACE        =        1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]
    ; `4 Y3 W& R+ a3 y" L3 c
  44.         DMA2D_ALPHA_PRODUCT        =        2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积
    ' m& P0 q4 Q' n! L5 b. p/ f: ]& J2 n
  45. }DMA2D_ALPHA_MODE;
    " j8 w' C% `4 n
  46. " x+ ^2 W9 p; C; Q9 h) i

  47. ) I5 T, M; a  D1 i# Q- K* {
  48. __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;}                //终止传输
    * e$ P: n  h$ X8 i
  49. __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;}                //挂起传输
    4 y) \" }9 w! w& Y
  50. __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;}                //开始传输
    9 ~1 X" z8 I7 b7 l

  51. ( e2 z6 d+ D- ^
  52. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color);        //DMA2D进行单色填充
    8 p3 V  X" H% A2 D- A& M: g
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs);                                                                                                                                                        //等待DMA2D传输完成
    8 o% E( ^7 N. b, H, L, h
  54. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充
    0 z, p/ E  O, @+ X- `& F) A8 P3 r
  55. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,   x! `: o; H; @3 k1 ], d/ m' Z
  56.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)4 k) H# o% ~- A, z; S- o
  57. #endif //__DMA2D_H_
复制代码
  1. /*************************************************************************************************************' z3 r* B3 ~! r, a; E
  2. * 文件名                :        DMA2D_GRAM.c& f' }0 _3 x- `5 q2 _" |% ?
  3. * 功能                        :        GRAM相关操作& _; h2 v1 b/ a9 V1 j) y1 P8 J
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ' s: g) E  u$ v; {3 |- N' @* E
  5. * 创建时间                :        2019-10-30% c  S: n+ U+ n; [1 v3 v4 k' v; ]4 h
  6. * 最后修改时间        :        2019-10-30
    2 S! Z! a$ M& ]+ w1 R" t2 |: Z4 S
  7. * 详细:                        显存相关操作接口: I! Z* ^3 k: \3 }$ G: s, S" \
  8. *************************************************************************************************************/        
    6 A! I8 D! F3 v
  9. #include "dma2d.h"
    - J" @9 V" X" g% M
  10. #include "DMA2D_GRAM.h"+ _* S& G: P4 W3 e  V& d8 s) S
  11. #include "SYSTEM.H"
    " b. K" ]! y% O% q) X- ^+ o! i+ w

  12. ) |3 A% \# ]" L3 `8 e
  13. //基本接口
      X3 A9 t  z5 H& s4 H
  14. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //32bit色彩GRAM显存画点& Y& R4 _* s( X! y( {
  15. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //24bit色彩GRAM显存画点
    & S4 @3 G0 l8 O, W% s
  16. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //16bit色彩GRAM显存画点
    1 Z2 D. A+ x0 w4 b6 @6 J4 q

  17. * @- w2 y* g- n% y6 t% V, ^( c. P4 M
  18. * T5 y: p5 U5 `  l: ]
  19. //GRAM相关接口-16bit
    6 @$ y; B! c7 L1 d7 J$ S# J
  20. const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit =
    # v: E6 x% S+ P6 R. c3 u
  21. {
    & x+ p2 O% Z. M  T& H$ v6 t
  22.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit,                        //GRAM显存画点(RGB565格式)
    5 U% u7 d& n. H# m( a& G; V% d
  23.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    # V/ c; a7 M" V6 I0 j% m4 u
  24.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)$ v& W2 T) s  X/ E' E+ M. w- \$ U
  25. };3 {! g0 q% R# k7 W6 @) M6 G6 a2 r

  26. 7 j0 z7 y5 g" A2 b1 u7 Q4 O+ C2 O7 e
  27. //GRAM相关接口-24bit) N0 k( H1 S% g* N7 J
  28. const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit =
    1 o( A/ M2 Y8 Z' N& A
  29. {
    * c5 b* G  ~7 F
  30.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit,                        //GRAM显存画点(RGB888格式)! s; {# x. Q: n5 N0 ]
  31.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充6 b0 V- i4 d( a
  32.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
      q, F) v. d; ~* z  _" \
  33. };
    4 L9 H3 L# k$ J) D) I! p

  34. - T8 L/ t( M, g2 x3 M  y
  35. //GRAM相关接口-32bit
    7 j5 M7 h5 v4 Z, @# r! g
  36. const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit =   U% I* c3 S6 N% `: L& Y. p/ z
  37. {
    8 }9 q3 w; f) m+ D9 Q  k8 }+ I" o2 Z4 d
  38.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit,                        //GRAM显存画点(ARGB8888格式)
    , R$ T# G8 w* E
  39.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充7 P# x+ X$ q4 V3 K; {4 P/ o7 w
  40.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)4 `, D7 g: @; a* r6 ^+ f( X
  41. };
    - u4 d6 P2 I& q+ m0 [- B

  42. % D" K- W  M; K3 v* {
  43. /*************************************************************************************************************************" ^5 y3 m+ J# p3 J: }0 \
  44. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)3 q$ d: z7 v8 o! u2 m. d
  45. * 功能                        :        GRAM句柄初始化(不会申请内存)5 a, c% d. ]+ H( E: D3 ^# \, D
  46. * 参数                        :        pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式
    - ?- w  z) n" R; a1 `* @- h4 j( M
  47. * 返回                        :        无
    5 Y) g/ j+ ]$ v
  48. * 依赖                        :        底层宏定义
    & b% v7 o! o& P
  49. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    : G) t4 c7 _- q  r
  50. * 时间                        :        2019-10-30
    ; H0 F6 G& W  M9 V
  51. * 最后修改时间         :         2019-10-306 A$ E6 ^8 R* [, T. Z  \: @
  52. * 说明                        :        初始化显存' `" B+ k0 P1 y
  53. *************************************************************************************************************************/
    4 q+ N; |' Q2 }+ H7 V/ q- `. n
  54. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)" ?+ P4 G& A! H$ Q, q
  55. {
    % {# N- j2 @3 S. [2 s) y
  56.         while(pHandle == NULL)
    2 N: U8 }' Z% b# M- T
  57.         {
    ) Z. k6 s8 a5 z1 e& s: L2 e! U
  58.                 DEBUG("无效的句柄pHandle\r\n");6 ~4 }; Z- p* `) F9 B3 Y" D' t
  59.                 SYS_DelayMS(500);$ n( p, }3 ?6 Q2 w" G
  60.         }
    ) o& ?- t- E2 o) d9 [0 G& v" t7 _
  61.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址
    8 x- H8 ~: V' y
  62.         pHandle->Width = Width;                                                        //GRAM宽度
    5 d5 M7 n; |/ |& g
  63.         pHandle->Height = Height;                                                //GRAM高度
    7 K8 z9 x# v3 G+ T* j: E, ]
  64.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针* |: \8 k2 l$ b6 Z2 Y
  65.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针/ z9 a6 A, x! J2 b
  66.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针
    6 x0 W- p2 A3 e( e9 C
  67.         //像素模式) V& f, s9 F9 T0 n! g2 e5 L
  68.         switch(ColorMode), M. s  U6 {% I$ M) k' f
  69.         {& z  C/ \2 P4 p$ `: u9 A
  70.                 case DMA2D_COLOR_ARGB8888 :
    # w6 U  o* {5 Y, X2 l
  71.                 {, K; H  x  }* d1 m- |& `
  72.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;9 p' k" ?, n, H( i  q# \; }% b
  73.                 }break;
    2 a7 r- ~$ P& v) U1 a
  74.                 case DMA2D_COLOR_RGB888 :
    , f" }3 k" \" K! K' C
  75.                 {  e) Y8 B5 K: @3 V& @8 Z* U
  76.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;# }% T- x' @2 h1 q% |3 U5 k) y: D
  77.                 }break;
    0 n; `; z+ d3 @0 p
  78.                 default: //DMA2D_COLOR_RGB565
    " }: e+ O6 i: X4 V" n+ ^
  79.                 {
    7 q( e* |9 n2 y$ I- N
  80.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
    0 Y8 e  _: S/ d: l1 W
  81.                         ColorMode = DMA2D_COLOR_RGB565;
      K% |; M; F2 J' o0 v( D6 Z: e
  82.                 }break;' g/ P( u% m8 {
  83.         }
    ) c" d( @& v: d2 e9 {7 e
  84.         
    ! ?: ]4 R- \. e& ?2 u' C
  85.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式
    % f9 ~7 Q4 O* V* r6 _" ^
  86.         pHandle->InitStatusId = DMA_INIT_OK;                        //初始化成功9 x( ?* o$ e& d: `! E( f
  87. }
      C* i. T) [1 C  P$ `$ f3 q2 s

  88. 2 g4 B! t1 S/ ]6 u
  89. /*************************************************************************************************************************
    . N. R/ J" z% {; k% Y+ `5 P6 N
  90. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)
    & d, z' ^4 D  \3 w# @! D0 [
  91. * 功能                        :        创建一个GRAM(会申请内存)
    / I7 o6 F; l& y5 k& Z7 [
  92. * 参数                        :        Width:显存宽度;Height:显存高度;ColorMode:颜色模式
    * ~) c) {1 R( [0 W
  93. * 返回                        :        NULL:失败;其他:GRAM句柄
    2 R3 b+ i) i" h0 q
  94. * 依赖                        :        底层宏定义
      M9 g4 L% A9 v
  95. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>5 Q6 Q2 O0 a$ I* N3 u4 D
  96. * 时间                        :        2020-02-025 ]) _/ k0 O$ U  o9 h
  97. * 最后修改时间         :         2020-02-02
    5 s7 f$ C) H4 @7 F! M
  98. * 说明                        :        初始化显存
    ) z$ h+ ~  J: z. @# ^0 C
  99. *************************************************************************************************************************/
    * u! H0 Z; Q+ ~1 _
  100. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    . b8 ~$ v% W6 \% m; E
  101. {) Y0 R0 n8 F) D* o. \
  102.         GRAM_HANDLE *pHandle = NULL;  F* q/ X1 ^) e8 ^
  103.         u32 GRAM_Addr;5 P* t6 H7 m% r9 t# w7 d8 w; H
  104.         & U( M- ]! {; a5 E
  105.         pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE));        //为句柄申请内存( w1 v* I' T7 v2 B# w
  106.         while(pHandle == NULL)
    8 }) d- s) f- P6 ?) W
  107.         {
    / m' p3 ~9 I2 f  v
  108.                 DEBUG("无效的句柄pHandle\r\n");+ t0 n. U" U" c3 E
  109.                 SYS_DelayMS(500);
    3 s! K/ m8 ^' ]' z# a9 v
  110.         }
    # p' k! g* \; G% ?. @- a( J
  111.         
    6 I& d' S; Q/ ^: F' N7 h
  112.         switch(ColorMode)4 G- `8 T5 [7 z8 K
  113.         {
    . a3 b1 F' Q0 R$ f
  114.                 case DMA2D_COLOR_ARGB8888 :
    1 J- X; b) B0 V2 `( M( A
  115.                 {7 c8 c) p1 I! A( P
  116.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存
    ; X4 L: x1 S' L& Q# U
  117.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;/ Y$ E3 H5 n7 f2 K9 j; Y
  118.                 }break;2 A2 w$ V9 u! x, I* U
  119.                 case DMA2D_COLOR_RGB888 :
    : l1 w, ]3 j2 d4 }% F' e& T
  120.                 {; E- ]" p/ B6 S& T3 m7 k
  121.                         GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height);                        //为显存分配内存& ?3 a2 }& Q* ~, F/ a) R. N
  122.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;/ ~/ _) W+ z4 Q: f2 p( B
  123.                 }break;
    % C% s: H/ I# o5 B2 ~
  124.                 default: //DMA2D_COLOR_RGB565) \4 w2 L9 B  P. }+ [1 d, G
  125.                 {* x2 A* x/ L3 @  Z; w6 c2 o2 X
  126.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height);        //为显存分配内存7 ^9 C) M9 X2 b1 O) ]: i
  127.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
    - ~6 K2 d7 y( }4 a0 E3 e) i
  128.                         ColorMode = DMA2D_COLOR_RGB565;
    ) d+ m$ r0 p6 T, t4 N( v. y5 E
  129.                 }break;
    ' x. U3 d; K' t7 a
  130.         }
      g% k* b* e% T7 {, O; q
  131.         4 j9 l4 ~( \" L5 X
  132.         while(GRAM_Addr == NULL)
    1 z  f. h# Q8 L& s3 a# Z
  133.         {
    0 G& e' [8 E' B& q2 p4 j
  134.                 DEBUG("显存申请内存失败\r\n");# V; m) `: g2 e( p$ m5 d
  135.                 SYS_DelayMS(500);& m$ l2 m7 }- T! ]' d7 z0 h/ s. ~0 q
  136.         }2 M6 e8 s. D6 D4 D" w
  137.         
    ' E' l% ~; g7 t" F
  138.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址8 c# @. t$ c1 E9 _- o
  139.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式
    ( F3 ]2 h" H) s6 g0 r
  140.         pHandle->Width = Width;                                                        //GRAM宽度
    8 O* x  ~8 T; _+ [* S- K) G& f
  141.         pHandle->Height = Height;                                                //GRAM高度
    $ ?* o! Y+ k; y8 A* \/ b6 C' R
  142.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针
    # N3 l2 F: ^% P
  143.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针& e+ F) }. [9 ^$ d$ G- C" \8 y
  144.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针
    2 Z% q* h+ A1 h+ \# ]+ z
  145.         pHandle->InitStatusId = DMA_CREATE_OK;                        //创建成功
    * o# z0 ?# c0 e% U- k, K+ e
  146.         
    ; U5 I7 i5 l1 V6 C% A; U
  147.         return pHandle;4 D1 d8 o* f/ k/ b% k0 Z
  148. }
    7 }$ f% }$ u' G
  149.   X; V+ i$ S  {% o. n, D

  150.   b$ q! L% G% [& x5 d
  151. % a9 E+ ]# G4 P* \7 R& p* x$ G0 [" N
  152. /*************************************************************************************************************************
    8 q8 @. y; E3 M% ^. h+ o
  153. * 函数                        :        void GRAM_Delete(GRAM_HANDLE *pHandle)
    " \& f( E0 g2 {
  154. * 功能                        :        删除一个GRAM(会释放内存)9 B- v0 t! Z$ H
  155. * 参数                        :        pHandle:GRAM句柄
    - ?7 }5 p' T; h. k/ [
  156. * 返回                        :        无; f0 U9 G' q- P$ x, H, g
  157. * 依赖                        :        底层宏定义
    0 \9 N  ]7 ?& H2 \1 {
  158. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ( ?+ }) n: b2 e1 t+ _
  159. * 时间                        :        2019-12-162 t4 R# D; R& {5 Y$ S
  160. * 最后修改时间         :         2019-12-163 ~0 a% a+ o5 v! L( O" }
  161. * 说明                        :        用于删除显存,释放内存* }( G, k3 E3 ^& u& o7 d
  162. *************************************************************************************************************************/+ m: d) O7 I0 A5 j0 U
  163. void GRAM_Delete(GRAM_HANDLE *pHandle)
    1 u1 \! v9 t$ A# Y9 A
  164. {2 B8 S# j5 d% p# }( t+ `: V
  165.         if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)
      A1 \$ P5 {6 f, d0 A( ]3 Z
  166.         {) B3 S9 H. ?% n# K* G3 N8 x
  167.                 if(pHandle->GRAM_Addr != NULL)& V3 Q) }2 t/ U/ J1 w
  168.                 {3 ~9 F) z* b9 ~* @9 }/ T
  169.                         GRAM_free((u8 *)pHandle->GRAM_Addr);                //释放显存内存
    * v9 K$ a. I3 C
  170.                         pHandle->GRAM_Addr = NULL;( F6 G2 ~- }) ^: ^3 F, f1 |( x7 e
  171.                 }! C8 v0 t9 r9 Z0 F3 V/ t9 s
  172.                 pHandle->InitStatusId = 0;
    9 ]" S* B8 q5 E/ o( S- d+ ]  p
  173.                 GRAM_free(pHandle);                                                                //释放句柄内存+ I& B; `# ]0 ~" T& ^, r! [0 [$ g
  174.                 pHandle = NULL;
    4 K0 e* k( o0 [* i
  175.         }6 A5 K6 U& c8 `
  176. }$ E5 Q* ]- `7 T  U  t. i
  177. , P, ]) P0 E. j4 Z0 S$ E* e: l  x
  178. * U( R8 A0 |  _5 o8 k
  179. /*************************************************************************************************************************
      q5 x/ H2 \2 j6 ^+ n  E0 {$ @
  180. * 函数                        :        void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    - r0 k' C. q, ^% ?
  181. * 功能                        :        32bit色彩GRAM显存画点. k9 J3 C8 N1 M
  182. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色7 ]8 B4 D6 j& j" D: J
  183. * 返回                        :        无
    ! O5 {. c; l* v. y" V  q+ S7 p4 I
  184. * 依赖                        :        底层宏定义
    0 Q* f- |8 J' Z1 Y. Z: d6 D' O
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ) C+ l$ N- G! @. }) C  V# z
  186. * 时间                        :        2019-10-30+ j( K* M- A/ w* E0 l8 r6 V
  187. * 最后修改时间         :         2019-10-30
      g' V5 z( h  D3 {1 g# v6 L+ A+ _, s" Q
  188. * 说明                        :        在显存中绘制点# F; R- z0 r) D( ^
  189. *************************************************************************************************************************/
    " z8 M* r2 y# P; p0 V  U& I# @
  190. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)" U- [1 f$ `' o
  191. {
    ( O, C4 r8 v0 X
  192.         pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;- j# M$ q. `9 f0 _1 U1 G
  193. }
    / O' i2 p& i- t; d7 E0 {, R  w# y
  194. ( @- X0 w$ W. r0 \( ~6 t
  195. 6 x* c. d& [2 ]7 ?/ s. P
  196. /*************************************************************************************************************************7 M7 ^/ |8 a! K2 E7 V
  197. * 函数                        :        void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    $ Q2 `0 j/ M7 `$ [
  198. * 功能                        :        24bit色彩GRAM显存画点& Y9 l( v: C! U4 a
  199. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色  O* k: h0 c+ `' D# [
  200. * 返回                        :        无
    ( |& ~' c. h& r2 u% ~6 ^* V8 p1 r
  201. * 依赖                        :        底层宏定义$ r. Z! P5 Z9 u
  202. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>- b* C7 w$ l7 \, X8 R3 z  O
  203. * 时间                        :        2019-10-30! t& Q/ L6 @0 q; B; R
  204. * 最后修改时间         :         2019-10-30
    ( u2 W7 V8 t. k6 f/ ]
  205. * 说明                        :        在显存中绘制点
    6 [8 Q3 K) O7 u
  206. *************************************************************************************************************************/2 @5 V# P* [7 U. E0 |
  207. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color); r- r- ~5 K' ?; s( Y; d, E
  208. {% m- r) D. Z# V& G) K( k% G8 x
  209.         memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);
    1 y" f5 U2 C& S) z
  210. }
    0 n$ G; r: x8 z
  211. 9 @, `5 P7 ~9 i9 r5 g1 M. X

  212. $ i7 S% X! H% ~" p2 u' S
  213. /*************************************************************************************************************************: p& [6 M3 z" B: T3 h- \9 v6 k" h
  214. * 函数                        :        void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    ' }# M/ l" f/ I/ @, B
  215. * 功能                        :        16bit色彩GRAM显存画点4 c* ^  H) ]: e! k) Y5 d
  216. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    $ w' q+ {; Y) a0 }
  217. * 返回                        :        无# C/ R4 l5 g6 P5 l9 _2 R9 W& W$ Q
  218. * 依赖                        :        底层宏定义) V9 G' z1 x+ e9 T1 Q
  219. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>1 H( P2 I; T. o: c9 G3 ?1 k; M  Z
  220. * 时间                        :        2019-10-305 }! c! J2 L( @
  221. * 最后修改时间         :         2019-10-30$ b5 q) D1 o6 {3 G- D1 q% W' o
  222. * 说明                        :        在显存中绘制点% F# |  I/ \% f6 g$ [7 D- d* }! {. [
  223. *************************************************************************************************************************/1 d; ~; A4 f4 C
  224. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)+ j" A) q) c; @* \, x' t0 N
  225. {6 S5 N! o6 v8 c9 l
  226.         pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
    ' H/ U, u4 j' w" _
  227. }! S3 g$ v, V5 j2 U6 I; i: p! d
  228. $ @, |" T( S3 l# S$ j

  229. & V9 p# e! t2 F( o

  230. * z) F3 o8 b/ b& o: W
  231. /*************************************************************************************************************************
    1 W- Z  R  m' v8 F2 Z
  232. * 函数                        :        void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)        0 ]. {* k* j! f# `4 |) G& D
  233. * 功能                        :        GRAM矩形填充(使用DMA2D)
    ' P; C0 h. l9 g2 d3 ~+ X
  234. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色9 @* _+ z6 L* _$ r7 w! W' W
  235. * 返回                        :        无/ M) N- B( Z0 s, f
  236. * 依赖                        :        底层宏定义$ L) J) C4 S% F9 h
  237. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>4 O, G2 V! j/ P1 f
  238. * 时间                        :        2019-10-305 \$ M, I  U# O
  239. * 最后修改时间         :         2019-10-30. z- Q# ~4 h1 T3 H6 z. j
  240. * 说明                        :        采用DMA2D实现
    ' k' w( `; B8 G" u$ h
  241. *************************************************************************************************************************/
    6 P" e! e% H% j8 j8 x. Z1 l
  242. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color); b; q& E0 w4 k+ ?
  243. {
    . u& r7 x8 ~' q2 S/ F! S) O6 x% }& x
  244.         switch(pHandle->ColorMode)
    # K$ l( p/ }5 P0 D, X  r' n4 X
  245.         {+ c: x9 x( e, ]/ k' w" }
  246.                 case DMA2D_COLOR_ARGB8888 :
    + o: v( o& h5 v
  247.                 {
    1 V0 O6 o/ Q. @
  248.                         DMA2D_FillColorToFGRAM((u32)&pHandle->pGRAM_32bit[(u32)sy * pHandle->Width + sx], ex-sx+1, ey-sy+1, pHandle->Width-(ex-sx+1), DMA2D_COLOR_ARGB8888, color);                //DMA2D进行单色填充
    ) T- E& }4 k$ H' i9 @7 ~3 k7 d# n
  249.                 }break;
    ; f' l6 ]) S2 `- i) l8 B- q1 w
  250.                 case DMA2D_COLOR_RGB888 :5 ~$ _' V3 ~/ o, K2 e
  251.                 {$ ^4 [$ |$ Y+ w
  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进行单色填充
    3 F4 J5 {# k) o% {  i: h
  253.                 }break;
    ; B% F9 [6 B$ D2 p
  254.                 case DMA2D_COLOR_RGB565 :
    / I8 Z/ M& q6 _
  255.                 {; J7 {" }+ [' N8 _( C. _' l1 `
  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进行单色填充
    + U, u6 B0 G- V3 ]. Z
  257.                 }break;
    3 j$ C* L  X* q9 n
  258.                 default:return;
    ( z* g* N- ^2 l
  259.         }
    9 N- Q) a* L& k" B; W; a. z
  260.         
    & W9 p* s( q( Q
  261.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                                                                //等待DMA2D传输完成
    1 G, O/ E$ l, e1 ]- l
  262. }  ?& q0 X: W' W
  263.   V! Y) r) H' L8 T9 `- E

  264. / f% x$ z6 H5 h
  265. /*************************************************************************************************************************
    " b& F$ L: `7 a! b4 F8 T9 N9 r4 t
  266. * 函数                        :        void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
    7 L( g# n( ]. o: L6 I# `: |* {; u
  267. * 功能                        :        GRAM清屏(使用DMA2D)9 r! W5 v- [; T( ~; g6 O* a7 G
  268. * 参数                        :        pHandle:GRAM句柄;color:需要填充的颜色/ K* J- C9 J( I  k2 m
  269. * 返回                        :        无  ?( U' B2 r5 s) F8 r" a
  270. * 依赖                        :        底层宏定义
    $ R4 J0 g$ v1 l/ p2 N! J
  271. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    & H8 D6 W5 l/ }* E+ j8 f, {! \9 D
  272. * 时间                        :        2019-10-30
    + Q0 ^# ^( D! T
  273. * 最后修改时间         :         2019-10-309 `# Y+ p, u) v. Q  ~/ ?6 H' G
  274. * 说明                        :        采用DMA2D实现# u: v1 h" D8 f! @: I
  275. *************************************************************************************************************************/
    ! h6 r" r& h, j/ }6 e6 Z& @' i
  276. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
    0 f8 o1 g# i( x" {3 \
  277. {, S$ u# f" W7 _/ I% n9 c
  278.         switch(pHandle->ColorMode)
    9 h! Z- r) v! l, b1 N$ C  X
  279.         {# E3 T. V, d  P* f0 _' A; {
  280.                 case DMA2D_COLOR_ARGB8888 :
    : P3 V4 z6 ]% r9 d$ e; l
  281.                 {2 @# T/ n3 {- V" W
  282.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color);        //DMA2D进行单色填充; x  }! g% |, h3 \
  283.                 }break;7 K3 e; \2 r2 p: M! a0 e, ^2 G
  284.                 case DMA2D_COLOR_RGB888 :
    " V% S" u3 d4 E7 L1 {
  285.                 {
    * m- S& T0 {; J* V- d
  286.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color);                //DMA2D进行单色填充% W- [% F% P! s/ E: I9 |* i! n
  287.                 }break;1 Q- \% a. k5 ^% }4 b# w3 W* |
  288.                 case DMA2D_COLOR_RGB565 :
    2 Y9 `5 H) }7 l% U9 Z
  289.                 {
    / x. N5 b- Z: Q. j3 e* W
  290.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充- `4 J; R$ f2 j0 J' j% A+ S
  291.                 }break;3 [& R9 {" h+ [( S5 |  c
  292.                 default:return;9 x$ T2 F) O' @8 b. H% A
  293.         }
    ' Z5 L, {0 |: R/ E7 k* W% P/ p8 I3 A
  294.         SYS_DelayMS(5);
    ( }/ @2 {  u2 g/ j6 F
  295.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                //等待DMA2D传输完成! l0 ]2 @; b- z% [8 p' B) }
  296. }9 P: B% u( s& k- m- a

  297. 1 c$ N# v* n* V1 p, q% B( W
  298. " L% ]) Y" {, t. c
  299. /*************************************************************************************************************************/ w* o$ u: ?0 _1 E& Z- e5 _( U
  300. * 函数                        :        void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
    : T% y6 ^+ d8 A$ \* e
  301.                                                 u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)
    $ j& p3 e7 W! [# Y2 E# U1 k; V
  302. * 功能                        :        GRAM局部拷贝(支持Alpha)5 X2 j" v. f5 K, T: \
  303. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
    $ e, b: I5 ]/ W, J
  304.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度
    & `7 E/ x" A. r9 O. U
  305.                                         AlphaMode:alpha模式;Alpha:Alpha值;
    : a3 x: d% L+ n
  306. * 返回                        :        无
    ) w7 e! Z* O/ y2 b3 f
  307. * 依赖                        :        底层宏定义
    : \) I% W+ |2 N0 Q1 X) F
  308. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    # B) z. i/ l2 W% q% K$ J
  309. * 时间                        :        2020-02-02
    # z$ q; U" x' E+ }; y
  310. * 最后修改时间         :         2020-02-02! q' Y& a1 M9 K
  311. * 说明                        :        不会检查GRAM大小,请确保GRAM0 W% B, k+ Q  q$ v7 d1 `
  312. *************************************************************************************************************************/
    * L0 u8 e$ @9 }9 Y( v+ V. 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)3 e# t, j6 D) a2 L
  314. {2 p5 Z: _) l% G) ?
  315.         u32 SourceImageAddr;        //源图像地址(通过地址控制开始的X,Y坐标)
    $ j% I- y+ F* \- b
  316.         u32 DestGRAMAddr;                //目标GRAM地址(通过地址控制开始的X,Y坐标);1 ?2 ]8 Z/ S  i7 y/ V
  317.         u32 PixelByteSize;                //像素字节大小
    ' |: H3 B+ t, S5 G9 N7 c5 @9 K
  318.         ; P2 X0 |, ~$ f1 p+ [% a9 ~  m
  319.         if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL)
    5 ]6 b6 D9 b' k* I8 w8 f# h( G
  320.         {
    2 i* E5 J; |( [5 S
  321.                 DEBUG("无效的句柄,pDestHandle\r\n");
    $ _/ F( q0 L7 v! e# F
  322.                 return;- M5 B% X- h1 ~' J9 I
  323.         }9 ~+ l, J+ }/ \2 \% q$ x% \
  324.         if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL)
    $ [6 p+ z* A& Q5 q  o9 @
  325.         {
    # r6 J' i0 U  k* ?
  326.                 DEBUG("无效的句柄,pSourceHandle\r\n");
    1 M% x9 X0 p! C: v+ j
  327.                 return;6 M* y% M  a3 a7 w1 ?/ V6 H9 A) W
  328.         }$ _1 Y2 N4 p/ \9 g$ _1 k# f6 c& p0 j& `
  329.         //源图像地址(通过地址控制开始的X,Y坐标) 计算" m4 ?2 a; R+ y6 w" }
  330.         switch(pSourceHandle->ColorMode)7 @, I' Y: {% |: K4 [! }7 o
  331.         {
    6 d7 V5 W! `1 b
  332.                 case DMA2D_COLOR_ARGB8888 :
    * [$ K! Y( v0 {  p! B
  333.                 {
    & N8 B& x; W2 g* E$ U# c
  334.                         PixelByteSize = 4;
    * }( W' a2 c9 o4 C& G* |6 {
  335.                 }break;) {  X9 i3 [9 A) X
  336.                 case DMA2D_COLOR_RGB888 :$ @) p4 ?! e& b7 G8 r' u! I2 W9 k
  337.                 {8 Z3 Z8 H& V/ C# K
  338.                         PixelByteSize = 3;: v" Q4 N; ^) ^
  339.                 }break;2 o4 x4 [/ k7 t) q* J& U
  340.                 default: //DMA2D_COLOR_RGB565
    $ v# s3 N. ]4 M! S/ g; k' y8 W" y
  341.                 {
    2 g( T  z, ~8 |! c
  342.                         PixelByteSize = 2;
    5 e. s5 E9 F1 j. j% g
  343.                 }break;, ]& U' T2 h( X) r: l2 ~
  344.         }  L) E: R7 V) }+ }% S% Z( {5 e
  345.         SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize;        //计算源开始地址
    * N) m% s* @  @" o- V! f
  346.         
    2 N4 W9 Z5 m' r* Z
  347.         //目标图像地址(通过地址控制开始的X,Y坐标) 计算6 ]) \* w9 P4 ]" S2 E
  348.         switch(pDestHandle->ColorMode)5 \, ~7 J( E0 a+ x0 P! `' O
  349.         {
    - {9 Z% R4 u' S
  350.                 case DMA2D_COLOR_ARGB8888 :
    : v0 j4 ?% l! s/ O/ Y/ p* P
  351.                 {
    % i" Z- y4 c% g! P+ ]) Y  N8 f& w
  352.                         PixelByteSize = 4;
    4 y/ Z. ~6 C5 }" B' `& L
  353.                 }break;
    - D7 o) ]& a5 m( g
  354.                 case DMA2D_COLOR_RGB888 :
    ) }5 z) V0 L0 X6 o
  355.                 {/ |3 W7 r6 G9 @6 D
  356.                         PixelByteSize = 3;
    1 N3 B# C, B1 k2 q  `
  357.                 }break;
    / f4 @; `3 a2 {* G  C  J- \
  358.                 default: //DMA2D_COLOR_RGB5655 m' g1 h) E/ v7 E# W
  359.                 {0 Q/ L. k4 d, X1 L
  360.                         PixelByteSize = 2;
    . o5 y3 s9 W# E% z* \2 s  p3 Z  l
  361.                 }break;( ^3 K6 \) Z7 m4 a; p, S" }
  362.         }7 C% l% Z0 o; z1 X6 n
  363.         DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize;        //计算目标开始地址
    + e7 j" o0 c( ~
  364.         //进行拷贝
    5 A% U; A5 p6 \
  365.         DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode, ) Z7 q+ `) w: E5 a
  366.                 pDestHandle->ColorMode, AlphaMode, Alpha);                                                                                                        //DMA2D进行矩形图形填充(会执行像素格式转换)3 ]; C) y0 j- L! v
  367.         DMA2D_WaitTransferComplete(200);                                                                                                                                //等待DMA2D传输完成# O) H( V: V* i
  368. }
    8 p/ }1 l3 Q0 K( E
  369. # e" d3 a  b# c7 n  B
  370. /*************************************************************************************************************************% \& M" u: _1 J' l6 T" d& N9 d
  371. * 函数                        :        void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, * C. k" {' ]. p" \, y! a
  372.                                                 u16 Height)" w: e( y7 |/ J) ?* @- S7 I$ Z
  373. * 功能                        :        GRAM局部拷贝(不支持Alpha)
    ; B( L: ^' m9 h2 ^! D
  374. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;- d2 Z  l) q1 w! f$ I( c
  375.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度
    1 \+ o6 `. B' X0 _7 b8 F0 }
  376. * 返回                        :        无
      A+ T5 Q8 b5 Q5 r; T+ R. P1 v8 Y
  377. * 依赖                        :        底层宏定义# [; J) r& e; W3 {3 F
  378. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>1 p3 y' F3 @& {
  379. * 时间                        :        2020-02-02: _1 }+ H! Q5 e& G6 m" k
  380. * 最后修改时间         :         2020-02-02
    4 U7 E5 z+ F& D, @8 J* C" J& e% `
  381. * 说明                        :        不会检查GRAM大小,请确保GRAM! V3 R7 ]4 i9 G) r4 q0 |+ F
  382. *************************************************************************************************************************/! G( t6 \6 H0 o: y1 q# Q/ g3 V
  383. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)
    ; Z- Y3 J5 x4 n! Y4 C& R/ y  R
  384. {
    3 o3 n# `0 T! f( M+ G3 R/ L
  385.         GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);& G- A) ]4 b) a% d3 L
  386. }
复制代码

' Z0 t1 {! o) T4 g& u' ?1 Z8 R" g; ]/ B+ \" S' x, h4 r. r" ^8 `0 Z
  1. /*************************************************************************************************************3 _. R5 G- {- e7 v4 L4 Z! G: C
  2. * 文件名                :        DMA2D_GRAM.h
    ; T5 N6 x3 ]6 N; ~: M
  3. * 功能                        :        GRAM相关操作
    3 {( Q7 |0 a7 u0 a1 R
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>& c1 W; Y7 P% T+ y0 \' q* ~! l
  5. * 创建时间                :        2019-10-308 Y" _, z. a5 {6 Q$ o' i
  6. * 最后修改时间        :        2019-10-30
    + u6 K+ n' Q6 n) @1 }
  7. * 详细:                        显存相关操作接口- E- e0 M% w& Z
  8. *************************************************************************************************************/        % [$ E6 m- ?% N" l+ {6 M6 m6 V
  9. #ifndef __DMA2D_GRAM_H_
    # n& [5 Q& @& T2 C" \, M
  10. #define        __DMA2D_GRAM_H_           
    ( i9 ~4 G1 t* f+ `* _6 k8 X; W
  11. #include "system.h"! P- k! t0 J( v! E
  12. #include "DMA2D.h"/ m; {% `  B4 B* O" n8 G: A# o
  13. #include "SYSMalloc.h"
    8 e: j% \2 C: N8 W
  14. ( N% s. p- a/ T6 d, z% D7 }
  15. //初始化状态id7 O( x  v9 [+ N5 J
  16. #define DMA_INIT_OK                0x1234423        //初始化成功(不可以释放)
    . B$ |* S0 f# r, h
  17. #define DMA_CREATE_OK        0x3643423        //创建成功(可以释放)$ H* `2 K. j1 S( [

  18. " B4 S; s9 v7 J4 N1 u( G/ H
  19. //颜色模式6 @" e0 k, _, Y& `, p& B/ d" T7 M
  20. typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;% s7 g8 Z4 d1 t6 X' Q
  21. $ F5 g0 ]% B* V
  22. 0 ~0 }' s3 Q: {1 `: L
  23. //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告)
    7 [. \& k4 E( P( e7 h! c
  24. typedef struct
    9 \( t! j. ?* O7 y6 L
  25. {
    8 t5 D& a4 W' m
  26.         void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //绘点函数- c3 {7 {8 n  |
  27.         void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                        //填充  g+ N- n" C* q: k( u$ t! Q1 W
  28.         void (*pClear)(void *pHandle, u32 color);                                                                                //清屏) P4 A" L" `$ [  V6 U
  29. }GDI_BasicInterface;
    2 U' N2 l3 P& m! h+ J8 t/ @
  30. , n: o( T0 c. j( \/ o

  31. 9 Y& l7 E5 N9 u% {& a5 ]
  32. //GRAM相关接口-16bit6 q* K  s) N- G8 y5 l
  33. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;
    ! G5 w5 b! u6 ]7 I
  34. //GRAM相关接口-24bit) t# `8 T: t/ n/ T' m, F/ k4 w2 q
  35. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;
    6 h+ l% Q* E2 D/ y+ _, ^: I
  36. //GRAM相关接口-32bit
    ; ?8 A- t! W9 @
  37. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;, W$ D2 ^1 m) f# a0 W3 k

  38. 8 d+ U8 C; f1 S. @
  39. //所需的内存申请接口* L+ x, v1 f; R
  40. __inline void *GRAM_malloc(u32 size): r9 Y* ^. T# G+ Q0 D
  41. {) ^# {' G! f6 y7 ?
  42.         return mymalloc(SRAMEX, size);                        //内存分配(外部调用)-使用外部SRAM4 j. l" @+ Y* a3 c
  43. }: J1 {# ~( D/ K2 i. I

  44. & E0 A& s! |" W& C0 c% X" m( N+ d
  45. //所需的内存释放接口2 x% F7 s$ }% H
  46. __inline void GRAM_free(void *ptr)
    ' V6 N0 N6 I: ?; i( a5 s& Y
  47. {
    ' i8 e( [# M+ c& Q$ O! [
  48.         myfree(SRAMEX, ptr);                                        //使用外部SRAM
    / f" M2 N7 Z% [; l& c3 N- m
  49. }) a7 I5 }3 [, i, u$ u

  50. ! K7 ]4 y$ x" I2 u

  51. 2 l7 c; O3 b0 b' {8 z
  52. //显存句柄7 ~8 K) y( R5 a7 z9 B# E- l# q
  53. typedef struct+ o& _8 T+ ?) @) }! t3 H5 Q
  54. {
    3 p) |2 v4 O7 B, S/ v
  55.         u32 InitStatusId;                                                                //初始化状态id
    + `" v9 i" t, \( N6 \5 t
  56.         u32 GRAM_Addr;                                                                        //GRAM地址
    6 y# O8 {" d  `+ X) d( T: e) ]
  57.         DMA2D_COLOR_MODE ColorMode;                                                //GRAM显存像素格式. r4 t0 @3 u* B1 T( z* ?- V9 j
  58.         u16 Width;                                                                                //GRAM宽度' l, F% _- `$ p
  59.         u16 Height;                                                                                //GRAM高度$ A% p$ i* U) G$ y  ^1 e
  60.         u32 *pGRAM_32bit;                                                                //32bit颜色模式下显存指针5 F7 R2 ], s9 [4 A2 o5 r
  61.         u8 *pGRAM_24bit;                                                                //24bit颜色模式下显存指针$ O- Q4 k( Q# s4 Y: x# d' ~0 `
  62.         u16 *pGRAM_16bit;                                                                //16bit颜色模式下显存指针
    5 q  k" F6 V; s! w! p; ?
  63.         const GDI_BasicInterface *pBasicInterface;                //底层GDI接口4 r8 G, d4 z. I7 o
  64. }GRAM_HANDLE;7 ]9 `4 A9 r3 O% w3 }  u4 q! G
  65. 2 J. b, p" A( B2 Z7 C4 b
  66. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);        //GRAM句柄初始化(不会申请内存)
    4 o; I5 U/ F% H! s. b8 ?
  67. void GRAM_Delete(GRAM_HANDLE *pHandle);                                                                                                                                        //删除一个GRAM(会释放内存)
    ) L6 a3 |) [! z
  68. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                                                        //GRAM矩形填充(使用DMA2D)
    9 j& D: x! x7 R4 B6 i; _9 \5 i% |, P: V
  69. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color);                                                                                                                //GRAM清屏(使用DMA2D)8 X2 m" Z  {- V. C% q) x7 f9 F
  70. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);                                                        //创建一个GRAM(会申请内存)$ q8 E7 R- K$ L8 Z
  71. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, / d+ v3 x6 c0 q( z$ F7 {/ \; i
  72.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);                        //GRAM局部拷贝(支持Alpha)
    , Y% ^/ s9 }; P1 J0 G! _2 s% H$ ^
  73. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
    2 A# }( A# v9 m7 ^
  74.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height);                                                                                                        //GRAM局部拷贝(不支持Alpha)5 Y. Z3 p$ i1 @$ @( O

  75.   k: s$ f3 x. B5 M  s
  76. #endif //__DMA2D_GRAM_H_
复制代码
  1. /*************************************************************************************************************
    / U% J# J; v+ G# }- E
  2. * 文件名                :        GDI.c
    ' Y% R$ j0 C+ V7 s" r" J
  3. * 功能                        :        图形设备接口(Graphics Device Interface)2 q  y# e' [: B" J7 _# v  n5 ^
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ( o4 G' i9 a4 M, h4 X
  5. * 创建时间                :        2019-11-02$ b$ o! G" u0 C) r+ k$ |& ?
  6. * 最后修改时间        :        2020-02-02. D. Q5 b* a9 j
  7. * 详细                        :        STM32F7 图形设备接口
    0 E1 k. Z' q  N6 B) W4 u
  8. *************************************************************************************************************/7 ?) m1 q% E( k4 X- W! L
  9. #include "system.h"
    ! l0 C, |( M, G6 ]
  10. #include "DMA2D.h") h9 H. {3 `5 [
  11. #include "stm32f7_ltdc.h"
    , F( E8 K* h+ u+ f5 ?# J6 P$ V
  12. #include "DMA2D_GRAM.h"+ o3 V' j! j0 k5 W/ K: K2 a, d
  13. #include "GDI.h"
    + `6 y" [0 Q" \" w/ b/ P) {( ?
  14. 0 F/ [# {: ^) p1 W" o
  15. //显示器Layer1 GRAM定义* l; p" ~4 }% M
  16. const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle =
    9 I" ^  ]! I# a7 O- l
  17. {
    " R, x* S1 ?4 \1 h! t* m
  18.         DMA_INIT_OK,! O6 Q; t$ t! K6 [9 E" @5 G1 z
  19.         (u32) &g_LTDC_BUFF_RGB888[0],        //GRAM地址
    & p, i# z0 @2 \% F7 \) t! F
  20.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    / Q/ G' |: l- D  X! p! M1 W
  21.         LTDC_WIDTH,                                                //GRAM宽度4 K1 ^! u& D6 L; {; u, i# m# C. V
  22.         LTDC_HEIGHT,                                        //GRAM高度
    * e) ^" k% X6 a. Q% x+ k$ P
  23.         (u32 *)&g_LTDC_BUFF_RGB888[0],        //32bit颜色模式下显存指针4 q# V9 B! N! ?* M) t% g0 W7 D
  24.         (u8 *)&g_LTDC_BUFF_RGB888[0],        //24bit颜色模式下显存指针
    5 e: i5 ?! a6 O" b; P
  25.         (u16 *)&g_LTDC_BUFF_RGB888[0],        //16bit颜色模式下显存指针8 U( K0 V7 p8 O& {( t
  26.         &cg_GDI_GRAM_Interface_32bit,# }% f9 d7 f5 m; `5 G9 s# M/ m
  27.         % o; j4 ]2 ]8 y1 v& V6 d
  28. };3 a( f4 e" G6 N5 }
  29. + b4 y6 x7 ~6 S/ m4 p$ u) n5 X! Y8 x
  30. //显示器Layer2 GRAM定义
    ) o. V' ]) s1 h6 ~7 f7 v9 z* v8 s
  31. const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle = 7 @, w2 O: P5 }, E
  32. {
    , H7 N# D' U: z+ Y1 B" L; |2 W, [- g
  33.         DMA_INIT_OK,) S% V1 ], f3 ]& B& G: t2 g
  34.         (u32) &g_LTDC_BUFF_RGB888[1],        //GRAM地址
    + Z2 e5 n& w5 _/ c  K
  35.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    / ]7 G' G" y8 d( n
  36.         LTDC_WIDTH,                                                //GRAM宽度
    ( @! ^% \, K* G% ]- T$ E: c
  37.         LTDC_HEIGHT,                                        //GRAM高度8 p# G/ `7 s+ U! }  l. _" j/ p; c
  38.         (u32 *)&g_LTDC_BUFF_RGB888[1],        //32bit颜色模式下显存指针
    - ~2 f6 L+ ^+ V8 h  ~- y
  39.         (u8 *)&g_LTDC_BUFF_RGB888[1],        //24bit颜色模式下显存指针
    : \; [7 l: Y1 f% T5 ]* g
  40.         (u16 *)&g_LTDC_BUFF_RGB888[1],        //16bit颜色模式下显存指针! i  X& F/ r% o9 d" Q
  41.         &cg_GDI_GRAM_Interface_32bit,
    * d) }2 n$ X  P6 a8 F$ V6 u
  42. };, g: T: ]5 y9 ^) z, I

  43. 1 W: P  N$ _$ n  O: g+ j! Z9 X. K

  44. ! t. x9 [' h% u# _
  45. /*************************************************************************************************************************
    7 z5 Z3 T* o% E& \6 O# k; z: F
  46. * 函数                        :        void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
      Z* c  E+ ?6 ~/ Z9 c
  47. * 功能                        :        绘制空心圆
    / m. }' [  G6 Z5 m1 l7 C4 J' z! z
  48. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色
    * I* \6 @+ h7 p! M
  49. * 返回                        :        无
    " B* ?- d# ]% [1 q
  50. * 依赖                        :        画点函数
    % g' ^' g8 X! G& K
  51. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>( H  Y% R+ I  g3 W. @# Y2 X  ^, @  e
  52. * 时间                        :        2011-09-201 t6 d: Q% c- T& e
  53. * 最后修改时间         :         2019-11-02; J. n0 K7 s, t% R) i2 l# x
  54. * 说明                        :         无
    & S1 ?# k9 _3 P' v% r  ]
  55. *************************************************************************************************************************/5 Y: ]: }) [- q  L( G! A% z  p' Y
  56. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)' s4 l4 s! c* [/ j7 |
  57. {! k6 J. C7 j2 T3 L; }/ e: ]
  58.         int a = 0,b = Radius;# C0 S" |) v$ E3 T# o
  59.         int di;0 w$ T9 s* e( u) D
  60.         di = 3 -(Radius << 1);           //判断下个点位置的标志! }' D1 R2 @% ~* ]* u
  61. ' K0 J/ S5 E6 `2 ]
  62. #if(GDI_PARAMETER_CHECK)                        //参数检查
    # U& Y8 E% G# ~" j
  63.         while(pHandle==NULL)
    1 V6 K/ x! y+ R% p% M/ }, w& g
  64.         {
    ( K6 ?; K% L9 e0 S; t  K4 i7 T
  65.                 DEBUG("无效的句柄 pHandle\r\n");, [7 s/ j7 P, ~) v& g
  66.                 SYS_DelayMS(1000);
    1 y" b$ Z" [( g
  67.         }          w8 I- S7 \" ?3 h' H
  68. #endif //GDI_PARAMETER_CHECK
    2 y* A- J$ {; k* L6 G, Z
  69.         
    ( @6 T. n0 F4 r0 c) ^' v1 ~' m
  70.         while(a <= b)2 T, R: {4 W$ ]' t4 L
  71.         {* z( g, G( M: ^9 y+ D7 x
  72.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //3           
    * g" O# N( S( Z% o6 _# c
  73.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color);             //0           
    ( N+ l9 R- ]: P7 v$ j3 t3 h
  74.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color);             //1      
    & s4 d: ~5 C6 M1 ?1 ]  g# O. ^! V
  75.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //7           0 B( Q: p0 h0 W) ~: ~
  76.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color);             //2            
    7 o' B# V- D. f4 E6 g
  77.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color);             //4               
    . Y. {$ ?4 N- u1 n2 j" f3 k
  78.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color);             //5% ]& q. v; e. D" p+ K
  79.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color);             //6
    2 {0 Q% v; v! O6 |6 e2 J
  80.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);            
    4 W2 W( I, P% |
  81.                 a ++;+ g( K6 E* o# _" o
  82.                 //使用Bresenham算法画圆     
    # i+ ^* _  l9 n+ v  z
  83.                 if(di<0)
    6 d& W- v6 F, \% p. F) A% r! j
  84.                         di += 4 * a + 6;                                                                                    
    2 |* e$ }3 P$ I0 x" U
  85.                 else
    # Z7 f* j$ j. W5 ?2 o
  86.                 {
    ! j% U, D! B6 n7 U7 T
  87.                         di += 10 + 4 * (a - b);   
    7 ~2 U5 y. a) u+ x
  88.                         b --;* F0 |4 J; ^' E0 P( q0 t4 H
  89.                 }                                                                                    # i% J- U1 B# f
  90.         }                                                                                 
    0 G' k: o$ b4 u  u" r9 V. V' ^5 `
  91. }) J$ ]. T) K1 a' Z( W1 |
  92.                                                                                                                                           
    ( o9 s6 S) x9 q' {3 o" |
  93. , x: \# A# P8 W* E9 m5 G- v
  94. /*************************************************************************************************************************1 c1 U- K1 X4 n/ J- @
  95. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)' O; ]8 A. l" g7 y
  96. * 功能                        :        绘制直线(可以倾斜)- N) x+ k9 E& {; E* v) ]  k
  97. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色
    6 h2 H& i8 _/ U" [' |
  98. * 返回                        :        无
    5 I( G/ D, G0 K# @
  99. * 依赖                        :        画点函数4 S! y- y; ~& J( v5 r
  100. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    : }2 B0 x- v1 I! _, }
  101. * 时间                        :        2011-09-20
    ( u& Q$ n" D, u% {! k4 K3 M  Y
  102. * 最后修改时间         :         2019-11-02! X- x3 x8 s- L* a5 Z
  103. * 说明                        :         无
    ( g0 V! m: G4 p/ {3 Y
  104. *************************************************************************************************************************/6 v7 m5 g! d  X
  105. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    : ?+ e  f  V; Z, O# q# \
  106. {  c3 X. ]) ]2 c, P/ _
  107.         u16 t; / `4 K; }; s3 @' _/ E
  108.         int xerr=0,yerr=0,delta_x,delta_y,distance; 1 u  e- y, l9 K$ \' x+ K) K
  109.         int incx,incy,uRow,uCol;! s! g: g6 l4 W
  110.         4 X3 C, D$ O' W& `" {* i+ _
  111. #if(GDI_PARAMETER_CHECK)                        //参数检查
    ) `  C" |& U) O1 u$ a
  112.         while(pHandle==NULL)% p+ e( _- N! t" k3 g
  113.         {
    * A+ K5 _. n# v: C9 E/ d
  114.                 DEBUG("无效的句柄 pHandle\r\n");
    # @$ e. O0 ]2 R  A5 Z& m9 c
  115.                 SYS_DelayMS(1000);
    ; e6 ^5 m6 Q* _
  116.         }        
    & R3 y# [; Z. `3 K6 O3 b
  117. #endif //GDI_PARAMETER_CHECK        % s1 L5 e; |" K- F! r* p
  118.         
    5 [; ^4 _+ q, l
  119.         delta_x=ex-sx; //计算坐标增量
    ; N# ^1 Q9 a4 W: @
  120.         delta_y=ey-sy; 0 K6 l, M) k3 U* F. z5 ~  n
  121.         uRow=sx;
    & z' i8 T1 ^" |; N4 `
  122.         uCol=sy;
    ; o' F! P) M& z9 A
  123.         if(delta_x>0)incx=1; //设置单步方向
    7 |; I" `) [0 z! @  r
  124.         else if(delta_x==0)incx=0;//垂直线 0 e& L  W5 {7 K- t" n2 M
  125.         else {incx=-1;delta_x=-delta_x;}
      e9 \+ B# G- P+ D: U: Y2 ?
  126.         if(delta_y>0)incy=1; # C) C4 {4 B% ?! Q+ W; i
  127.         else if(delta_y==0)incy=0;//水平线 4 g# b% t1 _; D0 |" {
  128.         else{incy=-1;delta_y=-delta_y;}
    ( e5 y2 l2 L0 E% [
  129.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
    " V, V+ H* y2 s6 {8 R1 p
  130.         else distance=delta_y; 2 E5 s) I# b# W7 u0 a4 w+ G
  131.         for(t=0;t<=distance+1;t++ )//画线输出
    ! l" B) W2 m: L6 p, |
  132.         {  - F+ N# ~7 p! u2 q  s  R
  133.                 pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点
    & U+ Y  E/ ?; f" E2 c4 p9 n5 t
  134.                 xerr+=delta_x ; 3 L6 Y4 j+ ~4 n. e: K5 B2 o# z; M
  135.                 yerr+=delta_y ;                                                                                                 : w$ t9 l: l' _7 H! f' g7 K
  136.                 if(xerr>distance) ; c2 C$ p+ x# X. I& v, S/ _
  137.                 { . Y" [/ ~6 }* Z" u; N
  138.                         xerr-=distance; : V9 m" n( r7 G: n% i, h6 w) Z
  139.                         uRow+=incx;
    . H' F* `6 S# [/ b
  140.                 } 1 O/ `2 @- j& n: L) @* t+ n! A$ t. O4 g
  141.                 if(yerr>distance)
    5 Z+ p3 \" d; `+ X9 J- j
  142.                 {
    4 \7 \. p; k% ~9 y) j; h$ T
  143.                         yerr-=distance;
    4 e6 \+ \' W# n8 z+ m. S0 k: o! A
  144.                         uCol+=incy; / ]3 ]3 c9 w) G9 v  e  n. y! ^2 a& \
  145.                 }
    9 L& u$ u1 f( {% n# H1 E( c
  146.         }  , U- x' Z4 U6 |- Q6 z! k2 M4 B
  147. }
    2 o& f, `$ x9 C% Q0 j

  148. 0 m- A: Z0 S2 @7 j* B
  149. ( r( h# u1 d$ O1 @/ d0 }
  150. /*************************************************************************************************************************# @1 R% k2 }; A) T6 N
  151. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)# U8 ]2 t: h  Z7 c
  152. * 功能                        :        在指定位置画一个矩形) W$ A* A4 \! P! u
  153. * 参数                        :        pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色
    $ V9 ^9 t; b; i3 e
  154. * 返回                        :        无
    % }/ l( ?- U# R* u5 S
  155. * 依赖                        :        画线函数
    1 N/ q" ]+ E+ q5 n
  156. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    $ R9 T; {' z% M& D( u
  157. * 时间                        :        2011-09-20
    $ p* X0 r2 q0 B3 c" P8 k- V% }6 M" B6 T
  158. * 最后修改时间         :         2019-11-02- G% k% ?2 p; q4 W0 g* X
  159. * 说明                        :         无: I! w9 s- H$ t7 t1 D8 M
  160. *************************************************************************************************************************/1 |+ D7 l& \& h7 s* z0 c& g' n( s
  161. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)
    * L$ J+ F7 G4 t5 P6 ]- O- F
  162. {
    8 p% C$ \3 e- I* }5 L
  163.         
    % w" v" n' m. }3 I  _1 \3 C& ?8 b
  164. #if(GDI_PARAMETER_CHECK)                        //参数检查8 y* V; o0 l; @
  165.         while(pHandle==NULL); w9 f( ?' H& ~: r
  166.         {
    0 _3 N( s" W) c+ f9 `6 {2 j
  167.                 DEBUG("无效的句柄 pHandle\r\n");
    4 e8 b* e) r$ S$ x" M
  168.                 SYS_DelayMS(1000);
      u( K( z; f' |
  169.         }        
      U; d; n) l9 B! K% `- l
  170. #endif //GDI_PARAMETER_CHECK
    $ X) N2 c5 f- z2 D% m
  171.         8 c. n8 Q1 p( w! b+ k4 e
  172.         GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);8 x! G5 N* k: l; h8 v( ^
  173.         GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);. [- b! c9 g8 N6 z$ X
  174.         GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);/ c% [. n" o- N! V' [, i8 [
  175.         GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);
    ; f- V' e  V1 y
  176. }                                                                           
    4 ]8 o' R' G2 t) Z# ^6 x0 P! _8 F3 _

  177. 8 I: i6 V8 U& \, r/ u/ |& {( N: L

  178. & f+ V- R# C. r/ h6 r
  179. /*************************************************************************************************************************( j$ w0 q1 F4 O, p& O
  180. * 函数                        :        void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)& o& V+ k/ s+ H9 [
  181. * 功能                        :        画一个2*2的大点
    ! Y( W) E5 q2 ]1 ?9 u# M
  182. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色
    " T- l+ \8 `* f. W9 T
  183. * 返回                        :        无& s; e1 K  `! R. g$ l
  184. * 依赖                        :        画点函数. z- v& U4 N- @
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>3 Z/ z5 G2 A. n* X" N
  186. * 时间                        :        2011-09-202 m" O2 j" p7 v1 X
  187. * 最后修改时间         :         2019-11-02; s5 `* i+ u& D3 Z" p: @+ P. t
  188. * 说明                        :         无
    ; r2 B: R1 i" X2 Z) C) i4 R
  189. *************************************************************************************************************************/
    ( w9 R, ~3 _: {) b
  190. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    : ^# ^+ @' U# Y: O: t$ K3 J) F
  191. {        
      E4 h: F% `# _! N3 y
  192. #if(GDI_PARAMETER_CHECK)                        //参数检查: m, A2 }" m  M( u2 U
  193.         while(pHandle==NULL)
    7 b, [2 n0 k! x! O( V2 s2 P$ E% m( ~
  194.         {
    7 u6 p3 c5 w' i8 o$ E
  195.                 DEBUG("无效的句柄 pHandle\r\n");
    ) ^# k5 p( r; x2 R2 q
  196.                 SYS_DelayMS(1000);
    9 _5 B( r  n4 L  W* t, W
  197.         }        
    . K0 X2 b, W+ i! l% s( B) C
  198. #endif //GDI_PARAMETER_CHECK! |, B" n4 V! M, W
  199.         ! h! ^. t0 q5 ]. K. w
  200.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                //中心点 ! {1 K3 R! T3 g9 H& c3 B
  201.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);
    $ t4 B$ w6 T3 y( H' B5 R
  202.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);
    0 [/ o3 s$ u5 d% Q2 C/ E; a
  203.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color);                           8 v: ~( ~& @1 ?, c! k2 }& Z$ A$ Q
  204. }        
复制代码

9 B8 ^" v( L8 I6 z* x9 W$ `
8 z& _$ Q  U9 w& u* j' P
  1. /*************************************************************************************************************
    ( z, G- @3 {- z! D
  2. * 文件名                :        GDI.h1 E: C, q9 m* x* |
  3. * 功能                        :        图形设备接口(Graphics Device Interface)$ v$ j2 d5 l' H+ c/ R* h
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    % \9 L& C% E& G! h  Q" A
  5. * 创建时间                :        2019-11-02( {7 B7 Z3 l( F% O% p( {9 t# u
  6. * 最后修改时间        :        2020-02-024 G" r  }2 \) E* J
  7. * 详细                        :        STM32F7 图形设备接口2 ~* T3 F, ~* ?5 v, i# B
  8. *************************************************************************************************************/  U9 k2 m2 J- N! S
  9. #ifndef _GDI_H_& D" [7 L; C# l! c  \, H
  10. #define _GDI_H_
    8 m4 u) z) s& I
  11. #include "system.h"
    , ]; a' W$ p4 `/ ?/ b2 s& Y) S
  12. #include "DMA2D_GRAM.h"
    : M# n8 Y- W; q) z

  13. + [# U0 t1 n" v8 ?3 t
  14. #define GDI_PARAMETER_CHECK                1        //参数检查-主要检查指针
    ) z" X6 {" e7 Q
  15. #define GDI_DEBUG                                1        //调试输出
    , c+ o, Y& S4 H" R
  16. ! \; }3 i0 a, s: B4 `  Y0 E& q9 y9 D
  17. #if GDI_DEBUG" d( K+ r$ @2 ]& y, M" ?3 o
  18.         #define GDI_debug(format,...)        uart_printf(format,##__VA_ARGS__)
    3 H' [$ w# @( N
  19. #else! r- @: I7 K/ w$ H. G
  20.         #define GDI_debug(format,...)        /\( G4 \% P% H& o8 _+ v
  21. /; A# P+ Q" _: l* \+ c8 Y
  22. #endif        //GDI_DEBUG# s, V9 |/ T& x* M: m0 C- I1 J# E9 q

  23. 8 H' w1 U- C( X. W! t5 W# V0 X

  24. $ w* Z, M; b- E" @0 F3 R- r3 n% O

  25. - u: N# x5 A. ]1 d# H( n' t/ Y
  26. extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle;        //显示器Layer1 GRAM定义8 z& Y* ~$ u8 l6 P7 O; e$ {
  27. extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle;         //显示器Layer2 GRAM定义
    9 b! k+ t' {/ T0 W. g
  28.         
    : {. j( a* }5 [, j' o" g
  29. #define LTDC_Layer1_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle)        //显示器GRAM 1
    ( F  s( h# w' M: }- {9 f4 b8 l
  30. #define LTDC_Layer2_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle)        //显示器GRAM 2
    9 C  K6 F# t+ G8 i& W; ?2 D5 R! X3 @  E
  31. 5 F" t, Y' D% p: A, Z
  32. //GDI相关API
    6 j: o' }- m2 j, D' ]9 S1 U
  33. __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    9 }' l3 z; R, T
  34. {        
    7 S7 o& c% R' [' d9 W7 d
  35.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                                                //画点
    ) s4 `: b  b7 Y
  36. }        / l$ t* l7 x3 s9 }) B9 y
  37. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color);                        //绘制空心圆
    ! J7 g# M# T% A! w2 j
  38. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color);                        //绘制直线(可以倾斜)
    4 e+ F0 a. N! v; O6 i
  39. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color);                //在指定位置画一个矩形
    2 S/ q3 O: \9 A% {3 }8 k, }# `7 s/ I
  40. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //画一个2*2的大点7 j9 ?- Q0 [+ f

  41. . J! N4 p4 g' l  C

  42. 7 x$ b7 _. a1 S- i9 F2 s
  43. #endif /*_GDI_H_*/
复制代码

8 q/ g. D# e6 A7 b' B测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。
/ z+ n4 d4 C- M6 _8 H, e  k9 a( I& r9 ^: {" k) G, B! z* L
  1. FIL *pFile;/ M" N6 a0 ~6 A; M! b5 q: ~9 i, U
  2.                 FILE_ERROR mError;/ S  T5 C2 P7 j8 E' J
  3.                 GRAM_HANDLE *pGramHandle;
    / n% i/ j: e  Q( q% C( Q- J. H& ~
  4.                
      T3 |& C' O8 `# G0 {, Y) \( k
  5.                 pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565);        //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB5653 p5 h1 u' S) s* q
  6.                 if(pGramHandle != NULL)
    & ~* h( {9 {& d
  7.                 {
    3 P. h! w" \3 S. x
  8.                         GRAM_Clear(pGramHandle, 0xff00);                                                //清除显存,防止读取失败了还是现实上一次的图片
    & E' }$ Q* ]( A
  9.                         uart_printf("[OK]GRAM初始化成功\r\n");
    6 Z, b3 u' D4 N* h8 y/ i: `9 P, P
  10.                         pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);  G+ K0 t. Q: l% u# F, ]1 d! B% Y
  11.                         if(pFile != NULL)
    $ T$ L  ]0 [& m0 X! _. h2 b
  12.                         {
    & k! }% l# T) |1 c; r
  13.                                 uart_printf("[OK]打开文件成功\r\n");
    ) ]$ h6 p7 z+ U
  14.                                 if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中
    6 M4 _- g( A$ u. ]' i4 m6 ]
  15.                                 {
    1 j" k/ m& W$ i& t% x' {, O5 B
  16.                                         uart_printf("[OK]读取文件成功\r\n");
    ' k9 l- ~8 Y% z/ r, c* o4 p
  17.                                 }
    + c7 f/ S2 P$ R% A
  18.                                 else! v$ i6 c# A- G, Y; b
  19.                                 {% R& q" X5 z# U
  20.                                         uart_printf("读取文件错误:%d\r\n", mError);: O, }2 }1 \  K* i+ R) G6 Y
  21.                                 }0 B5 t9 d, W/ u0 u6 l
  22.                         }, A$ U0 K) J0 w- l
  23.                         else
    ( M5 @. h- {( G$ W: I6 I
  24.                         {3 k8 r. i& o  T, T4 e
  25.                                 uart_printf("打开文件错误:%d\r\n", mError);
    % k' T# |* A) q
  26.                         }' s% j+ P/ c. R8 Y/ s1 a* X- |
  27.                         //将显存拷贝到屏幕中' p% n" t. [1 z5 d; m/ h
  28.                         GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240);                        //GRAM局部拷贝
    + d2 N! O2 O; M/ \" f8 ~1 P
  29.                 }
复制代码

- r: M- Z* a# h: v& i* c# y* }5 o  K0 I- j1 N' r* b) ?
4 n; p7 N" Z9 s* S6 G# S# M2 j+ Z
收藏 评论0 发布时间:2021-12-16 21:00

举报

0个回答

所属标签

相似技术帖

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