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