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