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