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