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