意法半导体向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)
R, ~4 ]: C- p- }* { - {
& ^9 Q& H2 \ i4 n4 M/ W" [ - LTDC_LayerCfgTypeDef layer_cfg;* w) H( x) D$ D* R
-
, D) R7 R& x4 Z% w: t - if (LayerIndex < GUI_NUM_LAYERS)
* p* L5 s2 H7 A0 k/ O - {
3 J3 F9 o, ]: }! ?) _. ^ - /* Layer configuration */3 w, u/ C) y! [" @. Z4 F
- layer_cfg.WindowX0 = 0;
; s5 {7 L+ Q# N - layer_cfg.WindowX1 = XSIZE_PHYS;
( o& f1 p5 R$ B' V" ]. R - layer_cfg.WindowY0 = 0;( O: V9 R) E- [: y9 u
- layer_cfg.WindowY1 = YSIZE_PHYS;
( V3 \& [/ a/ |; u& E0 O - layer_cfg.PixelFormat = LCD_LL_GetPixelformat(LayerIndex);' t, l' z* X/ T3 s
- layer_cfg.FBStartAdress = ((uint32_t)0xC0000000);' Q! {) O( }: \. C7 G1 V; u! J
- layer_cfg.Alpha = 255;
0 `0 J( O) j& r% ]. i - layer_cfg.Alpha0 = 0;
( `) R# y R& E5 U# Q+ E; l - layer_cfg.Backcolor.Blue = 0;
8 Q. ?. h7 e; X2 e( {$ [% @ - layer_cfg.Backcolor.Green = 0;
: {! t* U/ k u. P - layer_cfg.Backcolor.Red = 0;
3 `3 t- R( g) j0 ] - layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;9 Q/ N/ D' h5 W1 i" E1 t
- layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;6 u- I# W- V, {4 j$ i
- layer_cfg.ImageWidth = XSIZE_PHYS;
) a. b# e# J" y - layer_cfg.ImageHeight = YSIZE_PHYS;
; B( Y/ g" B$ g7 h( z( g% s5 y - HAL_LTDC_ConfigLayer(&hltdc, &layer_cfg, LayerIndex);
& b" _( n8 X. Q8 X' L! O, q - + l$ [* m. d" m) A1 _; \1 ]' ~
- /* Enable LUT on demand *// X$ a3 s O# ^
- if (LCD_GetBitsPerPixelEx(LayerIndex) <= 8)
5 o2 C6 ~+ Q& [9 ?8 F - {
; B% I: }; C" ?# R& s/ { - /* Enable usage of LUT for all modes with <= 8bpp*/
. ?. j8 B. E& B4 e. Y+ J3 z' _ - HAL_LTDC_EnableCLUT(&hltdc, LayerIndex);
$ O+ o |, r9 T7 G& n - } $ E+ E1 B' B$ n' N
- }
; m" T1 v$ j4 Q( U# ~ - }
复制代码- static void LCD_LL_Init(void)
5 W: |1 h" Q& K8 m - {
, |$ Z: Q& N6 H7 G1 T7 d. I - /* DeInit */! e% U W# K# j
- HAL_LTDC_DeInit(&hltdc);
- [( ?# C- V" ^( P7 ? - 0 J( R' z1 e% R3 ^- [. ?) p4 o3 D
- /* Set LCD Timings */3 K8 D5 {, u4 T& G' }& ?1 }
- hltdc.Init.HorizontalSync = 40;$ h: c7 b5 N, H: ]4 `& E" n
- hltdc.Init.VerticalSync = 9;
: b* e A! w: T - hltdc.Init.AccumulatedHBP = 53;1 O6 h/ }% o# e, m. Z# P
- hltdc.Init.AccumulatedVBP = 11; @1 L9 Y: t( h7 s. E
- hltdc.Init.AccumulatedActiveH = 283;1 g6 Y9 a. O+ A9 b: I4 h3 {
- hltdc.Init.AccumulatedActiveW = 533;
! L, q, o/ \, o- ]- B3 `: q" i2 U+ D - hltdc.Init.TotalHeigh = 285;
" r; ^& I/ t4 L/ g/ t1 b5 k - hltdc.Init.TotalWidth = 565;9 J! \+ ]# x* { {
- / k4 U; f" \& z: y
- /* background value */
' e l( Z3 e4 c0 q3 f. Q$ A - hltdc.Init.Backcolor.Blue = 0;7 B+ l6 |+ t( b* \
- hltdc.Init.Backcolor.Green = 0;3 D) y4 M* n: J7 q. ]% q7 w
- hltdc.Init.Backcolor.Red = 0;
9 r* f( c3 [# h5 e$ o -
4 m, d- c# L( N/ u' Z1 T+ I3 N7 w3 L - /* Polarity */; U0 s& ~2 L1 o* F+ Q' Y0 k: C2 E
- hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;! O* P+ q1 w+ X: f
- hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
# ~3 }- v4 p3 D( y- O7 q. ~ - hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
, r0 q4 P. R I$ g5 F j4 `- O - hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
! h2 g: y% j6 ?2 U - hltdc.Instance = LTDC;
! V+ q W( r& C v4 c - - Q: a. {' {, q! q' x- x. L1 n
- HAL_LTDC_Init(&hltdc);: g# b" D; l1 U
- HAL_LTDC_ProgramLineEvent(&hltdc, 0);
: `- {2 S2 J3 e1 F - 3 R1 f/ i5 a( H
- /* Enable dithering */
r9 d! k6 t- U6 ~- u* { - HAL_LTDC_EnableDither(&hltdc);
$ W1 A' z( a' [! p+ f. A - / A4 ` l6 K5 h7 U' p; U6 \$ A( b
- /* Configure the DMA2D default mode */ ) R2 N, H% f( q! D
- hdma2d.Init.Mode = DMA2D_R2M;
1 [; W7 H1 h: s* F7 `* P$ r3 g - hdma2d.Init.ColorMode = DMA2D_RGB565;/ t& u. J4 _! \* i- F; d( x' [/ N
- hdma2d.Init.OutputOffset = 0x0;
5 `7 r/ d# u* z+ {8 [6 D* |8 L6 G- d - 3 y! d, g4 F5 q, K* P8 b
- hdma2d.Instance = DMA2D;
& G" [6 [; H, Z" |. c - $ K- y1 e1 u9 ~+ ^/ q; M$ g' {
- if(HAL_DMA2D_Init(&hdma2d) != HAL_OK)! |! f2 o1 D& c% @; B
- {, G9 Z3 I+ R6 B; y5 \- M
- while (1);) J+ S# T0 o. c! O
- }5 y) r) a/ j2 x9 a* v o3 D( Y% m
- : y4 b7 Q9 c v
- /* Assert display enable LCD_DISP pin */
$ U- t7 }2 Q% c: N - HAL_GPIO_WritePin(GPIOI, GPIO_PIN_12, GPIO_PIN_SET);% K" e; `' j+ `' ?& r
- 1 B5 x+ {. m1 z8 y( d7 h
- /* Assert backlight LCD_BL_CTRL pin */
) {" x& y0 q1 E8 s, w# p - HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_SET);8 v- @; f* G- q- i
; j; D" k+ }& q+ X# d' n$ J$ \- }
复制代码
% u5 H! I H) C+ l% |/ y在使用GUI之前,要GUI_Init();函数,对ST enWin 的库进行初始化,并使用WM_SetCreateFlags(WM_CF_MEMDEV);激活存储设备。 完成上述的工作,就可以在工程中调用ST emWin的API函数了。 如,在LCD上显示Hello World。 清屏,清除LCD为黑色的背景色。 ( S6 h5 @; C7 ?+ J7 \
设置GUI的字体为GUI_Font20_1。 - GUI_SetFont(&GUI_Font20_1);
复制代码
4 q# Q/ H0 ?2 C1 V0 Q0 x9 s1 \这里有很多的字体可以使用的。
使用GUI_DispStringAt函数显示字符串。 这个函数的第一个参数是要显示的字符串,后两个参数是要显示字符串的位置。 - GUI_DispStringAt("Hello world!", (LCD_GetXSize()-100)/2, (LCD_GetYSize()-20)/2);
复制代码程序运行结果:
% _3 q+ B0 l$ x) Y |
还有大量F7帖子:http://jingyan.eeboard.com/user/395834
还不如用STemWin