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

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

[复制链接]
STMCU小助手 发布时间:2021-12-16 21:00
DMA2D可以加快图像填充,并且支持像素格式转换。
& k$ M8 ]' c& ]; c) G; ], J! [' b& e+ D3 o  S9 C( N
  1. /*************************************************************************************************************& Y6 P3 d& G- E+ p; v
  2. * 文件名                :        dma2d.c
    + o0 Y2 Y0 l6 J% y! C7 J
  3. * 功能                        :        STM32F7 DMA2D驱动4 j+ l# x: d' c7 b! f
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>$ G3 |- j7 u- O$ s2 n
  5. * 创建时间                :        2019-10-29. c9 y1 Y: m- p! j0 u6 T. d
  6. * 最后修改时间        :        2019-10-29
    ) q5 u0 D( c7 o* c9 W" J; e9 c& y
  7. * 详细:                        
    2 c! w5 P: I) r4 O  X4 n8 U# |
  8. *************************************************************************************************************/        
    6 g6 v0 b' A* Y8 P" T: }
  9. #include "dma2d.h"* v5 E! W( y: F* h* u
  10. #include "SYSTEM.H" $ Z  l2 F# E5 ^6 L2 x, F

  11. & w& C; w) Z# J( k% D3 D

  12. , z3 c! A9 n: ]' f# A/ t, `
  13. /*************************************************************************************************************************
    ' r2 R, V8 R8 v8 d! T) _# H
  14. * 函数                        :        void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color)
    9 [; K( ^! ^; q$ y- C  C8 k- o" A
  15. * 功能                        :        DMA2D进行单色填充! b- |1 \+ y3 j+ ^/ e0 A# m
  16. * 参数                        :        FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;: B$ V3 C) ~7 B9 z) r" C6 x9 B
  17.                                         ColorMode:颜色模式;Color:颜色值# K2 k1 C% E5 s6 m
  18. * 返回                        :        无& l* w$ _; S8 [
  19. * 依赖                        :        底层宏定义! F; T  J* j( Y6 n9 ?9 c1 m6 ]
  20. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    $ @! v  N9 m- h6 Z
  21. * 时间                        :        2019-10-29, l- H! n' ]! I7 g# Z
  22. * 最后修改时间         :         2019-10-30
    & G# P+ {% N$ L' m% |
  23. * 说明                        :        用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束% Y4 A0 U- [; i
  24. *************************************************************************************************************************/
    - B2 ~" A/ S1 J8 f) I( J4 B- }9 \
  25. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color): I7 m8 x- o. I* G- E
  26. {
    9 }8 X- z9 y" B
  27.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    ( V+ P( ^  o* ^. H
  28.         DMA2D->CR = 0;                                                                //先停止DMA2D
    ' V, j' O  c6 `) H/ G/ l: G
  29.         DMA2D->IFCR |= 1<<1;                                                //清除传输完成标志
      z  L! K: N3 f
  30.         DMA2D->CR = DMA2D_MODE_REG<<16;                                 //寄存器到存储器模式  W2 }" b" d9 z
  31.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式
    1 E: i& Z& b  r' m6 `+ T/ C
  32.         DMA2D->OOR = OffsetX;                                                //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充7 O* h* O+ v/ s3 u
  33.         DMA2D->OMAR = FGRAM_Addr;                                        //目的地址4 |( f- b8 G. K) q' _6 s( @% J& x
  34.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    3 Q& S- O, h3 O( j4 R
  35.         DMA2D->OCOLR = Color;                                                //输出颜色
    6 @$ q: B8 f9 I0 O
  36. : z! ?" n4 x0 X( s3 F' R3 c
  37.         DMA2D_Start();                                                                //开始传输
    ; i: y1 i+ \$ J2 c9 u
  38. }% T  e' U1 N# ^
  39. 8 Q2 n7 o: L! O4 J  R* j! x
  40. 5 N& d8 I6 O  S2 o; N
  41. & U6 ?* O2 A' O
  42. /*************************************************************************************************************************2 P, m. F: ^. {$ S! e$ N
  43. * 函数                        :        void DMA2D_WaitTransferComplete(u32 TimeOutMs)+ {; J- V0 v, o3 [/ y
  44. * 功能                        :        等待DMA2D传输完成: R# k8 r& V( m' I3 Y
  45. * 参数                        :        TimeOutMs:超时时间7 t8 J9 j# J0 [1 Q2 p
  46. * 返回                        :        无
    0 W" g; H: `) k1 f- h4 U
  47. * 依赖                        :        底层宏定义
    * c+ Y+ L3 B5 t* V! A% V
  48. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    9 @$ ^- s. o. r5 n9 U
  49. * 时间                        :        2019-10-30, d. b. w7 H4 p$ T" b
  50. * 最后修改时间         :         2019-10-304 S4 n7 Z+ Z! T' O& f
  51. * 说明                        :        超时后会取消传输6 l6 k6 B! T& x& T
  52. *************************************************************************************************************************/
    9 T" ?& t" A0 b1 X) n* k5 ?$ w) b
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs)
    5 [  t5 X) e! M( X
  54. {
    8 L7 l3 u. x4 A* k
  55.         u32 timeout = 0;
    . l& G5 _2 ?% C0 A! f' y* G* |
  56.         - z1 z$ r9 G$ j# g- W4 d7 Q
  57.         while((DMA2D->ISR & (1<<1)) == 0)        //等待传输完成& C, q; |8 k9 b  D0 z0 s
  58.         {5 [9 d5 }1 @% v& d
  59.                 timeout++;
    % o' L; s- ]' W- G5 q& u
  60.                 SYS_DelayMS(1);                                        //延时1ms3 V. c4 v+ _5 i9 r, S
  61.                 if(timeout > TimeOutMs)3 t% C: p9 Y, n" _5 T
  62.                 {  r& n) O! F6 m+ M8 f
  63.                         DMA2D_Abort();                                //终止传输
    / w* @/ F, ?2 m( z* {$ c% X0 e) g
  64.                         break;                                                //超时退出
    " w/ {% ]; L, a9 i! ]0 f6 A6 z
  65.                 }
    + e5 Q  R! `) @8 S$ w" A, \' g3 K- L
  66.         }  . Z  [8 T6 a3 p. x+ U
  67.         DMA2D->IFCR |= 1<<1;                                //清除传输完成标志         
    + z3 S- L  l9 ^6 z
  68. }
    6 K- D# P$ F" @9 d- }( H/ X

  69. 3 ]# y% K- \) v( u
  70. /*************************************************************************************************************************
    9 ^5 g* r' J6 G! d8 ^3 k6 w
  71. * 函数                        :        void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)+ x2 R% N, m$ _6 [" Y+ m
  72. * 功能                        :        DMA2D进行矩形图形填充7 }4 B$ m# V' [
  73. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
    0 ?2 J6 l# X4 F9 D. n! [) |
  74.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    9 E7 p$ R2 w$ R/ M; c
  75.                                         ColorMode:颜色模式  U- C2 s. O6 O' f8 U! h" {
  76. * 返回                        :        是否设置成功
    + I/ [1 K+ K1 Y4 O
  77. * 依赖                        :        底层宏定义
    3 `# ^5 ]5 v" }) z
  78. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>' n7 R1 e+ N2 E# c0 a
  79. * 时间                        :        2019-10-28
    % G& l  b1 n7 c0 v% Z- s
  80. * 最后修改时间         :         2019-10-28
    : N" @1 o2 Y* s) |
  81. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束
      m. w' k, E2 s2 z: R2 }8 w
  82. *************************************************************************************************************************/
    8 m* }& L( }2 w9 d& X8 h
  83. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)
    ) |( V; O2 s  g
  84. {
    * d! Z6 ]9 L. j. z$ ]: f8 @
  85.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟
    1 B. q% |8 z& v% F' t
  86.         DMA2D->CR = 0;                                                                //先停止DMA2D/ B; ]/ V7 B8 x  x; i4 Z" Q  G
  87.         DMA2D->CR = DMA2D_MODE_MEM<<16;                                 //存储器到存储器模式
    . N( L! C" p7 A) Q" ]
  88.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数
    ; W' L, M7 \6 `2 V! G
  89.         DMA2D->OPFCCR = ColorMode;                                        //输出颜色格式% F# |* V( z, J7 c" i' W
  90.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址2 m, j& R4 p! O+ z1 x; J
  91.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移 9 w2 o0 F. Z+ n% f& G' B; b
  92.         DMA2D->FGPFCCR = ColorMode;                                        //源图像颜色格式
    8 D2 K: R  j8 }
  93.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充" {5 ?. \$ V3 G' o- M' P
  94.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
    # P# X5 E6 ^7 J; x7 p
  95.         
    + ~8 N% r3 v2 q$ w$ A3 `
  96.         DMA2D_Start();                                                                //开始传输# Z! Q+ V" e9 o/ _* A! U1 l
  97. }
    $ P. i0 M# x  a) x( v* ?* L
  98. 6 o9 ?* G/ C( i3 t9 B
  99. 2 T- ^' u) G% B1 }$ I
  100. /*************************************************************************************************************************
      v+ Q' B+ J5 q
  101. * 函数                        :        void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
    ! E( a# c# P6 N4 M" y0 W  z
  102.                                                 DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)% ~# N8 _' N* K. ]
  103. * 功能                        :        DMA2D进行矩形图形填充(会执行像素格式转换)# j5 d. w9 v0 g1 m' F5 _5 G
  104. * 参数                        :        SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
    6 ^5 J" b9 k- M4 H; e
  105.                                         Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
    ! T" A2 l9 H$ @8 o4 R7 v6 E
  106.                                         SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式
    ' n. Y  i, `4 k6 c( ]
  107.                                         AlphaMode:alpha模式;Alpha:Alpha值;8 _% F& T3 s: P: }( z
  108. * 返回                        :        是否设置成功  Q2 ~4 q# P: R5 c5 G) }8 K
  109. * 依赖                        :        底层宏定义/ E% D- z; b# A: y" i' y
  110. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    * S# C8 Q) \8 P' ~
  111. * 时间                        :        2019-10-28
    0 s# x; r* A7 Y7 H' Z
  112. * 最后修改时间         :         2019-10-28" R) H& W& S# A0 q
  113. * 说明                        :        用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束* Q1 N& q) W8 Q/ N' D9 |8 N7 @+ J
  114. *************************************************************************************************************************/, |$ v. S. o; e) W. ], V
  115. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, & X4 V! K( d% l" ~5 i( ~6 p7 Y7 G# C
  116.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)5 \$ V, }4 E% N* B. D
  117. {
    8 R5 {# ^* R2 @4 T+ K
  118.         SYS_DeviceClockEnable(DEV_DMA2D, TRUE);                //使能DMA2D时钟) @2 `( o6 z5 Z, X
  119.         DMA2D->CR = 0;                                                                //先停止DMA2D
    # [+ k. o% N2 ]# P. W( b
  120.         DMA2D->CR = DMA2D_MODE_MEM_PFC<<16;                        //存储器到存储器模式-激活PFC
    . M+ A& E6 x) t1 Q2 b
  121.         DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0);                //设置每行像素与行数6 I/ q' ]7 g1 K6 U0 b6 ]6 x8 o
  122.         DMA2D->OPFCCR = DestColorMode;                                //输出颜色格式* _* ]; N; F' y2 k  e
  123.         DMA2D->OMAR = DestGRAMAddr;                                        //目的地址9 M" h1 C  h/ ?  ^0 H2 ?# V  d' R
  124.         DMA2D->OOR = DestGRAMOffsetX;                                //目的GRAM图像行偏移 8 I, P7 O6 R+ T: H
  125.         DMA2D->FGPFCCR =((u32)Alpha << 24) |  ((u32)AlphaMode << 16) | SourceColorMode;                        //源图像颜色格式
    ' g' U  d; a8 U
  126.         DMA2D->FGOR = SourceImageOffsetX;                        //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
    0 v* F8 B; \" z/ X' U! Y# p
  127.         DMA2D->FGMAR = SourceImageAddr;                                //源地址
    $ g# R% U0 P1 T0 A( ^( |# [
  128.         7 y  j' g/ `/ W! d% f
  129.         DMA2D_Start();                                                                //开始传输8 j5 g9 C2 ]  E" z$ T. p
  130. }
复制代码
  1. /*************************************************************************************************************
    6 B8 G6 I# M1 B* o( f
  2. * 文件名                :        dma2d.H0 b3 ]) T/ E9 z1 V3 V3 ^
  3. * 功能                        :        STM32F7 DMA2D驱动1 K! Y/ r! H1 V" I+ D/ o
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>' @+ B9 x7 q0 u3 z3 a
  5. * 创建时间                :        2019-10-29: m8 p4 V% J: R9 L1 O6 q; I5 e/ O
  6. * 最后修改时间        :        2019-10-29
    7 r. p! T! E/ ]6 y5 ~
  7. * 详细:                        
    0 s5 s" U0 i, R& S. ^1 h
  8. *************************************************************************************************************/        7 H' p: D" O9 t# @
  9. #ifndef __DMA2D_H_
    9 ?0 g! R% ^: g, a0 d
  10. #define        __DMA2D_H_           
    ; O& w3 X/ Q5 e% ?
  11. #include "system.h"
    9 @& ^0 t& ~, ]$ U5 b

  12. . ^- e" ~3 D) S$ o
  13. ; _- y  _4 J' _) Q" U7 o6 \
  14. typedef enum- ]0 E2 _5 q3 W9 l& ^/ S
  15. {/ D1 K" Z5 w" N( o- B' k: n
  16.         DMA2D_MODE_MEM                =         0,                //存储器到存储器(仅限 FG前景色 获取)
    4 `6 T# u. K8 C
  17.         DMA2D_MODE_MEM_PFC        =        1,                //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)& p( |( Q% ^! |) h. p
  18.         DMA2D_MODE_MEM_MIXED=        2,                //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)8 }+ W) b$ a- `0 l& O7 ^/ }3 e$ ^1 b2 p
  19.         DMA2D_MODE_REG                =        3,                //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)
    / S) q! ~3 G8 V0 h4 z3 k
  20. }DMA2D_MODE;( A1 L0 B! N/ S7 k( N. J* D5 F( p

  21. $ n+ k( Q- H: J4 ]# x" ?
  22. //颜色模式, T* U. [: m6 A; ~2 V% {
  23. typedef enum% p# Z( M9 \& d7 {( U  q- w
  24. {
    * }$ K0 T" v4 c5 ]% r5 h
  25.         DMA2D_COLOR_ARGB8888         = 0,
      \( E7 K* R, q; g3 T, {* i/ |% ~9 I
  26.         DMA2D_COLOR_RGB888                 = 1,# k4 u0 i" i' b/ S  Y$ H
  27.         DMA2D_COLOR_RGB565                 = 2,
    7 y' p* C& M1 y5 o/ n7 \" {
  28.         /*DMA2D_COLOR_ARGB1555         = 3,
    / L9 ~2 G) w6 q  I* n. K9 v
  29.         DMA2D_COLOR_ARGB4444         = 4,
    % r! I6 \& y$ w5 I/ e* a( z( u+ K
  30.         DMA2D_COLOR_L8                         = 5,        //8 位 Luminance
    1 I+ b$ l% i% K5 L. c" Z9 R, X9 Z0 `
  31.         DMA2D_COLOR_AL44                 = 6,        //4 位 Alpha,4 位 Luminance7 h! n  L4 G- _" ^; T
  32.         DMA2D_COLOR_AL88                 = 7,        //8 位 Alpha,8 位 Luminance
    1 i/ O( g3 S+ r' c2 Z0 U
  33.         DMA2D_COLOR_L4                         = 8,        //4 位 Luminance0 E6 }8 k: l& J; i# X* O
  34.         DMA2D_COLOR_A8                         = 9,        //8 位 Alpha
    / D2 g- N$ M1 k# E- d
  35.         DMA2D_COLOR_A4                         = 10,        //4 位 Alpha*/. `. @9 Q! g& h/ h3 I, \% P6 s) |% G9 L
  36. }DMA2D_COLOR_MODE;
    % W' o* [: p; V: x0 V# o/ }
  37. 5 t% O3 e, G* W4 y* g" y1 N& w$ H% e3 P
  38. 6 k; D% W' t6 F) @) |# a; ?; ~
  39. //Alpha 模式! @$ f& I1 |: O4 d- w7 r7 y- J7 U
  40. typedef enum" V9 q. V1 f# d' [6 @& f
  41. {& ^* Z3 L; E1 Q% e
  42.         DMA2D_ALPHA_NULL        =        0,//不修改前景层图像的 alpha 通道值
    7 K, z1 e& W' D% S( y
  43.         DMA2D_ALPHA_REPLACE        =        1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]& n, ]! a( \0 G. b  B6 F, o
  44.         DMA2D_ALPHA_PRODUCT        =        2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积2 }3 }0 `- P' @6 }4 h
  45. }DMA2D_ALPHA_MODE;
    $ q# r+ N8 v. D; N9 u* h' }; x$ U, l
  46. ; W0 u/ P0 [& I& R: N
  47. - l2 l# \2 u5 `, c5 a& \
  48. __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;}                //终止传输
    # l/ A2 r- k' L- @# {+ m
  49. __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;}                //挂起传输
    + O; `" a# |9 N8 X
  50. __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;}                //开始传输7 L& e  ~1 \- G5 Z% ^6 p6 o0 M4 A6 k
  51. ( W/ d; [5 s; [) j- @" @7 f
  52. void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX,  DMA2D_COLOR_MODE ColorMode, u32 Color);        //DMA2D进行单色填充
    * N# x+ ]$ e$ }( x- r" P- A
  53. void DMA2D_WaitTransferComplete(u32 TimeOutMs);                                                                                                                                                        //等待DMA2D传输完成, a5 o4 l, M8 T+ R
  54. void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充
      F7 a. g7 o' L: Q: C; H
  55. void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,   W- R' y" B3 H8 G9 @' j
  56.         DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)3 Z2 Y7 M- U  s$ l9 {5 x
  57. #endif //__DMA2D_H_
复制代码
  1. /*************************************************************************************************************9 U4 O* U+ \  d# w& k9 O2 k: g! q4 ]
  2. * 文件名                :        DMA2D_GRAM.c' d3 ~: ^& ]+ b- J; V
  3. * 功能                        :        GRAM相关操作' q; c/ E# B! N" j8 m2 N2 U  c
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>/ c# n+ M2 |/ ~: v" P+ {/ I/ l
  5. * 创建时间                :        2019-10-30: e* o' A' I. T! V
  6. * 最后修改时间        :        2019-10-30
    , o! R  d0 w1 t
  7. * 详细:                        显存相关操作接口1 s" Q9 E" ?: O  j3 M
  8. *************************************************************************************************************/        
    # [( @; \0 l; y$ c6 ~
  9. #include "dma2d.h"
    2 g5 p! |; H" Y9 X
  10. #include "DMA2D_GRAM.h"
    , |& C  s- l6 }$ b. N
  11. #include "SYSTEM.H" $ P7 n2 G# y6 L3 g2 V8 g

  12. # l* U' M8 h' u  h4 Y# @- ^7 {( |
  13. //基本接口' `+ c% j4 Q- b2 W) J) g5 H: n
  14. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //32bit色彩GRAM显存画点
    " f% {) L5 N8 _
  15. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //24bit色彩GRAM显存画点
    / e; r! l% w' b" d
  16. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);        //16bit色彩GRAM显存画点
    - E! m; v! L8 o6 ?
  17. $ K" c4 B5 l/ _  C
  18. / p2 c9 Z3 s3 L% {% s2 i6 `
  19. //GRAM相关接口-16bit9 _3 G8 u8 K! D# ^/ F
  20. const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit = . c) ~( ^  `8 a, T
  21. {
    & C; U6 B0 e- M# C5 U& i9 D/ }8 @
  22.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit,                        //GRAM显存画点(RGB565格式)0 q* X" k" H! A' g, A" g
  23.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充" S" g1 [) G4 O7 m
  24.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    . `" g2 s0 ~2 j& f1 G. T3 z) U- K6 e
  25. };2 v6 Z& d0 o# t. U, f4 V
  26. 2 ^# o5 E# [1 f5 z) B# ~
  27. //GRAM相关接口-24bit% |8 M( u6 O, h' |
  28. const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit = # X/ n7 H: h7 f$ x
  29. {7 \  u0 M2 X' v/ q) w
  30.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit,                        //GRAM显存画点(RGB888格式)* Q% y( [  u; t( W0 H
  31.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充
    % \6 I/ X! x0 p/ v) B% D3 q4 ~
  32.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)
    # W' L; Y# z7 H1 }
  33. };
    & n, x3 r5 P! B' C& x3 k- Z. U$ D
  34. 4 L& h/ D; ~  S( Z3 \5 R
  35. //GRAM相关接口-32bit
    # B8 R# u9 z8 Q% y8 C- B! R* [
  36. const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit = 3 B( g3 z+ h: P+ E
  37. {
    - h) \, O. h; y$ ]( Q- x
  38.         (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit,                        //GRAM显存画点(ARGB8888格式)
    ' {; I7 m5 v9 Q* o6 Q+ G7 {
  39.         (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill,                                //GRAM矩形填充9 _( B  y8 N" C" f5 B& z
  40.         (void(*)(void *,u32))GRAM_Clear,                                                        //GRAM清屏(使用DMA)* x# [4 L: i' g$ A( f
  41. };
    6 a3 f! T1 d: z* L

  42. , r! A" g- _0 D1 o
  43. /*************************************************************************************************************************
    , J6 Z8 Y; S8 o2 c1 E
  44. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    $ h. y7 z# r/ o& r" d# v: W% N: X
  45. * 功能                        :        GRAM句柄初始化(不会申请内存)
    + P+ x: w5 l3 }
  46. * 参数                        :        pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式4 I8 c% c  h6 {/ O  ^: O
  47. * 返回                        :        无
    $ x: l  R5 Y3 l' x
  48. * 依赖                        :        底层宏定义3 ]9 F; O( K, @. j6 j: L( w
  49. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    % |! e+ }- t$ E: ?+ t& V% J
  50. * 时间                        :        2019-10-30
    - R7 w8 T# o3 q5 m1 t0 d! b/ s& h
  51. * 最后修改时间         :         2019-10-309 P* p' H' g' o+ q0 z
  52. * 说明                        :        初始化显存
      B/ @. x/ J. Z$ p. c
  53. *************************************************************************************************************************/+ Y% j$ K5 ~' d# g" F1 Z
  54. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
    $ x; u" G) m* E( x- L) W
  55. {
    / l# \8 u: o' }, p  i
  56.         while(pHandle == NULL)
    # L  H" |' f7 c/ [- M1 U
  57.         {3 c$ x( h: m' ?2 l4 X
  58.                 DEBUG("无效的句柄pHandle\r\n");
    ; u/ r3 `, T- W8 l! h; R$ V
  59.                 SYS_DelayMS(500);' q7 N  l8 e  ~0 X
  60.         }
    . M( B; b7 A7 Y; l- C
  61.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址( v' Y  C: \8 q" r& M
  62.         pHandle->Width = Width;                                                        //GRAM宽度. v* T4 V) ^4 I6 s) W" G
  63.         pHandle->Height = Height;                                                //GRAM高度
    1 D; J% I$ ?7 ^9 G# _( ~
  64.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针  V/ C. z; n/ r" ~" o  Z. \
  65.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针$ c1 `/ u- L6 ^, l" H
  66.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针
    ) N( i; F9 w! e% @/ ~( ?5 Q; y
  67.         //像素模式' r5 ~% g' Y& t" ]
  68.         switch(ColorMode)
    ) [1 v3 W  M& j  i, t; h
  69.         {
    , O$ {/ x5 E, k, k
  70.                 case DMA2D_COLOR_ARGB8888 :
      d' y6 s$ q  O% t5 J( s6 V
  71.                 {! y) c% O# C; T8 ^/ i# u/ G
  72.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
    4 i) M$ W  ^3 f. W& T4 V
  73.                 }break;3 L5 F5 i- D8 g0 U
  74.                 case DMA2D_COLOR_RGB888 :
    * |+ ^! L! O) D" q# b# C
  75.                 {
    & |& W( n; S7 E2 |7 c8 ^4 H
  76.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
    7 \1 @2 {7 e& h7 Z* W
  77.                 }break;4 G2 N% S. n/ l7 _
  78.                 default: //DMA2D_COLOR_RGB565
    3 b6 r  }* F% Q3 i* ?5 y
  79.                 {% ^/ U" ^- [7 @" L
  80.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
    . u: [2 h* n% k+ H! O
  81.                         ColorMode = DMA2D_COLOR_RGB565;0 V0 G$ A* j; n6 Z) d* R$ L
  82.                 }break;
    + }) P3 ~! z. w7 T  |% X
  83.         }
    1 g3 [) |( s! E4 V
  84.         ' C" A; w8 E7 G
  85.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式+ k5 U: E0 g: o. C5 e. t1 z
  86.         pHandle->InitStatusId = DMA_INIT_OK;                        //初始化成功  ?1 P, d4 h4 S# k/ y
  87. }
    : Y$ ]8 V! _/ a( A" Z1 Y0 f

  88. ) ~5 ^: }1 F  H5 {- N
  89. /*************************************************************************************************************************2 b1 p# c9 {/ O% d- @& u3 a5 P
  90. * 函数                        :        void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)! z- e, L# @0 ]/ O+ C
  91. * 功能                        :        创建一个GRAM(会申请内存). c9 A- o! T% r( d9 p6 R3 P
  92. * 参数                        :        Width:显存宽度;Height:显存高度;ColorMode:颜色模式
    2 D# |) N0 {8 m2 i) I. S
  93. * 返回                        :        NULL:失败;其他:GRAM句柄" o: \3 @2 Q" E
  94. * 依赖                        :        底层宏定义* ~! R# k$ o# I5 S  A& g' f) p" O
  95. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    / g0 c' ]+ ]0 Y0 i8 ~8 K
  96. * 时间                        :        2020-02-02/ f* b% \9 V9 E5 v" r! m2 q; x
  97. * 最后修改时间         :         2020-02-02" f1 T( e8 T! h5 K) m
  98. * 说明                        :        初始化显存
    & e& x( m6 |4 A1 `8 ?: p
  99. *************************************************************************************************************************/
    " Q9 K9 U( z; u$ c! C5 K' @
  100. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)2 I& }: t& i  j' Y
  101. {5 T0 P5 Z/ d6 S7 C" ?5 e' Y! C) C
  102.         GRAM_HANDLE *pHandle = NULL;8 s# I+ o- l, F8 k7 z
  103.         u32 GRAM_Addr;
    ) ~; a+ h5 i5 B* }5 y) z$ p
  104.         
    * q( b0 f1 L3 ]5 d9 o+ |/ l
  105.         pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE));        //为句柄申请内存) O  [$ T, y& S+ C% }& M3 y) t, Q, ~
  106.         while(pHandle == NULL)/ k2 T0 L$ I# v  w6 Q6 w
  107.         {
    4 S; w9 |. w9 n6 \5 V8 _, k, t9 @
  108.                 DEBUG("无效的句柄pHandle\r\n");" }- b6 G& I9 P
  109.                 SYS_DelayMS(500);+ |. L, x- }& o, F% d
  110.         }- H0 |9 j  E7 n/ J/ P7 [
  111.         
    8 y1 G3 \  O) r
  112.         switch(ColorMode)+ F8 X) W2 ~$ B1 b+ k+ e4 n1 E& g5 s
  113.         {
    8 @" \7 l+ @$ O2 T" W# O8 m6 I1 K
  114.                 case DMA2D_COLOR_ARGB8888 :& H6 K+ h' P/ Z; d
  115.                 {
    - P" i% a7 s  g, w* I* f- e
  116.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存
    , U9 e+ l5 @% M" K! f5 E, J
  117.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;8 S7 Y( `- F3 s) Q8 p0 K1 s6 u
  118.                 }break;
    ' e; f/ z2 o7 }: }& _
  119.                 case DMA2D_COLOR_RGB888 :7 t5 T& K$ v* Z& G8 N4 l
  120.                 {
    ' p$ V4 H0 E2 o4 ]7 [" `% [
  121.                         GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height);                        //为显存分配内存
    " h9 A% S' ^" E- I2 b; t2 o+ ]
  122.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
    : j) d* U- O3 x$ K- g. D
  123.                 }break;2 o$ @- t5 F& v. U
  124.                 default: //DMA2D_COLOR_RGB5654 G5 L% {) H- W! b
  125.                 {" _4 W& q6 g! t3 y6 W" P
  126.                         GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height);        //为显存分配内存
    1 v1 h' \  U1 p0 O2 {0 k8 }$ \) o
  127.                         pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;2 G$ K. H5 B; Z! {
  128.                         ColorMode = DMA2D_COLOR_RGB565;. \1 R: W! }9 V5 t$ F. n& |0 f! U
  129.                 }break;4 @& e2 P& z: k
  130.         }
    $ `! X* e/ _- F# I  t
  131.         
    9 K; w% a4 F3 u8 W5 T
  132.         while(GRAM_Addr == NULL)
    2 |: K. R  h* [/ Q5 P
  133.         {
    ) p* {* g  z5 q7 j' F
  134.                 DEBUG("显存申请内存失败\r\n");
    ! W* l4 M2 p, F3 A$ i8 ^: H
  135.                 SYS_DelayMS(500);. ]* |" d6 N7 R, g  O" ^
  136.         }# L9 K% Q4 ~, v3 q$ \6 l
  137.         . U. J: i0 R1 B( u
  138.         pHandle->GRAM_Addr = GRAM_Addr;                                        //GRAM地址& ?* L6 }& @2 v2 y
  139.         pHandle->ColorMode = ColorMode;                                        //GRAM显存像素格式6 A5 a6 u7 J( E
  140.         pHandle->Width = Width;                                                        //GRAM宽度
    9 V# \5 E) i. N$ Z( P' |! G3 a
  141.         pHandle->Height = Height;                                                //GRAM高度4 ]6 k3 L6 K) R1 O
  142.         pHandle->pGRAM_32bit = (u32*)GRAM_Addr;                        //32bit颜色模式下显存指针, \0 D6 i+ q# w
  143.         pHandle->pGRAM_24bit = (u8*)GRAM_Addr;                        //24bit颜色模式下显存指针' o  d, I; l: G+ O% L
  144.         pHandle->pGRAM_16bit = (u16*)GRAM_Addr;                        //16bit颜色模式下显存指针4 |3 M2 W, Y/ O# b& n* l2 Y
  145.         pHandle->InitStatusId = DMA_CREATE_OK;                        //创建成功
    # e' M2 ^2 I6 i6 H$ T
  146.         
    ' m9 u/ S  l" W7 x
  147.         return pHandle;
    8 g  H4 S4 Z' u3 G9 M( g: ~( }  c. G
  148. }2 x) s! Q* L0 Y! A& b4 S
  149. 6 ^- r" ^3 x0 [! c& x+ q
  150. ' {8 x! B; C& _3 z8 ?, p

  151. # ~  l! A& ^: ]1 g/ O: v/ @( e
  152. /*************************************************************************************************************************5 g% h1 {( O/ j" r
  153. * 函数                        :        void GRAM_Delete(GRAM_HANDLE *pHandle)2 N$ J: y+ j  V" T% F, ?) D2 [
  154. * 功能                        :        删除一个GRAM(会释放内存)9 G: y. {( m* b9 n% l
  155. * 参数                        :        pHandle:GRAM句柄+ ~( ~. g) z. o4 R: `' C+ B
  156. * 返回                        :        无' u! D, \% V  J4 E7 l' b
  157. * 依赖                        :        底层宏定义6 }! {+ ?) Z/ H  f% _  _* K
  158. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>* t7 P/ h2 A. p8 X
  159. * 时间                        :        2019-12-16& T" S7 z9 M2 S; d- s
  160. * 最后修改时间         :         2019-12-162 ?; S; n1 u' @; P/ W' d
  161. * 说明                        :        用于删除显存,释放内存& ~! i* w+ f5 y4 t" n) X4 v3 G) |
  162. *************************************************************************************************************************/  @9 A1 z8 P5 ]( p: @( F. ?
  163. void GRAM_Delete(GRAM_HANDLE *pHandle)
    ' C) w' ^8 `- A( k
  164. {
    ) _0 m# Y" T$ K& x; g: @' a! J# O
  165.         if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)
    " y# M# U6 [, O! u3 m9 W
  166.         {
    % d/ n$ X- b5 O+ l
  167.                 if(pHandle->GRAM_Addr != NULL)7 h7 ?& o/ T5 B& Z
  168.                 {
    , }( z! e$ J# J2 z  C
  169.                         GRAM_free((u8 *)pHandle->GRAM_Addr);                //释放显存内存
    , k! J. c7 s& j6 H( Z
  170.                         pHandle->GRAM_Addr = NULL;
      e4 K$ l) {, [: v- T$ ^9 d
  171.                 }% t3 k9 b$ e+ m5 I
  172.                 pHandle->InitStatusId = 0;
    2 w# [# Q& {/ F7 y7 `8 j7 S% k' j: q6 Z
  173.                 GRAM_free(pHandle);                                                                //释放句柄内存
    2 @# f$ {: M8 s& E5 F4 O
  174.                 pHandle = NULL;+ m/ V) w( B# F+ v$ @; k' W; U
  175.         }! R+ \( z; K' E" S8 f
  176. }0 I: }" m; B1 E! {1 g

  177. 0 y6 q; m' {) n7 L& a( v$ m
  178. % H2 c% Y! W# G& }" n; @
  179. /*************************************************************************************************************************
    3 |" f+ T; j% y6 P/ r
  180. * 函数                        :        void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    : y) ]1 C# j: w6 O, z( v* b
  181. * 功能                        :        32bit色彩GRAM显存画点# N1 J  ^& }# r7 N- G+ V
  182. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色9 y% x7 D3 ~# s  C
  183. * 返回                        :        无. p+ G8 d$ p8 b, a; V9 J
  184. * 依赖                        :        底层宏定义( I- t" Y+ B/ {4 R
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>' H8 c  R" u) \" z& A3 A  g# p
  186. * 时间                        :        2019-10-30
    , H% `, p1 j- H7 ?0 z
  187. * 最后修改时间         :         2019-10-30) E+ I( O! s% L+ R9 D- d# V3 Z
  188. * 说明                        :        在显存中绘制点
    : a8 X4 H  `+ p9 X; q. w6 R
  189. *************************************************************************************************************************/: S  a' I3 `- H7 Q& f+ t
  190. void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    ! z1 U. T' N: z7 Y4 }
  191. {
    2 [9 v( h1 p& e6 c2 S& T
  192.         pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;$ f  B4 @7 k' L  @/ g2 d' R
  193. }
    / D5 z4 h3 S  F7 u1 H0 l8 t: O  G* N
  194. 5 L! {; E0 L  S* j: `/ W; A+ J

  195.   b/ x/ K: d+ ~5 ^+ A$ Q
  196. /*************************************************************************************************************************9 c0 M( f7 {" d7 l- i4 n
  197. * 函数                        :        void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    9 i/ u" u& \9 I9 }6 ]2 i" E% i
  198. * 功能                        :        24bit色彩GRAM显存画点
    8 q9 e4 G# r, i# x7 v! @
  199. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    5 `$ a& M0 {/ |0 u0 B
  200. * 返回                        :        无/ ?7 Y3 N: _# B; f8 Y2 E- |' a
  201. * 依赖                        :        底层宏定义4 R/ |% \2 f2 Y% B! Q) \% r
  202. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    - g) L. q7 u) }1 L% p& U5 v
  203. * 时间                        :        2019-10-301 M1 @, Z% G" N) J5 ~
  204. * 最后修改时间         :         2019-10-304 w) J" u% h1 V  ~+ T) R5 Z
  205. * 说明                        :        在显存中绘制点% k5 q6 {4 t4 p7 F' o2 ]2 d) y+ H
  206. *************************************************************************************************************************/
    % E1 B$ H" i% m' d
  207. void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)7 o$ X2 _# z5 _( N1 r/ y; c
  208. {- h, {. m. E* ^2 ]) F
  209.         memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);
    ; m5 {' p/ b8 @2 F4 Q9 |
  210. }
      n0 l+ O; r4 {, v
  211. & w) ]8 ~( q+ `5 o* U# {; N
  212. 2 C, W0 T0 C$ |" O7 U- j
  213. /*************************************************************************************************************************: l7 J7 K) I( o! C- N9 l
  214. * 函数                        :        void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)& @5 D- Y, V2 u/ m7 A
  215. * 功能                        :        16bit色彩GRAM显存画点3 l" A! s  A* t# H# g1 S' V6 i
  216. * 参数                        :        pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
    & ?6 g9 G. e; _, A# \
  217. * 返回                        :        无' n; @7 v5 i* m; w. k& H
  218. * 依赖                        :        底层宏定义
    : M+ H0 i+ k' F9 W+ K
  219. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>3 `0 y; S& X, ]: q
  220. * 时间                        :        2019-10-30/ r' B/ g6 `' h9 O9 _+ H
  221. * 最后修改时间         :         2019-10-30
    % K  _, ?: C' K5 u  G9 Y
  222. * 说明                        :        在显存中绘制点4 n; I" T8 B9 Y2 m  g
  223. *************************************************************************************************************************/
    1 {( L  O. e# {$ G6 O' R+ H
  224. void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)& o; b4 [$ L4 E6 A
  225. {
    & [5 J  n  V# P
  226.         pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;
    " ]' H/ {3 @# I6 d! e* z
  227. }. m& W5 B6 t- `  p: n
  228. + \2 T/ Q* v2 [# ]! y8 o
  229. , H  t9 u$ S( ]0 D# s) b. p1 Q

  230. : ~  d7 f& Z# ~$ n. ^. r
  231. /*************************************************************************************************************************
    $ \! Z1 P: ?7 O, @: e6 ^- [
  232. * 函数                        :        void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)        0 h- V# O$ v  o  m6 v2 K  ?
  233. * 功能                        :        GRAM矩形填充(使用DMA2D)6 U% z' V' z8 J1 d) ]5 o
  234. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色
    7 e0 o% Q8 m# Z6 k2 N, C
  235. * 返回                        :        无0 k8 K& S0 X, |3 b+ Z$ y$ X7 i
  236. * 依赖                        :        底层宏定义4 V" x5 w1 F) n  M3 R
  237. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>( ]: a* a/ [. K7 ?/ \
  238. * 时间                        :        2019-10-30* l2 n% `) w/ m: D* e+ F9 J9 R4 A+ b
  239. * 最后修改时间         :         2019-10-30
    ) q% `1 I- P) _/ I. }% F+ L* f0 ]
  240. * 说明                        :        采用DMA2D实现
      b# F" S, o  Q1 J
  241. *************************************************************************************************************************/2 P4 F+ Z1 a7 l& g0 ]; F$ @; D8 i" k
  242. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)9 {% N- d* E( |' U* S. ?8 h8 p
  243. {  l- h! {0 P0 {0 I* q9 G3 u; g4 p
  244.         switch(pHandle->ColorMode)' B" `7 c! ?1 U+ R2 j5 D* X. c
  245.         {
    2 Y/ a5 U! c  E
  246.                 case DMA2D_COLOR_ARGB8888 :
    4 h0 }8 q2 F0 J+ E5 J  f" x
  247.                 {0 c7 U- g0 o/ }4 j8 ?
  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进行单色填充
    , Y. [; h$ c: L2 M9 r
  249.                 }break;& R4 K& y+ d5 p$ t
  250.                 case DMA2D_COLOR_RGB888 :
    ) U" r) {9 d3 r' N
  251.                 {! c: U) R. s, r4 \4 ]% W8 C6 [$ f3 F. r1 A
  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进行单色填充& X, `8 g, p: z+ {; g9 Q8 Q+ z
  253.                 }break;+ u3 B( i+ x9 g9 w5 B" k5 X
  254.                 case DMA2D_COLOR_RGB565 :
    6 N7 G0 i4 I5 n( |
  255.                 {
    2 _) K0 @+ V7 F0 T' i
  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进行单色填充
    9 v$ ?+ f: I7 s3 `8 M, d, }- k( G0 m
  257.                 }break;& \4 }+ d# k/ n8 N: |* C3 l
  258.                 default:return;$ s: P4 h) E) i. W/ t' C8 f- d
  259.         }! N2 o* N- ~$ C' f0 Q* a; F
  260.         
    3 B# f- P  C/ J" g, w0 C  j# h
  261.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                                                                //等待DMA2D传输完成) _& @7 q: j" o4 Z5 {. J4 R
  262. }  X" {* _# C  H) B

  263. 6 K" p* X" C7 c& {( `

  264. ! B/ X$ @. ]9 s4 |4 b5 |
  265. /*************************************************************************************************************************
    : W, H/ Z& g8 m4 r) ?
  266. * 函数                        :        void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)2 W9 ?* `( I5 U" y7 N4 c5 [
  267. * 功能                        :        GRAM清屏(使用DMA2D)+ }' S8 u4 u% @/ |6 G" K
  268. * 参数                        :        pHandle:GRAM句柄;color:需要填充的颜色. {* m% n& ~3 n5 ]8 c$ F2 n
  269. * 返回                        :        无, V  n$ h3 R) {: ?! Y" h
  270. * 依赖                        :        底层宏定义
    * L, M( Y/ e- w
  271. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    * x5 S# R# X( |
  272. * 时间                        :        2019-10-30
      U4 ~; b$ `" e0 d5 p3 [
  273. * 最后修改时间         :         2019-10-30/ d: G# e& f, y# Q$ ^( k
  274. * 说明                        :        采用DMA2D实现
    3 r' T6 X7 e* H8 }2 u7 J* _, x
  275. *************************************************************************************************************************/
    6 F/ F$ T% [% }. c' a* P/ A* l) [
  276. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)' C7 J6 _" L5 l
  277. {
    % K' Y7 g6 D( D- R! ]' R" ]. ~+ @1 U
  278.         switch(pHandle->ColorMode)$ Y9 ]4 C4 m, Q
  279.         {) N6 `6 W+ T8 J* H3 z; z
  280.                 case DMA2D_COLOR_ARGB8888 :* Y( H. c& ]4 p+ z3 p4 p
  281.                 {
    ' B, G# H$ u( x9 w
  282.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color);        //DMA2D进行单色填充
    : {- c0 E: q1 `$ T) D$ x/ p
  283.                 }break;1 g: y' o. |9 i4 k% f
  284.                 case DMA2D_COLOR_RGB888 :
    ( t; L& t/ B: D# V# E' V
  285.                 {
    # W/ H+ V: f' p7 ?& F3 r& B
  286.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color);                //DMA2D进行单色填充
    / D; N2 I0 R5 b3 v" d# x# L
  287.                 }break;
    8 E2 J- X; ~5 T- G. G3 V! o% O. B
  288.                 case DMA2D_COLOR_RGB565 :; E) ~  E/ K5 Q. T$ |3 O
  289.                 {( {" e8 h' N* x3 j( h  F
  290.                         DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color);                //DMA2D进行单色填充: e$ I6 S5 l* l6 Z3 b3 d
  291.                 }break;( t7 Z$ N% x( I4 Q
  292.                 default:return;2 [6 f* J9 {7 q+ D% z! u
  293.         }
    % B8 u% G4 ^9 {8 o7 X
  294.         SYS_DelayMS(5);0 [+ S0 c: [7 {: E
  295.         DMA2D_WaitTransferComplete(500);                                                                                                                                                                                //等待DMA2D传输完成" Z: ]8 R! P9 {+ z& w0 z( M
  296. }
    0 B( `8 R0 q7 P7 I& u

  297. ( L0 ^- b( g' `  E0 f

  298. . w* O) C. ~& k  P5 c1 X/ V# j
  299. /*************************************************************************************************************************
    2 O  p2 W# X0 `. P
  300. * 函数                        :        void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, 7 j+ R! e" C, Z
  301.                                                 u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha). G/ `4 U+ V# b. N: A
  302. * 功能                        :        GRAM局部拷贝(支持Alpha)
    . z; R8 E5 H; a' c7 S
  303. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
    $ ]) D3 [5 p% p% Y: @
  304.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度, }- y; D* W. b: w( h0 I+ k
  305.                                         AlphaMode:alpha模式;Alpha:Alpha值;4 @  E% I! [' U: t: s9 [) |" c! v% J
  306. * 返回                        :        无
    9 Z$ \  C) R3 e  ]& @5 c
  307. * 依赖                        :        底层宏定义
    0 Z! E- I. ~- k) v. j3 M5 q/ p
  308. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ; R5 z3 }; ^5 m4 `
  309. * 时间                        :        2020-02-028 {9 k2 k: M% Y- v3 Q: Y
  310. * 最后修改时间         :         2020-02-02! W3 X) q( _$ K# M, _
  311. * 说明                        :        不会检查GRAM大小,请确保GRAM
    $ l( E0 r8 V# i& {  k, \
  312. *************************************************************************************************************************/
    : R/ d% R+ \' ?( J7 ]/ b
  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)
    : J! q" K1 z; d1 Z$ A2 J
  314. {
    - V7 S( X. y  @4 y! o4 u8 e
  315.         u32 SourceImageAddr;        //源图像地址(通过地址控制开始的X,Y坐标)
    ; s5 @% P2 ^9 L
  316.         u32 DestGRAMAddr;                //目标GRAM地址(通过地址控制开始的X,Y坐标);+ p* i  s  p+ y- H3 b* R
  317.         u32 PixelByteSize;                //像素字节大小, U% f+ a" G, k: W7 m' [( D
  318.         6 S. k! M. G9 @' q  G( _* {
  319.         if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL)2 N$ Q! I8 K5 ^/ C
  320.         {
    : Q' C3 S1 l9 H8 z
  321.                 DEBUG("无效的句柄,pDestHandle\r\n");2 @8 |& x& m# B) P9 N: ]; d
  322.                 return;
    ) ~6 T2 h7 d# j( S
  323.         }2 }. i8 z3 q* ]  f
  324.         if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL)9 p6 T  T  c& r( q
  325.         {
    " R) R3 p) P, T
  326.                 DEBUG("无效的句柄,pSourceHandle\r\n");% U0 n# a( E8 q: z2 ]6 i4 x
  327.                 return;  c1 l2 i0 r8 U1 I
  328.         }
    % Y+ ?( K& @; \# W2 D& `( @
  329.         //源图像地址(通过地址控制开始的X,Y坐标) 计算
    , ~. T8 u" D6 M. ^+ Z5 O7 `
  330.         switch(pSourceHandle->ColorMode)
      o% Z) T% c9 G8 S$ W
  331.         {1 Y% F% p: \* X, S4 ^
  332.                 case DMA2D_COLOR_ARGB8888 :
    ) d7 v8 }# ~1 a+ y0 W2 t) [
  333.                 {
    5 i. ~* `6 }& b
  334.                         PixelByteSize = 4;2 f4 k. T! a" H
  335.                 }break;: P; j% _5 D( u4 E( E2 M
  336.                 case DMA2D_COLOR_RGB888 :
    8 p6 L. @4 L+ u
  337.                 {
    6 n) a& |& d9 j8 z
  338.                         PixelByteSize = 3;
    9 O8 p5 I# J2 r! |
  339.                 }break;9 C" i) w6 C2 Y; v$ N
  340.                 default: //DMA2D_COLOR_RGB565
    & j* @+ N. d! f- V& Y) q8 V
  341.                 {
      N' B" Q# w7 c3 F3 S
  342.                         PixelByteSize = 2;3 z$ T) f9 j& C) m+ Z
  343.                 }break;- t' c, }: T! Y6 E0 k
  344.         }3 Y1 i# a( n' @/ S" \+ b" f6 }" r
  345.         SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize;        //计算源开始地址/ |) a9 @+ u3 i
  346.         ; p- ]  A+ Q# u3 O
  347.         //目标图像地址(通过地址控制开始的X,Y坐标) 计算
    2 ^2 W& M! V2 M; h
  348.         switch(pDestHandle->ColorMode)
    + D' |( k8 w' |( x, N* B$ g
  349.         {. M& F& k- f& z5 c
  350.                 case DMA2D_COLOR_ARGB8888 :$ J3 P$ C; b7 h6 A
  351.                 {
    $ m0 a2 G2 ]; w% a$ p' D' q
  352.                         PixelByteSize = 4;
    ; z7 v3 U& \  I/ n: |: l) b
  353.                 }break;
    ' Q- j# I' P7 D# y* @
  354.                 case DMA2D_COLOR_RGB888 :3 w  Q1 k  ?' f) s2 Z
  355.                 {
    : N& c( Q6 m5 G. }. q" Y2 `- [
  356.                         PixelByteSize = 3;
    7 F- H. S# N0 B  q+ E/ x+ z* J
  357.                 }break;- }& a3 A1 P1 I% z' I' [) r
  358.                 default: //DMA2D_COLOR_RGB565
    2 R- E/ a; G, M) @3 R( T* C7 {
  359.                 {
    5 [# N2 e& t# m* B/ r1 X0 R
  360.                         PixelByteSize = 2;0 U+ F( G) \5 @4 N/ [0 U4 V/ H
  361.                 }break;
    + u  x1 K$ d- E7 O! D1 z% o
  362.         }
    # ~4 ^3 X" K2 k9 ^$ i$ q
  363.         DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize;        //计算目标开始地址
    4 N- V) G7 d. A/ j6 I$ S$ @
  364.         //进行拷贝
    . [, z# X& ?- x0 R* b' Y
  365.         DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode,
    % S' O! \6 Y% p4 @" P/ d
  366.                 pDestHandle->ColorMode, AlphaMode, Alpha);                                                                                                        //DMA2D进行矩形图形填充(会执行像素格式转换)
    0 F8 B% G0 l/ J1 c; l& V/ \$ S
  367.         DMA2D_WaitTransferComplete(200);                                                                                                                                //等待DMA2D传输完成; q, v# g! F3 W* T% V
  368. }7 J% n. D9 d" H0 n  I) l# f

  369. ) Q* ~+ b( x. c6 E$ p
  370. /*************************************************************************************************************************
    3 @7 I, O( ^% s! N3 [* ?
  371. * 函数                        :        void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
    % L  B- K: L* z, U/ _
  372.                                                 u16 Height)
    . [6 k/ ]! A( [
  373. * 功能                        :        GRAM局部拷贝(不支持Alpha)0 C; P* k0 N2 [
  374. * 参数                        :        pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
    ( T3 E6 g# w* h! B& g' r
  375.                                         pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度3 z0 |; Q5 g: e8 M' v6 M; c7 q' {8 O
  376. * 返回                        :        无
    4 k; {8 y  i: U4 H- X+ r7 Z
  377. * 依赖                        :        底层宏定义
    * t3 Z3 {% M' g. t3 ^2 n5 p7 o
  378. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    $ w9 C/ G4 S  a/ a" M0 I% W
  379. * 时间                        :        2020-02-028 e0 W8 [7 H( s% T7 F  b! ~/ f" \
  380. * 最后修改时间         :         2020-02-02
    " }3 K/ L, Z! e' v' w
  381. * 说明                        :        不会检查GRAM大小,请确保GRAM
    $ n. s! j: \2 s' W- y- T0 a  q
  382. *************************************************************************************************************************/
    2 N4 J  D+ C% E
  383. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)
    $ S3 m2 ~, _/ R/ _2 V
  384. {1 ~6 q9 e) n$ `
  385.         GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);
    ) B: X0 M0 O1 |9 `3 e; a
  386. }
复制代码

. m, O  F+ X$ R. B; z  L
3 a7 t) ?- W: b% D! o0 @: s
  1. /*************************************************************************************************************
    / M0 x* C  Z8 q' ], U3 U
  2. * 文件名                :        DMA2D_GRAM.h9 j4 o  Z3 r( U/ }
  3. * 功能                        :        GRAM相关操作- ^% |! b5 \' {9 D, t
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    6 h3 ~0 H5 j$ q
  5. * 创建时间                :        2019-10-30
    4 }' a! Y* E1 h
  6. * 最后修改时间        :        2019-10-30
      V7 y) W5 ?0 q3 Y# M! h% j
  7. * 详细:                        显存相关操作接口
    # L' B7 [3 A7 M1 B& K/ Z
  8. *************************************************************************************************************/        
    " p6 X- M; Y+ K
  9. #ifndef __DMA2D_GRAM_H_  T* l- E& m1 ~8 ^  n9 r
  10. #define        __DMA2D_GRAM_H_           
    & W. D& a5 F  ^3 f: ^
  11. #include "system.h"0 S* ^, e4 J" D, C0 F: ^3 H9 l/ i
  12. #include "DMA2D.h"
    9 H; N; _  X' A8 y
  13. #include "SYSMalloc.h"
    7 ~$ T* p& P* ]* Y; ?
  14. ; Q+ n# ~9 Y4 o4 ]3 B1 M& V2 R
  15. //初始化状态id
    : V& C3 ]6 H  J
  16. #define DMA_INIT_OK                0x1234423        //初始化成功(不可以释放)
    $ f+ U1 x2 \; Z
  17. #define DMA_CREATE_OK        0x3643423        //创建成功(可以释放)
    1 p3 v1 \, F9 `1 r  r$ L- l

  18. 0 P1 e$ {) V9 d' E/ R
  19. //颜色模式, u5 J6 \$ }& q9 n
  20. typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;
    + }- z; A/ C6 }, X4 a

  21. 1 x; P$ c3 C% d' m% t
  22. 7 k! S. h' z2 ^/ \' a: |
  23. //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告), I7 q* g% [2 {! N4 a0 b
  24. typedef struct, b+ f% j, ?( X9 A% s1 p1 \; D' J
  25. {
    ' t) J1 d, D9 ~8 K" P- [
  26.         void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //绘点函数
    & [$ }$ o! b1 O# v$ k
  27.         void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                        //填充
    % p& U' E2 W; a- z  U' t
  28.         void (*pClear)(void *pHandle, u32 color);                                                                                //清屏0 C' R/ B! s) O# n( D8 D4 o
  29. }GDI_BasicInterface;
    ; C' H& Q6 A8 h- \# S# O+ O
  30.   G& Y% v- u) k1 W; k; r3 a
  31. 2 w2 {5 \- a) f/ B
  32. //GRAM相关接口-16bit* j3 N6 |/ \2 N- @6 ~
  33. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;* m1 H" T% B7 G  ?  ^
  34. //GRAM相关接口-24bit& K8 {- `& R/ B- q' m
  35. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;/ T* V- s  r  D7 Z7 g# }' r; t6 `. E
  36. //GRAM相关接口-32bit
    * k: V8 S/ {2 O5 g, F
  37. extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;
    1 O% T# Y) _3 @3 [, r8 d" O
  38. " W! k% _( R$ o" n7 r) J; C
  39. //所需的内存申请接口
    1 b4 D$ Q! |- {
  40. __inline void *GRAM_malloc(u32 size)9 [5 T7 z$ T0 p. d) L
  41. {
    $ n! P4 X7 [5 f4 V
  42.         return mymalloc(SRAMEX, size);                        //内存分配(外部调用)-使用外部SRAM
    . L+ y, c+ Q% l1 Q. b2 F% M
  43. }
    $ U3 \1 ]7 _0 j4 e0 m7 E

  44. % `9 i, n$ b1 d- q* X) z6 f4 T
  45. //所需的内存释放接口* ]/ ^( \- J$ B9 S6 w7 L3 k; f
  46. __inline void GRAM_free(void *ptr)
    3 K$ v* G  I- P$ g, I- v$ d3 `
  47. {# Z% Q0 l2 w4 d  h
  48.         myfree(SRAMEX, ptr);                                        //使用外部SRAM
    % M1 V0 p% a+ B2 _. r1 g
  49. }
    * z  l1 @9 X+ ?( y; {( g5 N# T

  50.   D1 \# I. G! l
  51. " n+ C/ e& [% P$ Z" `3 r
  52. //显存句柄3 S, g) Y+ M3 E# j
  53. typedef struct1 _6 M3 t& k5 g( u
  54. {
    + Q1 [% Q5 G9 F# R- C: c
  55.         u32 InitStatusId;                                                                //初始化状态id  `& T( q  J; H& _4 e
  56.         u32 GRAM_Addr;                                                                        //GRAM地址( @; @/ f# p% w8 R' V& t
  57.         DMA2D_COLOR_MODE ColorMode;                                                //GRAM显存像素格式
    + b: f$ U( a1 @/ d% d) V2 |" \1 j
  58.         u16 Width;                                                                                //GRAM宽度
    ; K, o% J" W$ ~( I4 T2 ]) b2 b
  59.         u16 Height;                                                                                //GRAM高度
    - d3 M" o5 Z/ v  o4 P; q& ^# x
  60.         u32 *pGRAM_32bit;                                                                //32bit颜色模式下显存指针
    . r8 ]5 c6 q" t; l
  61.         u8 *pGRAM_24bit;                                                                //24bit颜色模式下显存指针% W$ ]$ f) ^7 |6 o. ]: ~+ C6 ^
  62.         u16 *pGRAM_16bit;                                                                //16bit颜色模式下显存指针  d, q, t* ~! m# C" ?  |/ h
  63.         const GDI_BasicInterface *pBasicInterface;                //底层GDI接口
    ' z( ]: j% t3 X. _5 s5 [
  64. }GRAM_HANDLE;. m9 T2 A! y" C  y$ o3 M* ]: U
  65. 0 m- T7 B! `' V  q0 f, g' o
  66. void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);        //GRAM句柄初始化(不会申请内存)/ o% B5 L. l2 k, t! c- q
  67. void GRAM_Delete(GRAM_HANDLE *pHandle);                                                                                                                                        //删除一个GRAM(会释放内存)
    ; B; {/ X% D* w, a7 E
  68. void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color);                                                        //GRAM矩形填充(使用DMA2D): }- y% D1 z, U6 S8 M1 p
  69. void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color);                                                                                                                //GRAM清屏(使用DMA2D)1 I1 h8 `& l4 h2 P
  70. GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode);                                                        //创建一个GRAM(会申请内存)9 N- n9 E/ O2 ~" I4 ]& {7 @
  71. void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,   ?/ ?% q- S$ i8 t
  72.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);                        //GRAM局部拷贝(支持Alpha)
    " e0 M" |9 F4 e# V! e5 r7 E
  73. void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
    & c* Q8 k) H# m9 h
  74.         u16 SourceSx, u16 SourceSy, u16 Width, u16 Height);                                                                                                        //GRAM局部拷贝(不支持Alpha)
    - v6 N$ Q" `# J9 E

  75. 7 C" G2 a2 ~: ^* ]9 K
  76. #endif //__DMA2D_GRAM_H_
复制代码
  1. /*************************************************************************************************************( B9 k; \/ S+ V' y3 N
  2. * 文件名                :        GDI.c, H* ]1 F' a% X. l0 r( F
  3. * 功能                        :        图形设备接口(Graphics Device Interface)
    0 q4 a! g# L8 z' r7 B, K& t7 [
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    $ H6 L# @9 N1 Q  \! l
  5. * 创建时间                :        2019-11-02
    ' k3 E; H+ V6 R% ]" e8 Y1 \& Q
  6. * 最后修改时间        :        2020-02-02
    4 W! t, g0 b' t. M
  7. * 详细                        :        STM32F7 图形设备接口% @: o( s; a  l* [
  8. *************************************************************************************************************/" F" Q' G$ R. \3 \) o
  9. #include "system.h"
    7 i" J* U/ r1 t( Q' e. J3 H
  10. #include "DMA2D.h"
    6 O9 x2 S3 h* `" v0 G
  11. #include "stm32f7_ltdc.h"
    ; w5 L8 f$ U+ H- \/ Y
  12. #include "DMA2D_GRAM.h"- u  t% A9 U5 z" n: i
  13. #include "GDI.h"
    " Z* M+ }& _- h

  14. 8 d+ Z( r( I) z( `' [' S/ l
  15. //显示器Layer1 GRAM定义
    ' B: N1 O' ~4 i! g
  16. const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle = $ o9 n" V6 E$ t
  17. {- I& Z9 W- ~* o; f, k
  18.         DMA_INIT_OK,
    1 y7 _* R/ a( R; y. J0 v- \' T
  19.         (u32) &g_LTDC_BUFF_RGB888[0],        //GRAM地址
    - w  U4 ^* `6 _+ U0 ^  z# t
  20.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式
    . p+ I5 |* c" L2 B
  21.         LTDC_WIDTH,                                                //GRAM宽度
    + S4 @: g; v- f6 t2 H
  22.         LTDC_HEIGHT,                                        //GRAM高度
    7 x4 j: X! Q+ v6 A- U8 v9 j9 |
  23.         (u32 *)&g_LTDC_BUFF_RGB888[0],        //32bit颜色模式下显存指针* i/ S" q' o! Y" r# {
  24.         (u8 *)&g_LTDC_BUFF_RGB888[0],        //24bit颜色模式下显存指针
    5 b9 \" x1 ^5 b9 \7 U# q# O7 v8 G
  25.         (u16 *)&g_LTDC_BUFF_RGB888[0],        //16bit颜色模式下显存指针( G- x* i# W: @* t  D$ I
  26.         &cg_GDI_GRAM_Interface_32bit,4 Y" e+ d4 c, k" l3 \! l
  27.         
    / A9 X. o* C0 r
  28. };
    1 p; Z2 S$ A  K  u2 V# K
  29. ( ~: c. x0 y7 G1 i
  30. //显示器Layer2 GRAM定义
      |  `3 b7 b7 l+ w  H. S* [$ |
  31. const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle = 7 n; h: i2 m8 a2 s& \
  32. {' {# j" o3 E7 X4 a) H
  33.         DMA_INIT_OK,( [+ R9 T& p: c+ d$ [5 U
  34.         (u32) &g_LTDC_BUFF_RGB888[1],        //GRAM地址3 W: e$ h# A; F. ^; ?- ^1 j7 }
  35.         DMA2D_COLOR_ARGB8888,                        //GRAM显存像素格式! ]# ?; i, p$ ^' b
  36.         LTDC_WIDTH,                                                //GRAM宽度7 |) ^- A+ B- B, q8 C4 H
  37.         LTDC_HEIGHT,                                        //GRAM高度
    : ]- G& B. i1 H2 x7 Q! F
  38.         (u32 *)&g_LTDC_BUFF_RGB888[1],        //32bit颜色模式下显存指针! q2 b' [0 ~9 i% K, S! {# q
  39.         (u8 *)&g_LTDC_BUFF_RGB888[1],        //24bit颜色模式下显存指针9 o) B/ N3 p2 i$ q: o9 e& \
  40.         (u16 *)&g_LTDC_BUFF_RGB888[1],        //16bit颜色模式下显存指针8 j0 m. V: @: t
  41.         &cg_GDI_GRAM_Interface_32bit,9 W; J( ?. k# j: o2 B9 R. J
  42. };& B4 P3 z+ ~9 _# P& }( D+ Y
  43. % h# \9 F  X/ ^, p+ f. f
  44. / J( Z$ s9 R6 x4 y" v$ `
  45. /*************************************************************************************************************************! g1 b: d+ m: w( _9 J( d
  46. * 函数                        :        void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)* H) V+ S/ a  h% Z! r% O8 M
  47. * 功能                        :        绘制空心圆
    - o8 H9 g: }" |7 ~8 z; Q
  48. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色1 u" d# ]' D8 y
  49. * 返回                        :        无
    ! y- X1 e+ ^! s1 _8 [
  50. * 依赖                        :        画点函数2 V$ }& |4 a. W" x6 n
  51. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    ) C# r1 ~# u" j4 E, W
  52. * 时间                        :        2011-09-20
    0 l$ F+ O8 {: f
  53. * 最后修改时间         :         2019-11-02+ F9 L" F! `- f. l: m7 r& ~
  54. * 说明                        :         无! n% F# c% Z. P) f5 J1 ~  A3 B3 ?/ P
  55. *************************************************************************************************************************/3 g( N8 @8 N% @2 x# x
  56. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)0 [+ H/ @: a1 q2 `# O7 b; K
  57. {  }) D) t6 D, ~9 l
  58.         int a = 0,b = Radius;
    3 @% W+ e8 L8 G9 D! q" l
  59.         int di;# y% f8 }- P  {/ e. J7 }
  60.         di = 3 -(Radius << 1);           //判断下个点位置的标志) Q6 f1 ~/ ~4 {+ M$ g! z6 k4 {
  61. 5 d2 W. e  e$ |4 X4 O
  62. #if(GDI_PARAMETER_CHECK)                        //参数检查
    * W3 H- z6 I: [' p
  63.         while(pHandle==NULL)! z& i) ~# M) y, q* G
  64.         {
      x& X' i5 W. |# N
  65.                 DEBUG("无效的句柄 pHandle\r\n");: T7 o4 a% y# p
  66.                 SYS_DelayMS(1000);
    $ C$ `/ K, z* n
  67.         }        
    $ |1 [2 t" J# m  ]3 `& h# K) _8 b
  68. #endif //GDI_PARAMETER_CHECK! I# q. v5 J0 D* Y  f" ~4 O
  69.         
    ) n1 I* \! J0 D1 }. y
  70.         while(a <= b)
    " L% t% R  A$ S& r
  71.         {2 d" f# o0 A# u# g0 I, `' l0 i0 `# H
  72.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //3           
    3 w/ s4 w: K& N8 z
  73.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color);             //0           
    8 v1 ^& F: J- a$ d% u
  74.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color);             //1       5 Q) Z. f8 H- d; K5 n
  75.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color);             //7           : T! ]5 ?6 y+ ~1 p
  76.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color);             //2            
    9 S( g3 P1 A/ L# P+ H
  77.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color);             //4               
    # s: m0 f$ z* e- L; y4 u/ P2 K
  78.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color);             //5
    " Y2 Y" X+ P3 u0 V
  79.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color);             //6 2 E! r9 G' d2 s, ^
  80.                 pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);            
    / W3 A7 j1 S' q+ I
  81.                 a ++;
    ' o3 y2 |" a1 @& ?% L* h' M/ n
  82.                 //使用Bresenham算法画圆     
    6 G7 S; L9 ?/ M, Z1 U; P! E* w
  83.                 if(di<0)4 W" p* }1 ]% T: b7 ]7 t
  84.                         di += 4 * a + 6;                                                                                     % `" V; G" {' x6 V% X; I' t8 R
  85.                 else
    4 ?8 w, V' B) s% _$ A% h
  86.                 {
    - r$ @% @( P$ F% V
  87.                         di += 10 + 4 * (a - b);   % D( N  a& _2 G- q! M  O
  88.                         b --;/ w+ D# `2 ~. h# V  Q; d
  89.                 }                                                                                    # ?/ ~! Z7 a7 ^
  90.         }                                                                                  1 ?; e( t- G6 z/ H( l; t* g8 a% P
  91. }
    & D- b. `8 p& T2 B, w" c4 g
  92.                                                                                                                                           . \( T0 ^9 D( E3 ~) _4 A" \

  93. 5 l9 Y0 T$ b+ A: B1 ^) n( Y
  94. /*************************************************************************************************************************
    6 V) @; m4 ?. p/ D/ c$ V$ S/ X
  95. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)% h4 b0 L# g$ J7 y# ?2 G
  96. * 功能                        :        绘制直线(可以倾斜)6 y8 w( {5 D, Q6 D% {: V+ k
  97. * 参数                        :        pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色
    ; G2 ^; A+ y) h$ D9 X# S) j
  98. * 返回                        :        无! B8 e' j% ?4 T" J9 ?9 f/ [7 f* j; S
  99. * 依赖                        :        画点函数, X" k6 M+ ^. q& `% R
  100. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 B' Q: B7 F  {) j7 N# z$ p
  101. * 时间                        :        2011-09-20
    3 y' o* u1 Z2 _# t# U' |# P
  102. * 最后修改时间         :         2019-11-02  w  ?3 ?/ u4 c: I
  103. * 说明                        :         无1 p3 h' F9 y5 \$ {, ?/ j& j! e5 l
  104. *************************************************************************************************************************/
    ; j- W! t) j! t+ i) I+ {3 f( @
  105. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)/ X3 H$ a. U5 @
  106. {
    ! M% U5 N% J. m6 E
  107.         u16 t;
    9 _8 X* K0 n% d- h" T# g% m
  108.         int xerr=0,yerr=0,delta_x,delta_y,distance; 6 S: E- R- p1 N2 X  ?
  109.         int incx,incy,uRow,uCol;
    3 r2 H5 M2 ?* F' j3 t+ @+ m
  110.         # E& l0 N9 F! a* \  c
  111. #if(GDI_PARAMETER_CHECK)                        //参数检查
    ( D: r* ?- r2 `8 u
  112.         while(pHandle==NULL)8 W9 {' p# j% F  r- J' R. I! u
  113.         {7 ~1 h7 B1 U8 `. w% {7 y
  114.                 DEBUG("无效的句柄 pHandle\r\n");
    2 c& A. s1 X. C) W2 e8 k! j
  115.                 SYS_DelayMS(1000);
    % n  r7 a1 y' `4 W* S5 @
  116.         }        4 `0 K* k" ~4 g% p. ^) s: {
  117. #endif //GDI_PARAMETER_CHECK        . Q; L6 H* S& H1 K
  118.         ! ]9 D. Y* }5 f7 p, T) e
  119.         delta_x=ex-sx; //计算坐标增量 5 u! _: J6 l: M- n, j' x
  120.         delta_y=ey-sy;
    % b* E, }# `9 a3 W5 e4 V
  121.         uRow=sx; ' R6 s; K% o2 H- i! s1 k/ L
  122.         uCol=sy;
    9 W# W8 E( X; U. s- P) p
  123.         if(delta_x>0)incx=1; //设置单步方向
    4 ?% |! \' H4 i0 C) s& p/ A& W
  124.         else if(delta_x==0)incx=0;//垂直线 5 m6 |9 F% v% L2 Q" b  H. t; s; [
  125.         else {incx=-1;delta_x=-delta_x;} 4 j/ q9 s9 g* B$ @7 w
  126.         if(delta_y>0)incy=1; 3 ?. w. y) ?' k- N/ b' ^
  127.         else if(delta_y==0)incy=0;//水平线
    - \( [8 H8 a# B' O  J9 a5 u
  128.         else{incy=-1;delta_y=-delta_y;}
    0 l2 p* Q6 _8 c; o1 K6 X
  129.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
    ) ?/ \1 A% y) U$ u1 j
  130.         else distance=delta_y;
    ! [4 G: ^* g# L% E, o4 K
  131.         for(t=0;t<=distance+1;t++ )//画线输出 8 ]& P) C; M7 k! x- u0 C
  132.         {  
    % g% \4 |: T+ O; N# C* A) X7 A
  133.                 pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点
    : @  R' b% R5 {
  134.                 xerr+=delta_x ; 5 r( H& X5 \0 P7 g6 P5 L
  135.                 yerr+=delta_y ;                                                                                                 + I# |* w9 n8 T2 b/ `! Y. s) t8 |
  136.                 if(xerr>distance)   b5 W  t2 x" z
  137.                 { " i! O2 X( U) n* x# a) ]9 j
  138.                         xerr-=distance;
    * P2 c1 [) X/ V. p  A0 v4 x; ?
  139.                         uRow+=incx; 4 i" u, w2 W# P: a+ I, i: ~. w" B
  140.                 } 2 b# ~9 r' D+ F2 n
  141.                 if(yerr>distance) 1 |; m5 J) M3 ]. Y& z7 f% o6 P
  142.                 { : A- G3 }# [' `7 T8 w: B
  143.                         yerr-=distance; : `+ B$ l5 Q. P0 ^" K# O
  144.                         uCol+=incy;
    / _# V: p2 r. x+ Z# {
  145.                 } ( u" W& ^/ w% q4 h4 T8 j: s1 n
  146.         }  
    & i' y; L$ H/ E7 z8 l1 k/ j- q
  147. }
    8 D: j- N$ r) m1 h; T

  148. 2 m3 O! m% m; f6 ]% |4 |9 N. P2 b5 }! J
  149. / U6 E7 Q8 ]# D/ m& \) e9 p
  150. /*************************************************************************************************************************5 L( F9 E* c3 I, o, @. Q
  151. * 函数                        :        void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
    9 Q  z1 f. y& u0 c1 i
  152. * 功能                        :        在指定位置画一个矩形
    5 d1 w' r! L- h$ [: [; U2 l4 Y: K
  153. * 参数                        :        pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色
    , B4 F8 X' J$ Y& ?/ Q
  154. * 返回                        :        无+ c4 e% F; x! ?7 C: F
  155. * 依赖                        :        画线函数
    ( z2 c0 p7 A* j/ N. W9 D9 R7 ^$ J' b; P
  156. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>7 E4 ^" [+ X3 E) @- b* `& v
  157. * 时间                        :        2011-09-20
    . \; \5 S$ Q# `; K
  158. * 最后修改时间         :         2019-11-02
    . ^7 S' s( R+ W. ^1 R( N
  159. * 说明                        :         无( G3 i+ z( U  h2 u$ u8 W, `# I
  160. *************************************************************************************************************************/
    4 ?1 E+ a3 b7 ]; t0 g" Y& C( p/ o
  161. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)
    ! g& z/ u: U6 }+ s9 [* u% V5 j5 J
  162. {$ c5 h0 _. p" B* h+ R. \, E: T! K8 g
  163.         9 o: m; J. O* @
  164. #if(GDI_PARAMETER_CHECK)                        //参数检查& N8 P0 i1 V( T# ^+ a* n
  165.         while(pHandle==NULL)7 {# n) Z7 f  o" q  e" k' I
  166.         {
    ! `! g, t% R# }% D4 a- e  C
  167.                 DEBUG("无效的句柄 pHandle\r\n");
    : m* l( ?9 ]9 x, R. x
  168.                 SYS_DelayMS(1000);
    ! r' E/ |8 I; X% M4 L9 C9 t
  169.         }        ' v: v& ~/ G; T1 I) j
  170. #endif //GDI_PARAMETER_CHECK# j7 ?  P; U. N$ {# ^
  171.         
    " J+ z; [# v7 b0 `
  172.         GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);  |5 T; g/ E; {& }
  173.         GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);
    9 B- `3 {) ~' |" q1 T. u1 |3 ~8 N: m
  174.         GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);9 Z! n) }$ B/ _/ B0 q
  175.         GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);. p" c8 `( \" S& n4 l# N
  176. }                                                                           
    & `) f8 L, @# c+ `3 J* E* T. `

  177. " b0 k/ L9 n5 r/ f# [1 b
  178. & J& [9 e  w2 q$ @$ Q( u
  179. /*************************************************************************************************************************
    5 e: o/ Y% Y0 r) p$ W+ G
  180. * 函数                        :        void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    ( Z& T1 t0 |% E- ?: C
  181. * 功能                        :        画一个2*2的大点4 h% m8 t# f; e6 m
  182. * 参数                        :        pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色
    2 `5 O/ }4 ?7 R  }1 b; x
  183. * 返回                        :        无4 K9 K4 I; v2 s8 \. c
  184. * 依赖                        :        画点函数
    / b' w( ]: r; p0 Z
  185. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>( g0 r* s$ w3 j
  186. * 时间                        :        2011-09-20
    / J& \8 b- f/ @4 N3 A! T
  187. * 最后修改时间         :         2019-11-02
    ) s$ z' E1 I0 a, }& {6 L: g
  188. * 说明                        :         无
    9 }. J2 x; o5 `' ~5 V; m4 N& Q
  189. *************************************************************************************************************************/
    & T" h. E1 ~, W
  190. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
    " j* j4 l" U, c) X8 |* G# H
  191. {        ' V, S' v, N' t- e8 Z% q
  192. #if(GDI_PARAMETER_CHECK)                        //参数检查: D7 t$ R9 y: W- q6 d' f' |2 Q8 _
  193.         while(pHandle==NULL)
    6 Z$ f1 E8 o7 f9 A$ O3 m# k5 Q
  194.         {' m: _& i7 m* w) g8 d, r+ d0 W
  195.                 DEBUG("无效的句柄 pHandle\r\n");
    # e7 D+ r/ t: x# k
  196.                 SYS_DelayMS(1000);
    ) [/ ]- k$ v: b
  197.         }        
    # d5 S! c* V8 c( Z! C) F
  198. #endif //GDI_PARAMETER_CHECK
    4 e! S0 S- P3 T: G5 a1 a7 `+ R9 }
  199.         
    ( L9 d0 D: ~1 Y5 f' A* `  @
  200.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                //中心点 ; W: t2 T" ~% h
  201.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);
    6 b9 O! E; V- {+ {" @  g4 j3 }
  202.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);4 s! Z, x3 \9 u/ \/ `
  203.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color);                           * |; ^/ G9 l0 w  ~
  204. }        
复制代码

  s5 N# \" V4 g  Z& T8 n+ m% o; O& |* C
  1. /*************************************************************************************************************; M- T! Y. j( e  h5 y
  2. * 文件名                :        GDI.h
    ; L3 Y. V) y$ B( Y
  3. * 功能                        :        图形设备接口(Graphics Device Interface)) O& e4 m+ P5 k9 ?+ b( f
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
    # \2 Y' V2 u3 _& N* x' ]8 S6 z8 G
  5. * 创建时间                :        2019-11-02  _+ x5 W1 D2 b4 |
  6. * 最后修改时间        :        2020-02-020 ~0 P2 g$ y3 y* Z5 {" Z
  7. * 详细                        :        STM32F7 图形设备接口
    , E( r" K  s! Y; Y
  8. *************************************************************************************************************/! \, u2 e! G- _0 h! N: f
  9. #ifndef _GDI_H_
    # \6 d+ b: a$ Y: j6 x+ [
  10. #define _GDI_H_
    # i4 ]+ Z+ Y. ?/ s
  11. #include "system.h"* B9 x! H4 C% N  I* e6 {  p
  12. #include "DMA2D_GRAM.h"7 W8 M4 f% G& @# r; L/ T; M1 n

  13. - ?. U' D% W) t2 T; _; s0 e
  14. #define GDI_PARAMETER_CHECK                1        //参数检查-主要检查指针( [$ t& H0 S: h* M4 K9 o
  15. #define GDI_DEBUG                                1        //调试输出8 z+ n  Z: B. T

  16. ! _: u, a, z1 ?# v9 k4 S
  17. #if GDI_DEBUG
    % g: z* b: p! d, h# q. X$ P
  18.         #define GDI_debug(format,...)        uart_printf(format,##__VA_ARGS__)
    7 o/ U+ `* I6 d' ]" _7 E( L
  19. #else
    - d, N: m5 u. v  ^& {
  20.         #define GDI_debug(format,...)        /\; P) Z) d! z9 t2 `4 k! @
  21. /) ~* n: @9 K9 `. [
  22. #endif        //GDI_DEBUG1 Z. z! y, f$ s6 E

  23. , J- r6 O$ {0 I

  24.   K! Q: J' j, X# Z. ^/ `5 S3 O0 a
  25. 1 r: l  Z' n4 k. T
  26. extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle;        //显示器Layer1 GRAM定义
    , d$ k1 m7 l, t/ |
  27. extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle;         //显示器Layer2 GRAM定义+ s1 l1 L, o7 U- F& s/ ]
  28.         
      R* s3 y! n) s/ q0 V
  29. #define LTDC_Layer1_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle)        //显示器GRAM 16 {( C( b* g2 W8 O# ~
  30. #define LTDC_Layer2_GRAM_HANDLE                ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle)        //显示器GRAM 27 @! I" T% \2 _* F
  31. 1 S6 b* V1 n( V7 B' G
  32. //GDI相关API% g3 E9 U" k6 j
  33. __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
      U9 p  y# L: R2 x) k8 a
  34. {        
    5 F! I  }" j) H. K
  35.         pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color);                                                //画点 3 c, S, x9 K2 n6 k3 _: E
  36. }        
    8 c4 }9 `0 l. h& r
  37. void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color);                        //绘制空心圆; P+ }8 A* O  p9 a
  38. void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color);                        //绘制直线(可以倾斜)+ B$ i0 s% {+ `- w! C  C
  39. void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color);                //在指定位置画一个矩形
    " u/ E! \# L. a
  40. void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color);                                        //画一个2*2的大点7 z* ]' K) m* f; n

  41. % x/ u$ h) }( t
  42. # L4 B! W$ \# D' q7 c$ q3 ^
  43. #endif /*_GDI_H_*/
复制代码
; C- N7 J6 l4 ]8 X' i
测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。: |& g/ U# K" v% R7 x1 b4 P1 s

" h7 R9 o! U4 p6 {# S$ a4 D
  1. FIL *pFile;& u& f* `( v. L
  2.                 FILE_ERROR mError;' E3 n" X3 W3 ]; s
  3.                 GRAM_HANDLE *pGramHandle;
    2 C2 h1 G( V) S. r& }9 E
  4.                 9 k% ]# e6 I4 {  w
  5.                 pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565);        //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB5656 E% e& e4 J$ ?1 y9 ]$ B
  6.                 if(pGramHandle != NULL)
    2 d3 B3 r& y% a  G8 q5 p6 i
  7.                 {
    7 H# [! \" {  V7 N8 g3 w$ Q8 l
  8.                         GRAM_Clear(pGramHandle, 0xff00);                                                //清除显存,防止读取失败了还是现实上一次的图片
    ) K$ F. l( s: E5 D
  9.                         uart_printf("[OK]GRAM初始化成功\r\n");
    2 B$ ~1 u- y# ^  E5 a5 v
  10.                         pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);
    - E" b) h+ ~. b: ~* t8 A
  11.                         if(pFile != NULL)
    9 l& i; y( }' e0 G6 g
  12.                         {6 p6 N8 z* w4 n* ]0 J( v
  13.                                 uart_printf("[OK]打开文件成功\r\n");
    ( i6 B, P) u/ a
  14.                                 if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中$ s/ ^0 |% X; O' Q' e) C
  15.                                 {
    2 G9 q: n1 Y+ b" S; [8 B& r' z. B
  16.                                         uart_printf("[OK]读取文件成功\r\n");
    - I3 u# `2 o9 D9 P' {
  17.                                 }
    8 S) g# {. x9 ?- A& ?0 D4 }! J& L
  18.                                 else' L8 R, V$ ?; F: s# I2 ]" J
  19.                                 {" p; O: F  Z0 w) ^6 S' x
  20.                                         uart_printf("读取文件错误:%d\r\n", mError);8 u6 l3 n8 V" I6 {* R% t
  21.                                 }% Y- D5 P! P1 f0 N  v9 X
  22.                         }
    % ^( ?7 z# p9 ~
  23.                         else4 G( I5 U9 N( w5 z6 s+ P( q
  24.                         {
    . {8 r6 |, Z; O. A3 [* _
  25.                                 uart_printf("打开文件错误:%d\r\n", mError);
    # `, ~! g7 [/ j5 f) w/ t- L% A
  26.                         }" j% O. b. K1 b/ n2 A2 j
  27.                         //将显存拷贝到屏幕中* E* i* P" K0 ^# A9 r5 J, o7 d
  28.                         GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240);                        //GRAM局部拷贝3 L3 r2 H6 G+ e. z
  29.                 }
复制代码
' _: R- j7 Y. W9 T

- j1 N6 F: Q- |. l+ ^; g4 T2 b- U( j+ n" u1 S+ a; Y8 |
赞 收藏 评论0 发布时间:2021-12-16 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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