DMA2D可以加快图像填充,并且支持像素格式转换。/ S7 K* _* z5 A; `8 W7 G
8 w: D# l3 Z: {2 J- /*************************************************************************************************************
5 ?! X/ m7 e2 w1 D% n7 W8 F: R - * 文件名 : dma2d.c
" n# K7 K2 n- U+ Z - * 功能 : STM32F7 DMA2D驱动
( P: |' S8 P4 J K8 k! [ - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a> v2 B" K+ X0 r9 L5 B J
- * 创建时间 : 2019-10-29
. e% v! [+ G- @' n: x6 k - * 最后修改时间 : 2019-10-29
( ]0 p% G8 \/ n% {: G+ \$ L& d - * 详细: $ D4 K& V7 u2 ~
- *************************************************************************************************************/
; n: p; J7 M i/ P7 i2 d' g - #include "dma2d.h" c" {/ f* s8 R3 ^) G3 X
- #include "SYSTEM.H"
2 l! x- m/ V4 C - - ^% e5 A6 h9 h2 D. Z- v& i( K1 G: n
- & t7 S# u4 l4 c S0 P1 \: J5 s5 [
- /*************************************************************************************************************************5 p, X' ^' {3 D9 f9 ^# J, q4 @
- * 函数 : void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX, DMA2D_COLOR_MODE ColorMode, u32 Color)
! P. O# `+ V5 V ~ ?5 [5 o - * 功能 : DMA2D进行单色填充- b" m5 q0 k. v# q0 j
- * 参数 : FGRAM_Addr:GRAM地址,通过地址控制开始的X,Y坐标;Width:填充的宽度;Height:填充的高度;OffsetX:通过偏移设置跳过的X坐标;& b5 u/ A( [( `2 K
- ColorMode:颜色模式;Color:颜色值+ Q' a+ q7 v- T. ]# {% f# b* M, v
- * 返回 : 无
# _2 a9 a1 l* |# b$ U N0 | - * 依赖 : 底层宏定义% b2 p% Z1 Y- }/ @; u. A- r
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>( ]* |, \. c8 ^' j2 r
- * 时间 : 2019-10-29
/ p' S* v3 ?2 M - * 最后修改时间 : 2019-10-303 d6 H. E3 \$ V# m, N
- * 说明 : 用于填充矩形颜色,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束2 z/ y9 A" n' u* h) G. e4 N
- *************************************************************************************************************************/
) z3 M: _1 ~6 Q; S" ]5 w - void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX, DMA2D_COLOR_MODE ColorMode, u32 Color)& X; f6 s6 f$ L
- {3 l" a7 Q7 ~8 x3 k5 h8 f0 m
- SYS_DeviceClockEnable(DEV_DMA2D, TRUE); //使能DMA2D时钟. ]) r3 Z& V8 ~% @9 z" [
- DMA2D->CR = 0; //先停止DMA2D
" U4 H+ Q) m) n9 m - DMA2D->IFCR |= 1<<1; //清除传输完成标志
. D( w4 \0 r5 Z( V; K- g9 f$ r - DMA2D->CR = DMA2D_MODE_REG<<16; //寄存器到存储器模式4 U6 ^. @3 s) u8 l9 B3 G
- DMA2D->OPFCCR = ColorMode; //输出颜色格式
0 b7 Y% B) g+ d7 M - DMA2D->OOR = OffsetX; //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充9 X# E+ D: ^' R
- DMA2D->OMAR = FGRAM_Addr; //目的地址: T6 Z1 M% E, M: X
- DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0); //设置每行像素与行数
2 X3 V" G) i7 k9 X) b - DMA2D->OCOLR = Color; //输出颜色
9 Z4 f( T# _7 a( z - : W' ^- Z, S' j) R
- DMA2D_Start(); //开始传输, j5 K4 X l% W# J2 c E) @2 D/ k
- }2 |$ j+ N* g: I4 `
2 K$ A* Y# u L
# l4 x1 M1 g, W5 z* Y# @' C
/ ]" m6 T0 t1 h, U |2 j- /*************************************************************************************************************************+ g$ j5 E8 l' o# U
- * 函数 : void DMA2D_WaitTransferComplete(u32 TimeOutMs)
( L% g. e) V" Q% t: W$ z; W8 P - * 功能 : 等待DMA2D传输完成/ Y8 q- Z3 K# I8 w
- * 参数 : TimeOutMs:超时时间
" I, s; p' `7 Z+ }% n7 }( ` - * 返回 : 无2 j2 d# m* d% r- v4 W4 m
- * 依赖 : 底层宏定义" j$ D( J; M7 X6 }* {$ n/ a0 a& `
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>
; w5 R a4 M E @4 V m - * 时间 : 2019-10-30! ^& a" q0 i- j; w
- * 最后修改时间 : 2019-10-30
2 i( z8 F9 b4 X3 v* _ - * 说明 : 超时后会取消传输% f# n: W: [: n8 V# x4 Q
- *************************************************************************************************************************/
3 O1 j: q- G( t6 [2 c, y% G \+ c - void DMA2D_WaitTransferComplete(u32 TimeOutMs)$ g; C3 B, E4 `: H
- {& K& q7 R q+ a0 z' E0 _' x
- u32 timeout = 0;) N- l0 O6 M1 {+ O( q2 C
-
" @/ o+ t2 X: v, R5 ?9 ~/ H" P - while((DMA2D->ISR & (1<<1)) == 0) //等待传输完成
7 n+ H) _! @0 X( C- o. m - {6 y, O: g& T3 a( T! S' E1 T
- timeout++;
8 A: G# j( S* j5 m' {4 N - SYS_DelayMS(1); //延时1ms
' r: ?/ H' `( y$ s. w - if(timeout > TimeOutMs)3 }! |" N5 b' l( g3 e# L6 b
- {7 f3 p2 e* |' L0 r& `
- DMA2D_Abort(); //终止传输
$ G/ O" Y3 _; Y: E1 Y3 u. {: x - break; //超时退出
1 ?/ M! N2 S& r1 ^: o) r - }
# |+ Z+ {. f8 @; O: ~ - }
5 Y5 R( o7 n, v' K0 w4 Z1 y8 P+ w - DMA2D->IFCR |= 1<<1; //清除传输完成标志
3 x% h* j' ~3 h" L) j" Q - }; y9 z' L/ S& N& q7 l
3 C6 t3 x4 x0 M5 ^2 O- /*************************************************************************************************************************; }; [6 i3 Z, T, p; @/ J& H
- * 函数 : void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)
+ ^# p) a) Q" w/ W - * 功能 : DMA2D进行矩形图形填充$ E6 T4 ~4 @6 N5 H7 e" A( i
- * 参数 : SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);
, T o( F2 _* }$ p3 P: Y - Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);4 k0 G0 l) B, m) P% m
- ColorMode:颜色模式) |0 S# }: G0 H# y* ~3 H
- * 返回 : 是否设置成功) O: {9 g/ X( a V
- * 依赖 : 底层宏定义
( n* N, O5 `8 R - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 }2 m, _! I* }$ H" B) r t
- * 时间 : 2019-10-289 {/ G+ `$ M: x& q
- * 最后修改时间 : 2019-10-28
/ q4 V+ M- b9 ^! B% F$ ~3 u - * 说明 : 用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束. q4 z/ N, N" e* X. O
- *************************************************************************************************************************/' W+ h1 x9 Y' z- ?5 m5 Z9 y
- void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode)5 z; \8 b* @2 c3 S, ?
- {
1 ~/ C0 }# p* p4 b" |# j; E4 O - SYS_DeviceClockEnable(DEV_DMA2D, TRUE); //使能DMA2D时钟' d8 s/ w' P/ c* u! f+ j% S
- DMA2D->CR = 0; //先停止DMA2D# I, j( `! F6 n. d9 w# E/ s
- DMA2D->CR = DMA2D_MODE_MEM<<16; //存储器到存储器模式! h6 p- [3 g# t2 Z& V. K
- DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0); //设置每行像素与行数8 X. }$ ~2 f+ r6 z. X
- DMA2D->OPFCCR = ColorMode; //输出颜色格式
Q8 ?+ R ]; J2 i; @1 ?# R. ~# c6 y - DMA2D->OMAR = DestGRAMAddr; //目的地址
, b2 I9 N7 F4 n - DMA2D->OOR = DestGRAMOffsetX; //目的GRAM图像行偏移 8 I6 k. u/ D( E% X8 `0 k& y; M. A
- DMA2D->FGPFCCR = ColorMode; //源图像颜色格式
' z2 X1 x2 b( U9 Y, j: ~ - DMA2D->FGOR = SourceImageOffsetX; //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
3 V& {# [$ N e0 @ - DMA2D->FGMAR = SourceImageAddr; //源地址
4 [* a* k3 Y$ v+ \( F -
* L; C- R& z- s( P! E% ]( G - DMA2D_Start(); //开始传输" _, b! ?5 l' p8 n
- }7 A7 s. V8 _' O
- & A) Y$ w& U1 b9 I+ }# T& p! }. M
' N, M, o3 K( ~" O6 R0 T9 C1 }9 C6 a- /*************************************************************************************************************************
, V% F# s- Q+ n7 q# z0 x - * 函数 : void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode, 1 @9 P! }8 _* h# l& ]
- DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)+ I4 ?$ y7 @1 C2 L0 b( _0 t
- * 功能 : DMA2D进行矩形图形填充(会执行像素格式转换)( ~' t2 h) b0 b# i% `. Q* j7 x
- * 参数 : SourceImageAddr:源图像地址(通过地址控制开始的X,Y坐标);DestGRAMAddr:目标GRAM地址(通过地址控制开始的X,Y坐标);7 [: K/ _6 B+ a( ^% C: A1 o$ Y
- Width:填充的宽度;Height:填充的高度;SourceImageOffsetX:源图像X偏移(通过偏移设置跳过的X坐标);DestGRAMOffsetX:目标GRAM X偏移(通过偏移设置跳过的X坐标);
' U5 x9 T" T! ~: [* t" G - SourceColorMode:源图像颜色模式;DestColorMode:目标图像颜色模式
6 E3 R+ P8 \ K: C - AlphaMode:alpha模式;Alpha:Alpha值;
" t6 `$ R% w" K( l0 e9 O' T6 C. I - * 返回 : 是否设置成功
) u7 V7 t: t) g; [: ` - * 依赖 : 底层宏定义3 n; e9 ?$ e6 U6 `5 a4 H6 F& ^3 E
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>
+ ]9 X8 x. N% @- s4 C) N - * 时间 : 2019-10-28
3 Z- ~' C. k! p8 y - * 最后修改时间 : 2019-10-28( m) G9 p8 b7 d0 g5 @/ E; M4 I: n* B( t
- * 说明 : 用于填充图形,不会等待是否传输成功,需要调用DMA2D_WaitTransferComplete()等待传输结束+ F% p: \; p3 f' q% {9 c
- *************************************************************************************************************************/
% i8 W0 }8 o- @# W) F! Q' j2 ` - void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
6 p* ~" T7 s% b% `" H$ y - DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)& a( H6 [6 Z, t5 } j6 h( [2 {$ b1 P
- {# T; T& G) R. }8 {4 L, {
- SYS_DeviceClockEnable(DEV_DMA2D, TRUE); //使能DMA2D时钟( T: E0 @- p$ D- S0 v7 ?
- DMA2D->CR = 0; //先停止DMA2D
9 k- U% f' D8 w: z - DMA2D->CR = DMA2D_MODE_MEM_PFC<<16; //存储器到存储器模式-激活PFC
% i1 Y* U$ T. H) w2 b - DMA2D->NLR = ((u32)(Width&0x3FFF)<<16) | ((u32)(Height&0xFFFF)<<0); //设置每行像素与行数' G% _9 d$ B2 r; m3 h% i: Z9 U- j
- DMA2D->OPFCCR = DestColorMode; //输出颜色格式6 U# T- L% z& U& |' H2 G
- DMA2D->OMAR = DestGRAMAddr; //目的地址& r- y. z' w4 _& r
- DMA2D->OOR = DestGRAMOffsetX; //目的GRAM图像行偏移
. M, |& u+ L V9 ^ - DMA2D->FGPFCCR =((u32)Alpha << 24) | ((u32)AlphaMode << 16) | SourceColorMode; //源图像颜色格式
% H+ H+ I! N9 {. ?/ O4 M2 E - DMA2D->FGOR = SourceImageOffsetX; //输出行偏移寄存器-相当于设置X坐标填充间隔,可以实现对一行的部分进行填充
/ c5 z1 ]* s- e - DMA2D->FGMAR = SourceImageAddr; //源地址# x' ]) @. W7 ^
-
5 D1 {) Z" p% O! I6 G/ B2 t - DMA2D_Start(); //开始传输
# J% w2 o( Z# Z- [5 ^/ J' @ - }
复制代码- /*************************************************************************************************************: z- \+ I! I7 v+ S; _8 R8 m
- * 文件名 : dma2d.H
3 G, J+ H# U: X" N/ t8 z% B, U - * 功能 : STM32F7 DMA2D驱动6 i) b$ { {2 m
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>- G! v+ Z5 X* @3 P' p2 j
- * 创建时间 : 2019-10-29
( E+ F0 h% u2 m1 L/ z - * 最后修改时间 : 2019-10-29 Q; h6 w' ?1 Y- X; A J* O
- * 详细:
/ q8 Z# S1 O- N. G - *************************************************************************************************************/
" F' V& v# \# d: g# S - #ifndef __DMA2D_H_% a, U/ T, X0 l @/ x1 N" s
- #define __DMA2D_H_
" [7 |1 n9 n' z) ~ - #include "system.h"
0 |5 }- @) z5 S3 v/ G$ X) X. l/ K - 2 E. U' F0 s! a* L& J+ O' I; N% N
`8 q) u0 N3 R- typedef enum9 C0 V% O' T4 H
- {
9 K; W, [ Y7 ?7 R6 [& o. s - DMA2D_MODE_MEM = 0, //存储器到存储器(仅限 FG前景色 获取)/ ?1 m f5 ?) |# Y- u
- DMA2D_MODE_MEM_PFC = 1, //存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)
' M8 z6 U! e1 v2 ^, ] - DMA2D_MODE_MEM_MIXED= 2, //存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)/ p! K8 V5 P- j5 @5 H
- DMA2D_MODE_REG = 3, //寄存器到存储器(无 FG 和 BG,仅输出阶段激活)
* X5 y1 M3 e3 f8 s - }DMA2D_MODE;1 y, _. p: ]3 W2 R
- 6 {; D6 J; ~. b. E6 W0 l+ G1 B! |7 |
- //颜色模式
( f; x" Z: W4 O - typedef enum
5 M8 a6 S8 ^$ R - {. }9 a. ^" U0 f; V$ O5 K' I, t
- DMA2D_COLOR_ARGB8888 = 0,
3 \' j, P* e- @- M- J - DMA2D_COLOR_RGB888 = 1,' j8 F( O6 x% S+ I4 F
- DMA2D_COLOR_RGB565 = 2,
0 z/ b$ U V" x8 { h0 k: M# t - /*DMA2D_COLOR_ARGB1555 = 3,
, ^8 w0 H) Q* W+ m - DMA2D_COLOR_ARGB4444 = 4,
! u( @: c# q, {7 U, G. I+ { - DMA2D_COLOR_L8 = 5, //8 位 Luminance( t# l% K6 f4 d3 C s/ }+ ?& e
- DMA2D_COLOR_AL44 = 6, //4 位 Alpha,4 位 Luminance
6 w$ W% ~# s' {" c1 Y - DMA2D_COLOR_AL88 = 7, //8 位 Alpha,8 位 Luminance
, ^& Q, t2 U6 [% ~3 F5 B3 b6 G - DMA2D_COLOR_L4 = 8, //4 位 Luminance5 E" ?& \/ j4 ^- E) v; [; ~# a& C
- DMA2D_COLOR_A8 = 9, //8 位 Alpha
9 k! b, F& ?, I5 _ - DMA2D_COLOR_A4 = 10, //4 位 Alpha*/
- s* n6 B; D+ H$ R5 K/ ^" ^ - }DMA2D_COLOR_MODE;
G G4 i( m5 b/ H
/ D* L& W+ J! {/ w- V
3 a! k2 g, s! `# j) A- //Alpha 模式! M: i4 M& i4 P- g i* p
- typedef enum
" b# d5 r2 y) E( R5 G. g - {
) ^0 I j! ]5 Z5 _! b ]* l1 e - DMA2D_ALPHA_NULL = 0,//不修改前景层图像的 alpha 通道值" Y* L2 u+ I- ~
- DMA2D_ALPHA_REPLACE = 1,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0]% ^8 e% Z6 l' G) {& }
- DMA2D_ALPHA_PRODUCT = 2,//原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0] 与原始 alpha 通道值的乘积
! B2 I f; K: a4 P5 |$ h7 ] - }DMA2D_ALPHA_MODE;$ B7 E1 D5 h( M, u" r
- : n G7 Q4 n$ O: C# a
- : ]! Q8 Q3 Y, i7 |* ~4 [' ~
- __inline void DMA2D_Abort(void) {DMA2D->CR |= BIT2;} //终止传输$ g8 Y9 q C* }5 L; H
- __inline void DMA2D_Suspend(void) {DMA2D->CR |= BIT1;} //挂起传输' k$ c: k6 a) m* X" ~. D
- __inline void DMA2D_Start(void) {DMA2D->CR |= BIT0;} //开始传输7 a; d$ ^0 R4 g6 r
- . B8 _# {; h* J; B& T
- void DMA2D_FillColorToFGRAM(u32 FGRAM_Addr,u16 Width, u16 Height,u16 OffsetX, DMA2D_COLOR_MODE ColorMode, u32 Color); //DMA2D进行单色填充) G- ^0 z S, N1 }0 L( N; {
- void DMA2D_WaitTransferComplete(u32 TimeOutMs); //等待DMA2D传输完成' p% ~ f: F: W0 n
- void DMA2D_FillImageToFGRAM(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE ColorMode);//DMA2D进行矩形图形填充
7 k7 C; D7 Q: F. ]/ j: V# d - void DMA2D_FillImageToFGRAM_PFC(u32 SourceImageAddr, u32 DestGRAMAddr,u16 Width, u16 Height,u16 SourceImageOffsetX, u16 DestGRAMOffsetX, DMA2D_COLOR_MODE SourceColorMode,
4 K$ A7 H6 @' \7 X' I1 ?- L" k - DMA2D_COLOR_MODE DestColorMode, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha);//DMA2D进行矩形图形填充(会执行像素格式转换)4 S2 F7 [: P# U/ ~
- #endif //__DMA2D_H_
复制代码- /*************************************************************************************************************
, w8 K& R2 E5 L* N0 W( S# R - * 文件名 : DMA2D_GRAM.c+ `& x" P% q& i" A) Y
- * 功能 : GRAM相关操作
, i8 V: P* W( z$ X/ ]/ W! W - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>
2 J: n' w& Q+ j' X - * 创建时间 : 2019-10-30
, b& q. I' c) o0 T# R2 Z7 Y - * 最后修改时间 : 2019-10-30
. [* h" g# b6 L: N - * 详细: 显存相关操作接口
) T+ M7 y: F7 h d - *************************************************************************************************************/ % y5 t) q0 U* i* P
- #include "dma2d.h": b8 d1 [+ F! q7 e6 x5 ], d u+ O: [
- #include "DMA2D_GRAM.h"
$ D! V, a6 ]/ N/ m& M - #include "SYSTEM.H" ' D; `& n% C2 _
' w! Q! I ^( \( M- //基本接口
0 e% {% T/ A' F" z" w - void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color); //32bit色彩GRAM显存画点5 ]& Q! u& _% f) L! {6 u. @1 {
- void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color); //24bit色彩GRAM显存画点
; A5 L& A* S$ i* @ - void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color); //16bit色彩GRAM显存画点; {" k$ p% { L. t5 D4 t
- 3 L( U I7 a3 k
; g& U/ T1 o) u+ h m+ x+ ~- //GRAM相关接口-16bit* C+ @! d# n6 N5 G6 g3 J
- const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit = " z0 u- K+ f* ~; ?/ F( G2 x) j4 p
- {
$ c g: H% j4 H' V0 i - (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_16bit, //GRAM显存画点(RGB565格式)) w, S' ^' I7 s: i
- (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill, //GRAM矩形填充
& @* U+ T2 C4 N5 V0 U6 C! i4 ?/ D - (void(*)(void *,u32))GRAM_Clear, //GRAM清屏(使用DMA)
* F# n7 J, Q" h: V6 r/ | - };% |- w0 U0 h' Y# t$ ]
# m* f/ r1 ^1 ?& R0 {& f% e" J- //GRAM相关接口-24bit
$ \' x8 p9 G( @! y6 u7 J2 c* f - const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit = ! U" B: j5 T, {) c; S _
- {% P+ _- p' A& N3 ~
- (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_24bit, //GRAM显存画点(RGB888格式)
: R n) H) d. l - (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill, //GRAM矩形填充
. G. ~5 g A: C, B - (void(*)(void *,u32))GRAM_Clear, //GRAM清屏(使用DMA)
% K* B4 u1 f/ l' k( V - };3 y6 F0 l, ^7 ^8 C3 L
! |2 g* \! D3 w; P- //GRAM相关接口-32bit: E D1 J% B3 L2 ?
- const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit =
. U7 e* t' R: U% }6 Z% g - {
( c6 o. o8 d; t6 h( T) L1 `3 a - (void(*)(void *,u16,u16,u32))GRAM_DrawPoint_32bit, //GRAM显存画点(ARGB8888格式)1 H U# k7 |: n; U+ c
- (void(*)(void *,u16,u16,u16,u16,u32))GRAM_Fill, //GRAM矩形填充/ C2 K- ?% V# i
- (void(*)(void *,u32))GRAM_Clear, //GRAM清屏(使用DMA)* }- U9 e: q6 A R* J+ C' E2 s
- };
1 h1 U! P+ |& B
. K9 c, f1 y. y, F) B- /*************************************************************************************************************************
7 T0 Y& `5 j* I2 ]! D - * 函数 : void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)
9 J4 ^. h( k% L) Y" E9 e - * 功能 : GRAM句柄初始化(不会申请内存)/ D: O9 F. X( }
- * 参数 : pHandle:GRAM句柄;GRAM_Addr:GRAM内存;Width:显存宽度;Height:显存高度;ColorMode:颜色模式+ l( Z( ^& n# ^ Z3 g
- * 返回 : 无6 T [6 d: C0 u, S. I5 \, X# q
- * 依赖 : 底层宏定义
1 d# J: m. n' g: d: T# |/ L4 J - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>% N ]/ o3 f# u, S0 q7 \
- * 时间 : 2019-10-30
, s$ O/ M% `0 {" }, B* } - * 最后修改时间 : 2019-10-30
! M& r7 E8 u, Y. r - * 说明 : 初始化显存7 g* n) ^' c/ N+ Z9 H# ^
- *************************************************************************************************************************/1 a+ U3 M+ N9 s$ l
- void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)9 b5 e+ L* N7 y1 u
- {9 x1 E+ y7 X9 n2 ?$ ?) e D
- while(pHandle == NULL)# s5 ^& Y8 u3 B8 m6 b6 @* y' t
- {' v- `& i2 K0 M
- DEBUG("无效的句柄pHandle\r\n");! p$ Y9 }% Y$ f5 U/ D4 E: @
- SYS_DelayMS(500);
, o+ m/ S7 J7 F5 Z: i - }
0 \0 a. |6 G7 z4 z/ J - pHandle->GRAM_Addr = GRAM_Addr; //GRAM地址
, v0 U! Q( W8 c3 b1 k - pHandle->Width = Width; //GRAM宽度' \/ J. }, h1 J7 r3 I2 ?' [" }; r# L
- pHandle->Height = Height; //GRAM高度
, W6 O2 H9 J; g- M' d$ ]3 S - pHandle->pGRAM_32bit = (u32*)GRAM_Addr; //32bit颜色模式下显存指针$ o1 k9 C8 Q, Q7 ]+ O) g" F
- pHandle->pGRAM_24bit = (u8*)GRAM_Addr; //24bit颜色模式下显存指针3 E! s; Y/ _) ?+ _- k9 p E+ Q
- pHandle->pGRAM_16bit = (u16*)GRAM_Addr; //16bit颜色模式下显存指针: r4 J" W( u* G! Q# o
- //像素模式
- E. b" }# n1 C% q1 L1 ]) G - switch(ColorMode) ?" s O. ~: `; m; ^0 F, ?" j
- {$ I9 n9 N0 D0 ?8 d6 j- p
- case DMA2D_COLOR_ARGB8888 :
( P6 @. y# ]+ }( A# g1 X5 k - {
% R4 ?, i& R* G6 D' f5 _ - pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;. O7 z# X2 o1 _5 Y
- }break;, i, v3 A. t( \ t+ |; p
- case DMA2D_COLOR_RGB888 :
1 u7 S& x; m) }( s - {
$ h, R9 p) d9 x8 [ - pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;
& d( Z2 j' ~4 G8 s+ B$ k3 o( o* \ - }break;; e9 d2 `# D7 S
- default: //DMA2D_COLOR_RGB565
f5 J5 c' J+ D* H. b - {
: |: T& |9 ]# k1 f - pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
9 a7 _; `( e7 O4 k3 Z - ColorMode = DMA2D_COLOR_RGB565;, ] k. X/ X7 k7 T. _
- }break;
+ y& f2 @9 ]# u3 d- t5 ? - }
1 x' ] N3 w6 S4 O2 @, ~5 G( H! T - 9 n7 y3 `* _$ b( u
- pHandle->ColorMode = ColorMode; //GRAM显存像素格式, V6 L* h( u7 \
- pHandle->InitStatusId = DMA_INIT_OK; //初始化成功
! M1 q" R' {8 s7 `5 q! s/ |- l# Z - }
3 }' r4 N% H* w& Y+ ]
4 P. y; p3 _* t! O- /*************************************************************************************************************************# i0 `/ V: z- P
- * 函数 : void GRAM_Init(GRAM_HANDLE *pHandle, u16 Width,u16 Height,DMA2D_COLOR_MODE ColorMode)
4 W/ _6 | Q4 J0 X, [7 D8 |5 p3 e* G - * 功能 : 创建一个GRAM(会申请内存)
9 h( }! p% f0 L* m% F - * 参数 : Width:显存宽度;Height:显存高度;ColorMode:颜色模式
& k X" ]; V& I" `$ U: ^! r - * 返回 : NULL:失败;其他:GRAM句柄) R( M! c6 N1 S, d* b
- * 依赖 : 底层宏定义( P/ J8 X* r6 `8 X2 F# n
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>" M5 O/ ?- ]' N, k' {4 }
- * 时间 : 2020-02-02: ]6 _% Z6 O1 m9 f8 v7 w/ `
- * 最后修改时间 : 2020-02-02
0 W2 W4 O2 |# I# f - * 说明 : 初始化显存' C/ d4 ]# P# J
- *************************************************************************************************************************/
2 k( k2 ]% z2 E6 j4 x - GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode)' t0 p" s1 G2 q3 O
- {9 I3 P/ f# q) B. t( h) j) I. q& Q
- GRAM_HANDLE *pHandle = NULL;
4 N3 W X! Q! N2 e8 C - u32 GRAM_Addr;
6 t: q# m0 T8 V2 R: A/ K4 ^ -
0 d9 T) i) D5 h" m3 E: K - pHandle = (GRAM_HANDLE *)GRAM_malloc(sizeof(GRAM_HANDLE)); //为句柄申请内存, z) T$ l+ G8 ?3 a# V
- while(pHandle == NULL)' q- ]) T% x( p% g
- {
t, \4 I( i q8 D1 } - DEBUG("无效的句柄pHandle\r\n");' o! R4 n, l2 B a* I/ j/ T
- SYS_DelayMS(500);
% T6 U8 W% p' N: m! `( a4 h, _+ P( ` - }2 c. L8 O& {. V+ A( \6 I; j
- 8 f' [8 W! b# d0 k7 K0 P* z
- switch(ColorMode)' }& N- p6 k" h
- {
0 f# N. `1 w! S - case DMA2D_COLOR_ARGB8888 :4 V6 {: n: {/ z* K/ u
- {2 p+ I$ u& R6 X! a
- GRAM_Addr = (u32)GRAM_malloc(sizeof(u32) * Width * Height);//为显存分配内存
! Y8 {& A7 i* h. D5 [9 f - pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_32bit;
2 i8 @5 B8 o+ ~/ M - }break;
5 `" s3 e, Y: u9 v - case DMA2D_COLOR_RGB888 :
. ~ K( q* e- l$ m2 q - {& R# q$ p% j+ v7 q( p6 b0 S4 m
- GRAM_Addr = (u32)GRAM_malloc(3 * Width * Height); //为显存分配内存
5 n+ [6 a3 k" _5 o0 H! P - pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_24bit;# f4 Q0 @: H( w. w
- }break;' z6 h* o, j' y, w4 a3 X3 h
- default: //DMA2D_COLOR_RGB565
: K U' L/ A# s; E8 u - {
% ?2 D+ V. w1 M* s8 ~* O' k - GRAM_Addr = (u32)GRAM_malloc(sizeof(u16) * Width * Height); //为显存分配内存1 O, q+ i4 l' Q1 V
- pHandle->pBasicInterface = &cg_GDI_GRAM_Interface_16bit;
' c; G; h) E+ ^- {7 d5 {9 v( m - ColorMode = DMA2D_COLOR_RGB565; |' ?+ m3 y8 V m
- }break;
% n2 B0 k/ z6 {2 ?9 @ - }
2 C; G5 M% F6 w; D -
$ d z( y3 e+ ^9 c - while(GRAM_Addr == NULL)
( l# @' {8 u+ h7 q$ o4 i! b - {
6 i1 K7 S U. b3 o, @: K+ i$ C' F S+ j - DEBUG("显存申请内存失败\r\n");
$ i" s# ?. d+ R3 A9 s% c% \2 X. o9 | - SYS_DelayMS(500);7 m, y$ e5 H4 O* _. E3 r- e
- }
/ i* P/ t2 T/ v+ m+ V -
, r8 d+ V* F4 p8 K5 X - pHandle->GRAM_Addr = GRAM_Addr; //GRAM地址9 V( w( {, ]" C0 b. I9 E9 O
- pHandle->ColorMode = ColorMode; //GRAM显存像素格式+ ]/ n+ U& K6 L- ~" ?9 z0 Z
- pHandle->Width = Width; //GRAM宽度
' J3 n! m1 q0 \5 J i5 | - pHandle->Height = Height; //GRAM高度
) W9 a/ o Z' T8 H5 T - pHandle->pGRAM_32bit = (u32*)GRAM_Addr; //32bit颜色模式下显存指针
7 H9 B% ]5 j6 v' W) ^' ` - pHandle->pGRAM_24bit = (u8*)GRAM_Addr; //24bit颜色模式下显存指针
" U+ }" w0 c- t - pHandle->pGRAM_16bit = (u16*)GRAM_Addr; //16bit颜色模式下显存指针( I* o3 h& F; W3 U G
- pHandle->InitStatusId = DMA_CREATE_OK; //创建成功
+ j- E* X6 N% q' H - 6 h* n) S0 e; e2 z- f
- return pHandle;. c( I5 k( {; t
- }. Y+ V. l" H3 A. }; X9 r
- 8 I* P+ `7 [: t. ^( Z
% l6 I, h2 y1 j' r' R/ V* p
7 V* O; ^, g- _, {, ]7 B- /*************************************************************************************************************************
( f( N3 b' t$ s, s2 L! A) ^ - * 函数 : void GRAM_Delete(GRAM_HANDLE *pHandle)
' a; [, h: ]) @" a7 c4 M: J* W& K - * 功能 : 删除一个GRAM(会释放内存)
1 C" h# \5 o* D: l! t" c9 | - * 参数 : pHandle:GRAM句柄
$ u/ [! d- w3 ?, \7 x - * 返回 : 无' k+ E# Z" ]3 v; S/ i) H2 z
- * 依赖 : 底层宏定义
~8 S! D+ C4 K, I - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>! K: r' M" B& d+ ?, E$ f
- * 时间 : 2019-12-161 f G. W' Y! ~; A& e: J# d8 p
- * 最后修改时间 : 2019-12-163 e% j+ E5 V6 Z7 u2 j" {
- * 说明 : 用于删除显存,释放内存
/ o* k8 s8 G) X& F( } - *************************************************************************************************************************/4 d$ l6 k' u. P3 r+ u( f
- void GRAM_Delete(GRAM_HANDLE *pHandle)
/ o, C. Q# L0 k, r - { j) T8 P* w8 V0 \
- if(pHandle!=NULL && pHandle->InitStatusId == DMA_CREATE_OK)/ d* H# Q% E' g4 K' r
- {1 i' I" H: g( K
- if(pHandle->GRAM_Addr != NULL)
3 s- \* w! Y/ }' m; p - {
. X) }2 t3 f8 J9 n - GRAM_free((u8 *)pHandle->GRAM_Addr); //释放显存内存( w& W$ ?$ D2 r+ v# x
- pHandle->GRAM_Addr = NULL;
9 O! a; _+ S. l- |! \8 w - }
. w6 }+ N0 q6 x4 v" p4 v4 z - pHandle->InitStatusId = 0;
/ R) N% V4 N" @, d& I - GRAM_free(pHandle); //释放句柄内存( G3 a6 S) j1 Y2 ?/ I4 l( L
- pHandle = NULL;9 M: u' n% h) I
- }3 P7 b3 Y4 B8 w# s* s! A( e& i
- }
4 G p. j5 M" q6 c) B+ Z1 i2 W - # O0 C k5 M' Y* }6 \! F' f
! }4 f }" f( K8 U- L! {+ x- /*************************************************************************************************************************
0 k E! ~6 r( Y0 o( g$ k - * 函数 : void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)# A! @, Q7 m* ?
- * 功能 : 32bit色彩GRAM显存画点
$ `# l6 a& y! ~- u$ e - * 参数 : pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
: F( t. _: I+ ^! J# h - * 返回 : 无4 u! }6 W$ J* I% a- O2 d$ Z+ P0 ~
- * 依赖 : 底层宏定义
# D5 U" d2 E% l' \3 C. _1 f! F4 Q - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>+ S5 ^# s9 H* ^
- * 时间 : 2019-10-30
# G! v! i' z' ] a! d4 b - * 最后修改时间 : 2019-10-30
0 S0 [. p" h% T; x% R$ H - * 说明 : 在显存中绘制点2 ?9 u- B( r9 T* ^ y' W$ w
- *************************************************************************************************************************/3 K0 Q3 ]3 L" }
- void GRAM_DrawPoint_32bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
, Y) z% Y2 A# ?) j4 U - {
6 a& K& N2 I0 N y7 H# u) P - pHandle->pGRAM_32bit[(u32)Ypos * pHandle->Width + Xpos] = Color;+ ^: _4 J6 S2 i3 |! h2 L; o7 K
- }
1 K* K8 \! D9 R - 1 w$ q6 d, o' q$ _; r9 X
) |( Y! ^) Q/ K. Z8 R/ M- /*************************************************************************************************************************" M% o% [; t0 J" s$ t3 V4 [ v
- * 函数 : void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
, R5 M- g% w" A: e4 l: f - * 功能 : 24bit色彩GRAM显存画点7 u8 K( Z1 M, J9 i1 V7 U, E% G2 \
- * 参数 : pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色" D( O: B( @* ?; E
- * 返回 : 无
; w% D: _3 K, ^- J+ c* {4 W - * 依赖 : 底层宏定义
5 t" D- r! G0 Q" v$ d( | - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>
) s( D4 ?6 Z$ ~; o/ K# r8 g$ m1 P2 ] - * 时间 : 2019-10-306 j* X4 M% F L: U4 @& g4 s
- * 最后修改时间 : 2019-10-300 x! t/ s b# J- [: s5 F
- * 说明 : 在显存中绘制点
( i" `* I# X+ a* C$ A; @ ~ - *************************************************************************************************************************/
* A, \% W# F: O8 p+ [ - void GRAM_DrawPoint_24bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color). \( p m9 W. s% \1 `
- {/ x! L- ^/ O0 {+ B
- memcpy(&pHandle->pGRAM_24bit[((u32)Ypos * pHandle->Width + Xpos)*3], &Color, 3);
3 L9 }! O- h6 M5 e/ H6 f - }
: I( ^( W/ s } - 8 B9 ^1 C/ L0 n$ p1 S- ?. _8 F
- ! n8 n$ k( v2 [$ j* B
- /*************************************************************************************************************************
& G0 {5 d! I9 L+ q - * 函数 : void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)3 I, A' `4 q# n2 A9 o4 t& j
- * 功能 : 16bit色彩GRAM显存画点6 o4 I6 Y$ \* I# }2 n& d
- * 参数 : pHandle:GRAM句柄,Xpos,Ypos:X,Y坐标;Color:颜色
9 r2 b3 ^% l4 C. L/ w - * 返回 : 无
) Y) f1 s% ~, W2 e; H - * 依赖 : 底层宏定义% l# M7 w A# H9 r5 {. k% \! h, `) g
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>7 j, W4 \$ N5 P
- * 时间 : 2019-10-30# X8 g( ]* m# P; M) e
- * 最后修改时间 : 2019-10-30
" F+ p# L' S! r - * 说明 : 在显存中绘制点
. n, `: k, ~1 t. T" C0 { - *************************************************************************************************************************/" E3 _. M) v& |; _5 S. Y
- void GRAM_DrawPoint_16bit(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)# O- y2 l( P. P% M+ |
- {7 l4 l7 n, T( G/ X* ^; `! z- r! p
- pHandle->pGRAM_16bit[(u32)Ypos * pHandle->Width + Xpos] = Color;1 g2 V! G; [5 U/ D# M& R
- }: Y; U' h% x+ T9 M; d, A
% c) ~& w" M- s3 r5 q- # n' I; @, ?* Z0 U
- # X+ _9 p+ d1 M3 [3 q9 g# F
- /*************************************************************************************************************************
( S& w) \: [; h - * 函数 : void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color) ) X& {- J( {. t+ Z
- * 功能 : GRAM矩形填充(使用DMA2D)
/ k( g/ c9 {- L9 I! Y5 d- f: g - * 参数 : pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标,color:需要填充的颜色# V _" x/ ?& y4 Q& g$ y
- * 返回 : 无6 B$ g' ]: N! x6 N% X U8 {! b
- * 依赖 : 底层宏定义
; x- k% ?! N- ?& V( {* R - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>5 r* j! S9 r; Y. L( H
- * 时间 : 2019-10-30
* P& K% [; o1 I" v6 [ - * 最后修改时间 : 2019-10-30 @! e/ D1 X2 }: m& k- n
- * 说明 : 采用DMA2D实现$ Q% v$ w* u' m" Z6 a$ g2 X
- *************************************************************************************************************************/3 E7 Y- E1 D* E$ e- `
- void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color)1 t( A$ b; B% X- o$ Y3 _* ^
- {
! s7 h+ v3 A7 y! k4 y7 y - switch(pHandle->ColorMode)
& N; K) [3 D' O9 F! \5 t) k8 b: X - {; W f6 W+ \0 x a! v! z2 Z9 {
- case DMA2D_COLOR_ARGB8888 :
$ g' U3 c# b7 S$ Z U$ i6 ^ j - {
* x( I1 J1 n) R: v Z - 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进行单色填充
7 c; ?, e* ^0 x4 b; O) l - }break;/ _" F' k9 f+ [7 g: P
- case DMA2D_COLOR_RGB888 :
% l" k; t" B$ h1 p" Z6 h6 m: b& _ - {* V. R# l9 g) u) u
- 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进行单色填充& y: a V- P6 r% f ?9 R2 Q
- }break;( D, e4 ^0 L% r. j/ k6 v$ V5 X( v$ M- d8 K
- case DMA2D_COLOR_RGB565 :2 \# D7 ^* P u1 |- S% @
- {0 V0 I2 L; p. N2 R0 g
- 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进行单色填充
( J; }7 \+ `+ E - }break;- X, a6 y* [& d
- default:return;5 b- i/ z( F8 Q) \ A
- }
% w; W/ [. U- x' s -
T. h' K8 `6 T! p1 K - DMA2D_WaitTransferComplete(500); //等待DMA2D传输完成1 i! w9 P+ _. g/ h% E# u8 Q; d& r0 Q* l
- }
& V- s% @* G8 n" w8 X2 c* H - % ]& I9 p' {+ f( x( y; v& s
- 0 X J5 Z1 P, R+ p7 m
- /************************************************************************************************************************** H% ~6 [6 p7 S+ l
- * 函数 : void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
4 j: u" H* R8 f, a/ @4 B0 L - * 功能 : GRAM清屏(使用DMA2D)' w% ?5 }. l; R. n7 c/ V2 L# s
- * 参数 : pHandle:GRAM句柄;color:需要填充的颜色
* [) A9 c# {$ x( B. W2 B4 v - * 返回 : 无) W& L4 T' Q. T. P( U
- * 依赖 : 底层宏定义: J& L( G# K$ ]4 G* `) o7 m. c
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>( c1 s J+ C6 A4 D7 V
- * 时间 : 2019-10-30
- J* S5 }' W N# ] p: l3 n - * 最后修改时间 : 2019-10-30 F6 Z+ F" h2 U6 X. [; I& J
- * 说明 : 采用DMA2D实现" Y* `5 S3 E* T0 M. I4 x
- *************************************************************************************************************************/
; `4 A& A0 R" [0 r* M- j - void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color)
W; H' I3 i& g5 `' u - {) T$ g5 T& H0 O" f \ e4 H- v
- switch(pHandle->ColorMode)3 A: b8 t( v4 w) l3 k( u( c) w, F
- {" Y' v9 i. R# |8 ?4 t
- case DMA2D_COLOR_ARGB8888 :. h0 Z: s& n" A: b( ^- c4 C3 |9 p
- {; W' m6 d9 a: z: r) M$ K! G2 }
- DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_ARGB8888, color); //DMA2D进行单色填充
: ? c) p' j. Z: v - }break;
5 `9 D4 L7 g( [4 w" E - case DMA2D_COLOR_RGB888 :
* K. @2 W9 I; X Q. h" Y6 x% w; j - {
% `- J E" q# w. D2 n/ w; ?- t - DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB888, color); //DMA2D进行单色填充" }8 _- s' q6 A0 \, t4 P* a0 {9 ?
- }break;* i. Q. r' m0 M" b, v! [
- case DMA2D_COLOR_RGB565 :
. P8 W* g" o) z; ]2 o; f9 Q6 f$ X - {
1 k0 i/ B1 [) b! T - DMA2D_FillColorToFGRAM(pHandle->GRAM_Addr, pHandle->Width, pHandle->Height, 0, DMA2D_COLOR_RGB565, color); //DMA2D进行单色填充- Q) ]2 {+ K6 ~4 C$ ^+ B4 F0 }
- }break;
! L) J: S h+ h% V - default:return;! v, t. i$ k' e2 j
- }
. e4 e' h" r+ C' V# i! E8 A5 G - SYS_DelayMS(5);
1 |; m6 B4 Y' l& p* i - DMA2D_WaitTransferComplete(500); //等待DMA2D传输完成0 w& F. [" |& V4 c. L( S1 I+ k+ [
- }
1 @- L. ?7 {' c2 t - ! q& G3 X: _8 g# t0 z
- " `, d8 H# E8 d$ c9 l% {
- /*************************************************************************************************************************, C3 h. g; i5 n8 K
- * 函数 : void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, * r9 l0 q3 U5 g& t( s5 R; r W
- u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha)* B& X' V. y( U
- * 功能 : GRAM局部拷贝(支持Alpha)
, }; n' {3 s6 L! O& _2 N; E - * 参数 : pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
( N. V: L7 R, ^! d5 I - pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度
( h& R2 s/ N; n% m, i3 Z - AlphaMode:alpha模式;Alpha:Alpha值;3 V4 {; U3 T/ Y0 b' r" C [' M
- * 返回 : 无
( h% c& r, G2 A8 @& ~( B, j - * 依赖 : 底层宏定义
. R* ` {! n* M; R% D( U - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>9 t: a* W0 h7 d
- * 时间 : 2020-02-020 O! y* G8 r! O
- * 最后修改时间 : 2020-02-02
: u! p# n1 a: V1 r - * 说明 : 不会检查GRAM大小,请确保GRAM' ?+ M; _0 y- n: Z/ t3 k
- *************************************************************************************************************************// D+ q0 G9 z2 W R
- 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)
& u5 x$ [! v. V5 G' o - {
3 p" q5 R" A1 @! y- k - u32 SourceImageAddr; //源图像地址(通过地址控制开始的X,Y坐标)
0 `* A" E8 y" C* c! ? - u32 DestGRAMAddr; //目标GRAM地址(通过地址控制开始的X,Y坐标);
. z) X8 a8 c4 n y4 c- B2 q* [ - u32 PixelByteSize; //像素字节大小
h3 r `: D g5 A# }/ Y - : G! w$ U6 x0 l1 m+ v5 u* T1 J) U
- if(pDestHandle == NULL || pDestHandle->GRAM_Addr == NULL)7 O# R5 r1 c. g+ y& N% Y5 b+ r
- {9 X! v; ^. Y* {
- DEBUG("无效的句柄,pDestHandle\r\n");" E. m4 M8 I! U# o2 U
- return;
3 M# e: n* @, K' K9 f/ P" @" x8 s - }! ~+ g5 D) A. r' G( R
- if(pSourceHandle == NULL || pSourceHandle->GRAM_Addr == NULL)
9 F5 ~+ x6 F1 I7 j - {
( E, V- X2 G3 _6 k* v - DEBUG("无效的句柄,pSourceHandle\r\n");) j+ G, m1 p5 w! P
- return;5 c# h9 k. b* z0 U# u* e- ]; i3 }
- }
, K+ ]3 [' u" ] - //源图像地址(通过地址控制开始的X,Y坐标) 计算
, s* v- D" C( P2 A' v: G - switch(pSourceHandle->ColorMode)( |8 \' h3 ?6 J1 a
- {
; I7 f" k, t& }4 f$ c& m - case DMA2D_COLOR_ARGB8888 :" x1 ]3 a; h' w
- {
8 \ X7 ~) R0 @( z2 \1 c+ `4 h - PixelByteSize = 4;" |0 D. |& Y& i& O
- }break; C' ^- p7 P9 a, v8 l
- case DMA2D_COLOR_RGB888 :
( z- ^2 J# q; c* X5 M& Z, O& d - {
) X0 R: ^1 ]' c4 x' R - PixelByteSize = 3;
0 Y6 \; B# }8 r! X E8 Q - }break;
# b' d# Q3 Y0 F) i' Z: y - default: //DMA2D_COLOR_RGB565, N8 m2 j) u% w$ ^/ R) L
- {
8 b2 I3 o8 X1 p% ~2 v - PixelByteSize = 2;) p! H: `& {) p' y1 @
- }break;
% P2 r5 r, I/ ? - }! B) q- ^: O& K) W. r* Z) U( c
- SourceImageAddr = pSourceHandle->GRAM_Addr + (SourceSy * pSourceHandle->Width + SourceSx)*PixelByteSize; //计算源开始地址
]% c8 j' O7 v1 j; E5 v" K, i -
* ]3 q ~) z" s) y9 K+ A9 v - //目标图像地址(通过地址控制开始的X,Y坐标) 计算2 }& p1 m( X8 m1 G' f
- switch(pDestHandle->ColorMode)
% y; \( Q5 d+ B& i - {
- ~4 J" |( m8 t* i! O - case DMA2D_COLOR_ARGB8888 :
7 b+ R. T% e9 T! V& o2 K1 v# E - {
* E$ K- _8 ~4 K, T: x+ K' k( \4 J+ q - PixelByteSize = 4;6 G5 t% K6 y: i* [9 c
- }break;
; Q% I( {; H; t9 A8 \ - case DMA2D_COLOR_RGB888 :
5 b! [) U3 U; H% n) ?3 r - {
`6 M& h& X9 ~3 `' O - PixelByteSize = 3;! t/ |/ _$ i0 @2 V( S3 B
- }break;! C9 n( H8 A4 c
- default: //DMA2D_COLOR_RGB565
2 I% \ R9 ~# g0 \# d - {
" g1 `$ e( k) ?! n - PixelByteSize = 2;
8 X% p7 E% v% l& w - }break;$ V" E' B, y) C' @& {' I1 v
- }4 Y' ^) B) D- m4 _. i9 l! `4 `8 U( U
- DestGRAMAddr = pDestHandle->GRAM_Addr + (DestSy * pDestHandle->Width + DestSx)*PixelByteSize; //计算目标开始地址
; C! B2 t- g7 C - //进行拷贝
5 v7 e8 N$ ]) O4 ? - DMA2D_FillImageToFGRAM_PFC(SourceImageAddr, DestGRAMAddr, Width, Height,pSourceHandle->Width-Width, pDestHandle->Width-Width, pSourceHandle->ColorMode,
& F3 F% D; D- E: l/ \) O3 k - pDestHandle->ColorMode, AlphaMode, Alpha); //DMA2D进行矩形图形填充(会执行像素格式转换)
- V# y* m3 E- ]1 X( _ - DMA2D_WaitTransferComplete(200); //等待DMA2D传输完成* w6 I+ F0 q( C8 N3 r
- }! _1 P. ]: s3 P5 o7 S
8 G5 @/ h1 ~0 F" v" c5 P- /*************************************************************************************************************************' }0 C6 X5 z% \; u$ P
- * 函数 : void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width,
9 Y ]) j2 |) X$ _ - u16 Height)
3 m, [* f4 a1 j; r; ?" f& m5 A! L" l - * 功能 : GRAM局部拷贝(不支持Alpha)
6 z% k' r* ~4 |9 u1 B - * 参数 : pDestHandle:目标GRAM句柄;DestSx,DestSy:目标开始坐标;
1 H2 l, J' p' ~& D - pSourceHandle:源GRAM句柄;SourceSx,SourceSy:源开始坐标;Width:宽度;Height:宽度, I3 P, t+ j$ L6 d( d
- * 返回 : 无
, J9 W0 |; x3 y9 Y* O# ~' N+ Y( o - * 依赖 : 底层宏定义/ k7 Q, t) d( [- y: O1 K2 k3 M
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>( h5 Z( W; e b+ X, I
- * 时间 : 2020-02-02& k1 G4 T: p) |
- * 最后修改时间 : 2020-02-024 i+ `1 @4 L. v+ k/ t/ A2 D
- * 说明 : 不会检查GRAM大小,请确保GRAM
4 R/ T5 j x- u+ G, y0 Q - *************************************************************************************************************************/* a% S4 E# W: w$ S
- void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle, u16 SourceSx, u16 SourceSy, u16 Width, u16 Height)
5 W5 N! v4 [; Q6 a& o% ^$ M - {6 i, r* s: W& B5 G% E; i) {: }% Z
- GRAM_LocalCopyAlpha(pDestHandle, DestSx, DestSy, pSourceHandle, SourceSx, SourceSy, Width, Height, DMA2D_ALPHA_NULL, 255);4 F( q4 I9 m4 r: o4 u0 M
- }
复制代码
8 I9 B0 F) x4 d1 ?: v
! o4 V) { d6 P4 m- /*************************************************************************************************************1 j& Z: F. X( r4 H$ J/ I" K
- * 文件名 : DMA2D_GRAM.h
; b. t& t }9 p% B2 e- F* ` - * 功能 : GRAM相关操作
& S; U. Q% }4 I7 H- z! r - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>8 g k$ b1 K6 h3 W- c+ J
- * 创建时间 : 2019-10-30
7 K" ?/ W5 R! q% g3 a L: l - * 最后修改时间 : 2019-10-30+ h$ p2 I M) L8 d
- * 详细: 显存相关操作接口- j, b r) U2 _. \* A# r
- *************************************************************************************************************/ 1 \& X$ Q% e/ e4 u
- #ifndef __DMA2D_GRAM_H_5 k# ~ [& u' ~$ x1 x
- #define __DMA2D_GRAM_H_
: u: b1 z$ T: A4 T( u* I: [ b' k' f - #include "system.h" b+ |& g7 T! f" l8 Z' _
- #include "DMA2D.h"( h' {/ _' r. F' N( y W
- #include "SYSMalloc.h"1 W" J3 R4 f: g+ {! d3 z2 q
- 4 @4 y' }- }4 H. V
- //初始化状态id
$ \$ C: [% P& [/ w/ H! H - #define DMA_INIT_OK 0x1234423 //初始化成功(不可以释放)1 ]) q: X" F9 k z2 W/ Y
- #define DMA_CREATE_OK 0x3643423 //创建成功(可以释放)% G: l* q* u. `. Z
- 8 J0 Z& @& ]3 i( r; ], l! I
- //颜色模式
2 Y. w4 m8 V( v* j8 ~2 K - typedef DMA2D_COLOR_MODE GRAM_COLOR_MODE;( P3 T" L' C# Y! C1 o
- 8 ]4 f( ~% G/ d% V
* S8 ?2 |4 x+ [- n) j- u9 `& R4 `- //基本GDI接口(由于两个结构体不能相互包含,此处将GRAM_HANDLE*使用void*替换,可能会出现变异警告)
, c1 R3 L- J2 b, t" H - typedef struct7 N& e* X3 S( |6 n
- {. y8 b& L& c) T& {5 k+ \
- void (*pDrawPoint)(void *pHandle, u16 Xpos,u16 Ypos,u32 Color); //绘点函数
2 Z( m& ]8 P$ r - void (*pFill)(void *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color); //填充
% p) e: h0 q( @) a0 `. E4 E8 w - void (*pClear)(void *pHandle, u32 color); //清屏
; m# S% q! Z# H& e/ ^ - }GDI_BasicInterface;
- R+ T$ B3 W) u* w+ K
, I# h \$ A) d6 t: u
9 \0 B: B- Z9 l! B2 H- //GRAM相关接口-16bit( a( O% I% c5 {" C
- extern const GDI_BasicInterface cg_GDI_GRAM_Interface_16bit;
: H: j6 S( O- N" H/ J1 l5 h - //GRAM相关接口-24bit
, V+ R) E- X+ E6 q1 k' m- Q - extern const GDI_BasicInterface cg_GDI_GRAM_Interface_24bit;$ D$ [! v! L1 _0 a/ Q: i- p
- //GRAM相关接口-32bit. n& h8 {& z1 x. `! ?
- extern const GDI_BasicInterface cg_GDI_GRAM_Interface_32bit;
, T2 U- A( W0 x7 c. m/ v2 K
* U( r i" t0 } C" T4 `5 P1 R- //所需的内存申请接口! Q" A; z9 |% y! u
- __inline void *GRAM_malloc(u32 size)/ q3 s3 o/ K" V B2 @3 Q
- {5 Z* @/ t# _1 b" j) m
- return mymalloc(SRAMEX, size); //内存分配(外部调用)-使用外部SRAM, Q% I- q$ L) u9 {2 t
- }
6 c5 N3 t% J+ i1 e - : U6 b% T# U) C4 M4 p
- //所需的内存释放接口
- i T& i4 T1 c6 v5 g/ I8 R# Q - __inline void GRAM_free(void *ptr)
g. Q9 G& b* Q& ?+ Q3 e9 G - {
% q" E8 f/ A9 }3 x2 y/ L: J - myfree(SRAMEX, ptr); //使用外部SRAM
3 n/ n9 `' Q- |2 t, H3 h - }8 o6 d% P! n9 w$ a! w0 P( o
& a* g- E# R& [8 T7 H" u- 5 {+ v+ j8 T5 \; _. n
- //显存句柄
U. U _+ S" s6 k" z0 s - typedef struct
$ G3 ^$ k% n, w( ], K - {
4 A' K! J6 X9 L+ e! z; u2 r - u32 InitStatusId; //初始化状态id2 Y! o1 b8 {( A
- u32 GRAM_Addr; //GRAM地址
6 |/ D4 \) h4 i: v - DMA2D_COLOR_MODE ColorMode; //GRAM显存像素格式
/ c2 E I$ T9 q1 u( o, ~! V - u16 Width; //GRAM宽度
5 z$ c, J Y% b1 M - u16 Height; //GRAM高度
+ ~- W% }, F7 M$ q - u32 *pGRAM_32bit; //32bit颜色模式下显存指针
, \$ v' d0 |( r; J" z: p/ a8 h1 J - u8 *pGRAM_24bit; //24bit颜色模式下显存指针
- Z ^6 G3 \* U; p' o - u16 *pGRAM_16bit; //16bit颜色模式下显存指针9 [$ x4 N# a/ [3 l0 v, w3 X/ s
- const GDI_BasicInterface *pBasicInterface; //底层GDI接口5 i% \8 ]& F1 e; d
- }GRAM_HANDLE;
6 R1 [! B: T, r) J( L - , j9 n5 e% m( n& |4 d
- void GRAM_Init(GRAM_HANDLE *pHandle, u32 GRAM_Addr, u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode); //GRAM句柄初始化(不会申请内存)
! O' P- H2 |$ L - void GRAM_Delete(GRAM_HANDLE *pHandle); //删除一个GRAM(会释放内存)( G; _8 C. [. p
- void GRAM_Fill(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 color); //GRAM矩形填充(使用DMA2D) h4 L( J8 N! Q) u# p! I0 t4 }( y5 }
- void GRAM_Clear(GRAM_HANDLE *pHandle, u32 color); //GRAM清屏(使用DMA2D)
6 l4 @" D& z5 [2 t7 ~ - GRAM_HANDLE *GRAM_Create( u16 Width, u16 Height, DMA2D_COLOR_MODE ColorMode); //创建一个GRAM(会申请内存): ^# e/ @5 }; N5 v" |" B3 m9 R$ ~! C) }
- void GRAM_LocalCopyAlpha(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
( P, W; X* V! Q5 x! k - u16 SourceSx, u16 SourceSy, u16 Width, u16 Height, DMA2D_ALPHA_MODE AlphaMode, u8 Alpha); //GRAM局部拷贝(支持Alpha)! U* t3 o. D3 o4 X/ F; c$ v. ^
- void GRAM_LocalCopy(GRAM_HANDLE *pDestHandle,u16 DestSx, u16 DestSy, GRAM_HANDLE *pSourceHandle,
2 g8 F& B. f, o% { - u16 SourceSx, u16 SourceSy, u16 Width, u16 Height); //GRAM局部拷贝(不支持Alpha)( a3 x! d) P% e$ E
- 6 `9 W8 a5 |6 A& f
- #endif //__DMA2D_GRAM_H_
复制代码- /*************************************************************************************************************. L/ Q* z% J' d
- * 文件名 : GDI.c
/ u& s- a: M5 J- ]0 f. }3 O - * 功能 : 图形设备接口(Graphics Device Interface)9 Q* f/ G& c, [+ N! X' {' l
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>
7 m8 W/ T6 E4 L5 Y. }9 { - * 创建时间 : 2019-11-02
/ {2 [: _5 t1 s' k0 B: F - * 最后修改时间 : 2020-02-020 T9 `% ?: }' z# E. p7 v) l
- * 详细 : STM32F7 图形设备接口9 {1 @3 S. W: ?0 }; ~; Y
- *************************************************************************************************************/* A; E; ]2 k2 t% t8 P
- #include "system.h"
O; z/ }# i+ ~4 o - #include "DMA2D.h"
! k g/ p- @; e# z" \) v2 Q6 w" h - #include "stm32f7_ltdc.h"& s* V2 p+ K/ h$ l- c5 E
- #include "DMA2D_GRAM.h"
3 Q; D! ?" T6 y! U - #include "GDI.h"
: d+ E6 e) z" a9 ?' w0 ?5 c
2 i% y+ S7 _/ I2 c- //显示器Layer1 GRAM定义4 I& j# w9 ]6 \) c& v3 v/ M! B: E
- const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle =
8 `, p) U. G1 y# n0 o: { - {: |4 z1 z, A$ e3 H. A
- DMA_INIT_OK,
$ C7 \9 b5 V) g% Y- X, \ - (u32) &g_LTDC_BUFF_RGB888[0], //GRAM地址
% H# G- D+ [- p9 m: M - DMA2D_COLOR_ARGB8888, //GRAM显存像素格式9 [6 |* Z" d9 M$ b; v5 D \
- LTDC_WIDTH, //GRAM宽度7 a/ x8 k# \# t5 Z
- LTDC_HEIGHT, //GRAM高度8 d9 u A1 T: j4 X- E% R& I! z
- (u32 *)&g_LTDC_BUFF_RGB888[0], //32bit颜色模式下显存指针
5 f9 x7 t" a& P$ s& X6 I - (u8 *)&g_LTDC_BUFF_RGB888[0], //24bit颜色模式下显存指针
& j' W& n7 X1 h) L# A& h - (u16 *)&g_LTDC_BUFF_RGB888[0], //16bit颜色模式下显存指针8 v1 E1 K0 q6 |% [8 ]" D
- &cg_GDI_GRAM_Interface_32bit,
8 U3 e: E* s* s1 |1 O2 U6 R$ C - * b* a0 n7 T# i* S
- };. I0 E @" ]( M- g5 j
4 X0 ]4 h |3 m/ L- //显示器Layer2 GRAM定义% A/ m: \8 @9 m( ^5 @4 X
- const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle = : v& Z% y) Y6 V. r1 |
- {- _) {+ X; I2 d6 @% q0 L. ?
- DMA_INIT_OK,9 s$ |8 O+ d' j w8 J$ r
- (u32) &g_LTDC_BUFF_RGB888[1], //GRAM地址
3 M8 ^8 d* A. S/ X - DMA2D_COLOR_ARGB8888, //GRAM显存像素格式
. g+ q+ |8 g/ \3 S" T - LTDC_WIDTH, //GRAM宽度
# K. \3 q; ^8 d$ _5 z$ E3 f - LTDC_HEIGHT, //GRAM高度
' C, G) N& x) b8 ^: e+ ^: O7 J6 e - (u32 *)&g_LTDC_BUFF_RGB888[1], //32bit颜色模式下显存指针
/ ?" o# m' L! @* o6 T - (u8 *)&g_LTDC_BUFF_RGB888[1], //24bit颜色模式下显存指针
+ [8 B ?# U$ J7 p6 X, ~+ }$ ^ - (u16 *)&g_LTDC_BUFF_RGB888[1], //16bit颜色模式下显存指针4 {; d. Y9 K9 S) Z" M# q* ?
- &cg_GDI_GRAM_Interface_32bit,. E5 K( e( l% H$ o5 Q0 S
- };- ~! l% U* e, }& j* A
& W" B. B+ d2 C
0 z) O% L2 d* W# A/ T- /*************************************************************************************************************************
h, Z: f& }& k+ u5 q - * 函数 : void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
3 @0 u; a+ q# X ~) Y% I3 x - * 功能 : 绘制空心圆! [3 _. x+ h8 E$ W
- * 参数 : pHandle:GRAM句柄;Xpos,Ypos:圆心坐标;Radius:半径;Color:颜色$ d# ?* H+ s: E' v/ @/ Y
- * 返回 : 无
( N- ~. h. V* |5 _8 L ~ - * 依赖 : 画点函数8 O6 L6 N A1 [3 n& O- v
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>7 E% a( L" {0 y
- * 时间 : 2011-09-201 P5 j0 e2 C% [
- * 最后修改时间 : 2019-11-027 T2 G7 K% }2 a4 A
- * 说明 : 无- L6 O0 K/ s5 |4 l
- *************************************************************************************************************************/
1 T" z; ?. i" s2 H8 m# q! O - void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color)
1 [% }/ c; T Y, `. @ - {
/ \/ N& \% `! B6 Q* S - int a = 0,b = Radius;
: n% `6 J* f2 r9 h' C - int di;
! ~0 v' R* U& C3 ]' [ - di = 3 -(Radius << 1); //判断下个点位置的标志
$ H$ Z I8 \. e( }8 k/ ` - * b% ] w3 J* t! G0 F
- #if(GDI_PARAMETER_CHECK) //参数检查
2 T4 p X1 A& E L - while(pHandle==NULL)! Q6 G# V+ S7 Z; C, }: A4 @
- {" R7 r/ O7 \9 v" N: N
- DEBUG("无效的句柄 pHandle\r\n");
5 _, r6 z: {4 s. g2 b8 C ?% I% S - SYS_DelayMS(1000);
6 r5 m- K# | V/ U9 O; w7 F - } $ h& m: i( h: t+ g
- #endif //GDI_PARAMETER_CHECK* [4 E: t! A% p, {1 Z8 S. Z V
-
1 y5 ]; n, }$ m/ @ - while(a <= b)+ X2 k, L1 M# H! ?' e
- {
$ }, c- }$ q5 |" }( c9 o( e% C+ m - pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color); //3
4 x; u) N, P) f; D( f - pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos - a,Color); //0 4 B% {' L# k4 t$ i6 G1 X
- pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos + b,Color); //1
$ e: Z. ]& g+ F9 L. T8 a$ r - pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos - a,Color); //7
* X, u8 v( s9 u9 b3 v$ T - pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - a,Ypos - b,Color); //2
" Y7 t% t! y3 I+ W. A" G% Z: m- e6 H - pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + b,Ypos + a,Color); //4
! ~6 P' e5 w4 i1 N - pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos - b,Color); //51 E; M& D1 S. j; F) O
- pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos + a,Ypos + b,Color); //6 O" J! C3 p9 G! _% B, [, J/ a
- pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos - b,Ypos + a,Color);
& Z* {, g# `1 s: K - a ++;' t6 l5 k3 E. ~- v9 f) {
- //使用Bresenham算法画圆 & j b1 o! ^0 p# M8 A" P% Z. l5 M( V
- if(di<0)" f5 z" L7 B% J* R5 K2 B
- di += 4 * a + 6; 9 Z/ {7 I9 p9 L5 Z( v* `
- else# ]5 O( M! }5 d# _
- {# b6 v% K4 G0 B8 u
- di += 10 + 4 * (a - b);
5 S; @1 H0 L; x - b --;! G7 R) c4 \- A" w. _& \: p
- }
3 C6 e; x& [% |3 y2 ` - } : G8 {6 `+ S2 r4 L3 p- [7 M
- }; q% X. W' w3 J& _2 r
-
7 m, A# a: E/ h. f - ; G( X3 _8 y& Y5 k* m- p2 l& l* Q
- /*************************************************************************************************************************
% E8 h) J. I% X3 c - * 函数 : void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
7 ?6 s, t: ~% D) ?) ?4 P - * 功能 : 绘制直线(可以倾斜), o' n8 J% Y2 H! t, z k# e0 x
- * 参数 : pHandle:GRAM句柄;sx,sy:开始坐标;ex,ey:结束坐标;Color:颜色: y- c% z3 w& e
- * 返回 : 无
! ?+ |. n8 }- i5 K* o ~( @ - * 依赖 : 画点函数
) W( g) g! z7 i, W* a% S - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>1 b' L$ m& E4 Z; S2 x, H' i+ R- t6 a
- * 时间 : 2011-09-20
; [. J" e2 Q- Q2 Q+ \: i - * 最后修改时间 : 2019-11-02
4 N- U* U' f @9 R - * 说明 : 无
- C- P+ v+ k3 g; w% l& l! W - *************************************************************************************************************************/
0 D' z5 I& V- `6 V1 p& O - void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
3 x9 J8 K( m; ~- l - {
1 x; ?6 `1 U2 h. I* K' O - u16 t;
3 U6 u( P, T" b* g6 K, M5 d9 z; w" W$ j - int xerr=0,yerr=0,delta_x,delta_y,distance; / g" d j/ d; V4 U+ O; I( n3 R
- int incx,incy,uRow,uCol;
0 s$ |2 L4 b$ i6 Z8 q2 L* l- y -
, n9 ~7 r6 {6 l- a - #if(GDI_PARAMETER_CHECK) //参数检查
2 \% q% X. v8 E" k0 n- l - while(pHandle==NULL)
) s2 ~* p$ z0 o" z7 J- V4 f- T9 G, J# R' P - {
/ o. _5 [( b9 s) _- I/ H& L - DEBUG("无效的句柄 pHandle\r\n");
4 n2 }. }( }- }2 x - SYS_DelayMS(1000);( U' w7 h* O' J5 O6 P2 H/ f9 o* K6 `: }
- } 2 h! \' q9 V B2 t
- #endif //GDI_PARAMETER_CHECK
, j) B4 ?" T& i0 j. t* Y% Z1 ^ - 9 h" q* W+ l: C0 W% O
- delta_x=ex-sx; //计算坐标增量
* \3 ^5 z8 O( r6 D" o! E& f - delta_y=ey-sy;
# M- [" P! k' C+ d - uRow=sx; & v$ n9 E) t4 c
- uCol=sy; , w$ d) E/ u% E. S0 g
- if(delta_x>0)incx=1; //设置单步方向 " A C1 a2 C& O& ?% Q' I* @- C8 n3 T+ d; y
- else if(delta_x==0)incx=0;//垂直线 L2 {2 j9 s- `2 ^9 f- J
- else {incx=-1;delta_x=-delta_x;} " t# z1 V4 c; F* {: O5 X7 d
- if(delta_y>0)incy=1;
: i% a0 ?4 n- { u7 g3 \$ E - else if(delta_y==0)incy=0;//水平线
1 t* f1 }/ E: y; s- G - else{incy=-1;delta_y=-delta_y;}
+ Q; u$ o1 P j( q: ~2 p - if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 ' O! ^, l2 ]5 y% ^( e# F
- else distance=delta_y; ; e l' } F0 A7 y9 S# C1 P* R: q
- for(t=0;t<=distance+1;t++ )//画线输出
* ?0 A5 A: ^% `/ x' z/ B - {
" E) U/ K) g8 f& C; E$ x - pHandle->pBasicInterface->pDrawPoint(pHandle, uRow, uCol,Color);//画点 ! [+ |+ u9 B. i" n, \
- xerr+=delta_x ; ! i: G* M8 Z9 a& M$ h
- yerr+=delta_y ; B. K- U) o6 u, s; C1 C! J
- if(xerr>distance) 4 y- P- @5 ]$ @+ l
- { 4 \$ X4 a( p W5 l3 Y
- xerr-=distance; ! M4 d$ J% o9 k0 A( H( A% E
- uRow+=incx; / @9 |0 n" g: \6 V* Z. P% q m" C
- }
9 P& B- Q1 X5 c6 @ - if(yerr>distance) 9 n, |1 h% F) Y" `2 H
- { : G( R) ]/ x+ M5 D* D8 ], a
- yerr-=distance;
% J. M# m' w, M, H. ?' M - uCol+=incy;
0 K* B) P* \$ K# [' R6 E! V - }
" z; ~: A) w+ D( F" B# W( A( l - }
- p: J7 E+ G' y. y, T/ G - }4 ]% p( o* Q; D5 r3 z+ F0 a5 n& E/ y
1 ~' ?5 w& I# ^) W5 B7 S- 8 }" u5 ~2 X B+ ]& q
- /*************************************************************************************************************************2 n( G& y1 o+ c- c l
- * 函数 : void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color)
# z# b* J: C3 u1 f' n - * 功能 : 在指定位置画一个矩形) K) N. ^4 E' Z6 {. Z2 h
- * 参数 : pHandle:GRAM句柄;sx,sy:左上角坐标;ex,ey:右下角坐标;Color:颜色! e& N) l2 _0 }" E- M5 ~
- * 返回 : 无
* V3 s4 R) f: e, R - * 依赖 : 画线函数0 s% A# r; Y3 h
- * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>1 H7 R: ^ R% j9 C
- * 时间 : 2011-09-20/ P2 n0 X! v$ g- J3 ^
- * 最后修改时间 : 2019-11-02
. Z/ C! T3 V* I! [7 g/ ^' H; k6 k - * 说明 : 无
* Q# a; C/ I/ b9 y9 [ - *************************************************************************************************************************/
, U7 T% X2 e$ q7 O0 Z | - void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color)% S6 T+ b5 k. N# H8 k5 @/ Z' |
- {
9 F K' x+ b8 a+ Y* { -
& R0 T; ?% f' K$ k+ M1 H+ l$ g - #if(GDI_PARAMETER_CHECK) //参数检查
1 z7 }# T( { W - while(pHandle==NULL)
& I9 R- V' h( T* o2 G! ~ - {
4 O4 w, G+ c/ g5 k2 x* @ - DEBUG("无效的句柄 pHandle\r\n");
3 _% y; h8 a4 q1 F - SYS_DelayMS(1000);* X1 T5 |7 ^- i
- }
% \0 c3 y- a: Y* J. s - #endif //GDI_PARAMETER_CHECK
( r- i) g. X, ]; ~, b) P - 3 Q' _# {, T1 S& y3 B
- GDI_DrawLine(pHandle, sx, sy, ex, sy, Color);
/ ?6 v, m% I u) \- G) a' T7 q - GDI_DrawLine(pHandle, sx, sy, sx, ey, Color);
9 W0 p: L7 ?8 ^1 D3 c! c9 Y - GDI_DrawLine(pHandle, sx, ey, ex, ey, Color);
& @5 w8 r( a7 K, M1 |0 e- N - GDI_DrawLine(pHandle, ex, sy, ex, ey, Color);
. E5 j( j. e' N; k - }
1 j f! E3 l; N
' U6 V1 g$ w1 T- 2 f# e; d, g6 a# E6 {. W
- /*************************************************************************************************************************; w! L# Y! L; F t+ N9 D' [# ~
- * 函数 : void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)7 _, `% O" \5 ~( z) p" |5 s: G9 V# N
- * 功能 : 画一个2*2的大点
; \0 Z. b! Q- L3 m4 Q, A, d - * 参数 : pHandle:GRAM句柄;Xpos,Ypos:坐标;Color:颜色. @& O8 E& H3 q* g: m! B
- * 返回 : 无
8 S1 ~* @% K3 W - * 依赖 : 画点函数
* u7 `2 [) I) N! r - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a>
8 N5 f3 U% }) y - * 时间 : 2011-09-20
- i) W: b$ Q4 f - * 最后修改时间 : 2019-11-02
( b l9 P& j7 Y" S& ^- C7 Z" M - * 说明 : 无
( V; W: b7 V4 k, d) X - *************************************************************************************************************************/
, P7 j" S8 D) n4 v' g9 _6 K - void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)2 ]+ v- K* Q! m2 h9 \, N- B
- { , v. u6 L/ w: l- c1 ^
- #if(GDI_PARAMETER_CHECK) //参数检查
1 z7 ^# l! y# ~3 f9 N+ ~$ N8 Z - while(pHandle==NULL)! S" z0 b+ \; R, J6 w, n
- {
' y% T% n6 c7 A/ ^0 H0 A$ s% _ - DEBUG("无效的句柄 pHandle\r\n");+ O. T+ ?& U0 t6 D5 [
- SYS_DelayMS(1000);5 O0 n. z% n8 ~7 R
- }
' [) P6 p$ b9 M% F - #endif //GDI_PARAMETER_CHECK
' a" g; E& }/ c4 M, q+ W% U: }4 u - b1 V5 Q/ J( Z9 g
- pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color); //中心点
0 Y8 |5 v) r! y3 F - pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos, Color);
( h6 D4 Z9 `" D% e - pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos+1, Color);0 [; G2 X$ M8 A1 T2 @
- pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos+1, Ypos+1, Color); 0 [9 p9 D6 O9 Q6 p( Q; _, v
- }
复制代码
: T3 s, A# q$ P# J2 [1 ~7 g, u# w/ L; u
- /*************************************************************************************************************
0 V' [7 I1 o& Q: j: p" m2 i' `9 p+ I - * 文件名 : GDI.h8 K) I; y) \: D! b& D: A
- * 功能 : 图形设备接口(Graphics Device Interface)
, C8 L {$ J# P1 h0 \) ~1 H - * 作者 : <a href="mailto:cp1300@139.com">cp1300@139.com</a> O/ c* w( @" k% M2 q s
- * 创建时间 : 2019-11-02
% l" x+ {3 J+ q' R v - * 最后修改时间 : 2020-02-02) s& T5 K! I( j8 K: e. V+ S5 t6 t
- * 详细 : STM32F7 图形设备接口3 w, L' z, Y! M0 O! p& h+ J9 l t
- *************************************************************************************************************/
+ |, s. {3 ?5 ]6 P8 @ - #ifndef _GDI_H_) S9 c+ u9 l: j8 }0 Z* u ^
- #define _GDI_H_
, m( f- Y. S1 V - #include "system.h"
* Y6 W' W; A! X1 q/ q Q/ Q - #include "DMA2D_GRAM.h"
9 Q. S: E# [; q: T) T' I$ F - 9 V- D0 m7 b, r% U% p
- #define GDI_PARAMETER_CHECK 1 //参数检查-主要检查指针
0 }4 |" \. ?+ t* T7 [$ m" s$ g/ p! S - #define GDI_DEBUG 1 //调试输出$ J0 @8 |) m0 ~, T& Y! Q! j3 @- A6 R
" k1 C+ T2 @/ P' A4 Q3 Z- #if GDI_DEBUG- r- l" Q3 x" w7 E) ~
- #define GDI_debug(format,...) uart_printf(format,##__VA_ARGS__)6 `+ P) c4 ?# w( r/ X3 V% h+ \+ s: F
- #else. z; z8 F9 s6 H8 Y# t6 I4 [
- #define GDI_debug(format,...) /\3 M5 ]: \6 e0 n5 Q* V% A
- /
" d% N; c; M, }: f. v! P - #endif //GDI_DEBUG& D6 e& A" n" t% \# U) V* M
4 Z0 p3 w" S0 `# D8 |0 b- 0 S( L9 n# M2 z% B' O, V. F
- " p" C) X1 a' n' U$ E
- extern const GRAM_HANDLE cg_LTDC_Layer1_GRAM_Handle; //显示器Layer1 GRAM定义
% I; d) P7 g; r& R( b d - extern const GRAM_HANDLE cg_LTDC_Layer2_GRAM_Handle; //显示器Layer2 GRAM定义3 ^* j) a5 e5 Z6 R# C7 J/ d) d1 U
- : f- z* {/ e7 @4 M8 [, c# i# v; u
- #define LTDC_Layer1_GRAM_HANDLE ((GRAM_HANDLE*) &cg_LTDC_Layer1_GRAM_Handle) //显示器GRAM 10 G8 z* B0 s1 R1 d0 z
- #define LTDC_Layer2_GRAM_HANDLE ((GRAM_HANDLE*) &cg_LTDC_Layer2_GRAM_Handle) //显示器GRAM 2
, j! i% j% W: i7 h( q: F - 6 a8 x7 t6 P& n: A" u
- //GDI相关API
0 o( m, o M. R, z) f - __inline void GDI_DrawPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color)
c+ k) ?( ~* }( o9 v& l - {
' r/ U3 z) |' Q8 q - pHandle->pBasicInterface->pDrawPoint(pHandle, Xpos, Ypos, Color); //画点
& z. x8 _* t! L$ \ - } 6 [2 s5 G3 d: @
- void GDI_DrawCircle(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u16 Radius, u32 Color); //绘制空心圆8 m$ H) h R# i3 `: f: Q$ f
- void GDI_DrawLine(GRAM_HANDLE *pHandle, u16 sx, u16 sy,u16 ex,u16 ey,u32 Color); //绘制直线(可以倾斜)
( d9 C9 G9 d, ^1 j - void GDI_DrawRectangle(GRAM_HANDLE *pHandle, u16 sx, u16 sy, u16 ex, u16 ey,u16 Color); //在指定位置画一个矩形
% W, T K7 g* z* Y - void GDI_DrawBigPoint(GRAM_HANDLE *pHandle, u16 Xpos,u16 Ypos,u32 Color); //画一个2*2的大点2 j4 [. C/ L. L5 _
- " `$ Q$ E: U9 E, p h( e
6 W4 A. ?5 Y G7 B: [- #endif /*_GDI_H_*/
复制代码 5 {0 ]8 V/ d# `/ x2 z5 ]' P1 ~
测试代码,使用的FATFS,读取一个事先准备的图片bin文件,RGB565格式。
: b: w j: p$ ]
0 T% f$ N! O* {/ p- FIL *pFile;
4 |4 L5 @- Y( a! c2 j - FILE_ERROR mError;- t0 ?9 m8 C) W! k) y2 } D1 b) r
- GRAM_HANDLE *pGramHandle;
* O% k- z+ q8 x$ b -
; D) R, G& T* h5 G' p# y! k& k! F - pGramHandle = GRAM_Create(320, 240, DMA2D_COLOR_RGB565); //创建一个GRAM(会申请内存),分辨率320*240,像素格式RGB565) Q7 y& W. w* c& O$ C) ~
- if(pGramHandle != NULL)
. F! d$ X% _. R8 o% {0 O E& f - {
, B) C! r3 y- j0 r0 z# j6 @ - GRAM_Clear(pGramHandle, 0xff00); //清除显存,防止读取失败了还是现实上一次的图片
3 y" o2 ?- I7 x E - uart_printf("[OK]GRAM初始化成功\r\n");
6 ~4 e7 d5 p' P& H0 F3 H6 C - pFile = FILE_Open("0:\\16bit.bin", &mError, FA_READ);
- e& t+ ~. J+ f* q* }5 c - if(pFile != NULL)2 X$ _' M- i& H! y3 d2 s
- {1 l7 K$ y6 h2 _$ G+ P
- uart_printf("[OK]打开文件成功\r\n");8 {* v$ O6 ~5 u8 @
- if(FILE_Read(pFile, (u8 *)(pGramHandle->GRAM_Addr), U32_MAX, &mError) == TRUE)//读取文件,将一个事先准备的RGB565的bin图片加载到显存中' D+ S9 ?% j" [ ~
- {
$ i' `; C1 K- h. R7 j - uart_printf("[OK]读取文件成功\r\n");
8 C5 s: s3 X+ W6 r - }
# @, x/ c4 `0 |8 V6 b- g/ F - else
1 P3 w+ v! `4 w- n - {" W y& u( g" n8 n
- uart_printf("读取文件错误:%d\r\n", mError);
) i$ ~ ?+ C" o; p" p2 R1 v - }
j6 y/ |4 K `2 D2 W% S# H) H - }- y, r$ l* F' n- b+ W1 \0 m m
- else
$ R/ S- l7 z" D" {0 h0 S' q1 I - {1 ]8 |; m ?( R1 ^8 j O6 B
- uart_printf("打开文件错误:%d\r\n", mError);" Z: I9 T4 U2 u0 H0 V
- }8 w$ ?( Q7 F: x
- //将显存拷贝到屏幕中
5 \8 ~- z; W; K& }$ _ - GRAM_LocalCopy(LTDC_Layer1_GRAM_HANDLE,(480-320)/2-1, (272-240)/2-1, pGramHandle, 0, 0, 320, 240); //GRAM局部拷贝( O/ l8 j3 z7 L! l7 d. X
- }
复制代码
2 Y( _9 p$ c9 K* y# P
7 G* d7 e7 K. E- H* L$ {2 f
3 B7 {( [/ a4 f+ ?" k& F) a |