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