|
意法半导体向STM32客户免费提供STemWin软件。该软件内置SEGGER VNC虚拟网络计算系统,可运用互联网协议远程查看用户界面。该软件还为开发人员提供其它强大的功能,其中包括窗口管理器和小工具包、触摸屏/鼠标支持,存储器上下文可实现无闪屏刷新。 目前StemWin并不提供源码,记得好像只有2.9以前的GUI才有源码,这里StemWin是以库的形式提供的。 
可以看出,这个库是针对M7而制作的,所以这里要使用StemWin的话,只要配置GUIConf.c与LCDConf.c两个文件就可以了 。 
GUIConf.c主要是配置显示缓存的大小 。 LCDConf.c主要是配置与LCD相关的参数与函数。 LCD-TFT(液晶显示器——薄膜晶体管)显示器控制器提供并行数字 RGB (红色、绿色、蓝色)以及水平同步、垂直同步、像素时钟和数据使能信号,这些信号直接输出到不同 LCD和 TFT面板的接口。 层混合: 
LTDC编程步骤: 1、在 RCC寄存器中使能 LTDC 时钟。 2、按照面板数据表配置所需像素时钟。 3、配置同步时序:VSYNC、HSYNC、垂直和水平后沿、有效数据区域以及前沿时序。 4、配置 LTDC_GCR 寄存器中的同步信号和时钟极性。 5、必要时,配置 LTDC_BCCR寄存器中的背景色。 6、配置 LTDC_IER和LTDC_LIPCR 寄存器中的所需中断。 7、通过执行以下编程操作配置第 1/2层的参数: 1)、编程LTDC_LxWHPCR和LTDC_WVPCR 寄存器中的层窗口的水平和垂直位置。层窗口必须位于有效数据区域 2)、编程LTDC_LxPFCR 寄存器中的像素输入格式 3)、 编程LTDC_LxCFBAR寄存器中的颜色帧起始地址 4)、 编程LTDC_LxCFBLR寄存器中的颜色帧缓冲区的行长和间距 5)、 编程LTDC_LxCFBLNR寄存器中的颜色帧缓冲区的行数 6)、 必要时,在LTDC_LxCLUTWR寄存器中为 CLUT 加载 RGB值及其地址 7)、 必要时,分别在LTDC_LxDCCR和LTDC_LxBFCR寄存器中配置默认颜色和混合系数 8、使能 LTDC_LxCR寄存器中的第 1/2层,必要时使能 CLUT 。 9、必要时,可分别在LTDC_GCR和 LTDC_LxCKCR寄存器中使能抖动和色键。也可以实时使能这两个功能。 10、通过 LTDC_SRCR 寄存器将影子寄存器重载到活动寄存器中。 11、使能 LTDC_GCR 寄存器中的 LCD-TFT控制器。 12、除 CLUT外,所有层参数均可实时修改。新配置必须通过配置LTDC_SRCR 寄存器立即重载或在垂直消隐周期内重载。 |
如下,LTDC的初始化函数。对板子上的LCD进行初始化。 - static void LCD_LL_LayerInit(U32 LayerIndex)
9 b& |7 Q1 Q, l, v9 B - {8 o, Y3 ~) ? I# S: F
- LTDC_LayerCfgTypeDef layer_cfg;( t( f, L6 m t% }
- # A8 s4 [& K" P/ r2 h
- if (LayerIndex < GUI_NUM_LAYERS) 2 Q2 o/ J1 \! j. `4 P; p
- {
1 W: e$ A) L& z' ~" h) } - /* Layer configuration */
# C% m/ \, W+ T& D- F - layer_cfg.WindowX0 = 0;
- b1 ~5 c2 R0 j5 g7 i4 V - layer_cfg.WindowX1 = XSIZE_PHYS;" ]! g9 t! g$ ^% ~2 P
- layer_cfg.WindowY0 = 0;
. Y3 ]6 a5 H7 v) B - layer_cfg.WindowY1 = YSIZE_PHYS;
V, F/ U" m9 F' G( v; u' }5 l# z( Q - layer_cfg.PixelFormat = LCD_LL_GetPixelformat(LayerIndex);, W* ^0 ^/ B) p* F( M( y+ s
- layer_cfg.FBStartAdress = ((uint32_t)0xC0000000);9 d% C. i9 F7 m4 ?3 S* v
- layer_cfg.Alpha = 255;
, s" ~4 C* Y s9 K' l1 d - layer_cfg.Alpha0 = 0;
/ {2 D# W3 c2 v5 e+ m7 q9 P4 w: U1 { - layer_cfg.Backcolor.Blue = 0;1 L( e2 \3 b7 K" b, k$ B; J
- layer_cfg.Backcolor.Green = 0;
% M V- P: y7 x- D1 l - layer_cfg.Backcolor.Red = 0;" k: A2 z/ O; C7 X) l
- layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
/ ?$ v' E# U {1 X( x; a* [ - layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
9 L4 b8 O! l% p5 P+ y3 q; X$ _( x - layer_cfg.ImageWidth = XSIZE_PHYS;
3 L. f6 ` O7 t, O j - layer_cfg.ImageHeight = YSIZE_PHYS;
: d5 @: g' R' s6 u q& N/ j - HAL_LTDC_ConfigLayer(&hltdc, &layer_cfg, LayerIndex);
1 F1 f) _& Y7 s9 G - 0 z! V( |( C0 J$ m F
- /* Enable LUT on demand */ Q0 Y( d) S& o7 `$ Q9 q
- if (LCD_GetBitsPerPixelEx(LayerIndex) <= 8) + U% C A: H1 l ^+ R3 Z& N% j, B
- {
# S. T! K+ c7 X# O- `" P - /* Enable usage of LUT for all modes with <= 8bpp*/
' E$ _. a/ G( ]8 f6 p6 O3 G0 z+ h - HAL_LTDC_EnableCLUT(&hltdc, LayerIndex);5 a- f$ E# o% s; i1 Y- m* }2 t: O
- } ! B# c$ D5 A& n
- } 9 A3 j) O. y% N* @# k$ U `
- }
复制代码- static void LCD_LL_Init(void)
& ~2 r& x* T" k3 ^! h8 t- s6 } - {
- A# a6 S6 H. B- K6 G X5 j( ` - /* DeInit */& }2 {; h! x/ g
- HAL_LTDC_DeInit(&hltdc);
: f; @' h% |/ U4 E - - g* w1 X7 F- j3 F
- /* Set LCD Timings */
- T' P4 S ?; e+ r0 \ r - hltdc.Init.HorizontalSync = 40;$ U! K: Z6 t$ h: V/ G4 v
- hltdc.Init.VerticalSync = 9;5 F$ O" d# G& J7 p0 S3 C0 |/ S F
- hltdc.Init.AccumulatedHBP = 53;
8 ~% G7 H" }7 S. M - hltdc.Init.AccumulatedVBP = 11;
) r$ Y# ]: z# o; Z - hltdc.Init.AccumulatedActiveH = 283;
4 M3 `" K# t! b3 I) D0 X - hltdc.Init.AccumulatedActiveW = 533;
- n: D; R% _5 e3 W - hltdc.Init.TotalHeigh = 285;6 g' h3 D* j# R) T2 G; J( P( _
- hltdc.Init.TotalWidth = 565;
' B: X+ f' b" l( J0 V7 t9 [ - ; m% X4 ]: {7 m) d! G
- /* background value */% |1 X$ D$ G' G" k
- hltdc.Init.Backcolor.Blue = 0;
$ j% N9 N8 R! {) i - hltdc.Init.Backcolor.Green = 0;6 k6 j/ B4 z/ l% a3 A
- hltdc.Init.Backcolor.Red = 0; * s) L) M- r9 C3 W
- 3 `4 \. L0 ?9 K8 z% R; d" G
- /* Polarity */$ d( S! o6 w. N
- hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
& H9 Z" `5 ?: J' `! J9 M- I: f - hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
6 G; B ~* X0 c# ]: Y. ` - hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; + O2 Z( ] H- E: r& D$ d+ m; }+ H7 i
- hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
: c0 |- C5 d' u" K" w; Z - hltdc.Instance = LTDC;
2 u1 A. y- I: o0 o - ( ?; ]4 c$ a! ]6 J
- HAL_LTDC_Init(&hltdc);
/ f% h" ^( T+ a4 A' v( P - HAL_LTDC_ProgramLineEvent(&hltdc, 0);: H( S; b, |* w/ g; ^6 i/ o# f8 `. [
-
2 v7 n& _ ~: N5 d - /* Enable dithering */
3 S: u& z% [# B& ]! J$ P9 J4 @1 v - HAL_LTDC_EnableDither(&hltdc);
n8 f( p: T# R0 \0 Y4 ^ -
3 X' ]: a. j& K! M, | - /* Configure the DMA2D default mode */
5 g) U5 Y# u8 N U - hdma2d.Init.Mode = DMA2D_R2M;
% u$ a; X/ C1 E$ Z - hdma2d.Init.ColorMode = DMA2D_RGB565;
7 C5 e, n. y; X# J - hdma2d.Init.OutputOffset = 0x0; # j* n# T& J4 p) W% U3 A
0 @3 ?3 K1 Y0 S \! Q1 Y- hdma2d.Instance = DMA2D; ( m/ O5 x% S/ T
. k& m, X# S6 M* ]. O2 f* k2 Z3 Q- k- if(HAL_DMA2D_Init(&hdma2d) != HAL_OK)
' q, y( s3 N$ N+ N9 I* Y% ` - {
0 C6 I" j: Z! k' ^' p - while (1);4 g: L6 v6 i/ J) q4 T: t
- }
: `' A. m/ w* }3 L7 L: q -
7 A" H4 N6 `. h s - /* Assert display enable LCD_DISP pin */4 J: I6 p# U0 t' ^
- HAL_GPIO_WritePin(GPIOI, GPIO_PIN_12, GPIO_PIN_SET);
3 u, a3 H" S; F4 r. y, P
$ b% s; D: ]9 G- V5 L: d" R5 e- /* Assert backlight LCD_BL_CTRL pin */
! S7 e- t! v# h - HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_SET);
+ P6 k) _1 |3 W: J5 ]( x+ o - . T4 W8 i# Q0 T; X
- }
复制代码
. p0 c# N+ W( I& L4 S! n在使用GUI之前,要GUI_Init();函数,对ST enWin 的库进行初始化,并使用WM_SetCreateFlags(WM_CF_MEMDEV);激活存储设备。 完成上述的工作,就可以在工程中调用ST emWin的API函数了。 如,在LCD上显示Hello World。 清屏,清除LCD为黑色的背景色。
9 j0 j; T. ]; a) c6 u4 b! [设置GUI的字体为GUI_Font20_1。 - GUI_SetFont(&GUI_Font20_1);
复制代码
# v* _) L% Q- ^$ o这里有很多的字体可以使用的。 
使用GUI_DispStringAt函数显示字符串。 这个函数的第一个参数是要显示的字符串,后两个参数是要显示字符串的位置。 - GUI_DispStringAt("Hello world!", (LCD_GetXSize()-100)/2, (LCD_GetYSize()-20)/2);
复制代码程序运行结果:
3 Q! R! i; ?7 `7 g' h- `' s) n$ g
|
还有大量F7帖子:http://jingyan.eeboard.com/user/395834
还不如用STemWin