你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F769I-DISCO开发板GUI学习内容(四)_课后动手实验

[复制链接]
wolfgang 发布时间:2018-7-21 12:00
本帖最后由 wolfgang2015 于 2018-7-21 12:06 编辑 7 Y) A+ e0 I  c3 x  l
5 F) D/ ]9 q! N% |* f% D+ M
在之前的LTDC、DSIHOST、FMC、图形中间件搭建环境好并验证成功之后,要实现图形化还需要很便捷的图形界面实现工具,加速图形应用的开发,下面这个动画,不断切换蝴蝶颜色的案例,怎么做呢?
Viedo1_0_20180721093657.gif
                              
培训视频中的方法:
  就是将图片调入内存中,不断切换图片局部的图形内容来实现;
工具呢?还用emWin一行一行代码写并作下载调试?有没有所见即所得的方法?一次下载就能完成?
答案是有,ST官方已经集成在CubeMX中,并以Lib文件形式免费使用
% t3 H( v! }! |, n$ o
1)  图形的框架搭建
CubeMX进入配置(configuration)标签栏,选择“Middlewares”中的“Graphics”—〉进入弹出窗口的“Graphics”---->使能External Tool中的 Use GuiBuilder Tool。
60.jpg
然后在STemWin中选择图形应用模式为Window,点击Execute
61.jpg
即可进入STemWin的图形编辑界面:
62.jpg
添加两个Image图层background和butterflay
分别如下图设置name、xpos、ypos、xSize、ySize
63.jpg
64.jpg
然后就保存,默认的保存位置在CubeMX工程项目中的
STemWin\app\WindowDLG.c
65.jpg
通过CubeMX生成代码的按钮,即可生成工程关联代码:
66.jpg
之前的HelloWorld生成的代码主要区别在
  1. void GRAPHICS_MainTask(void) {
    ' G# B$ a5 ~) U. ^
  2.   ......; a, \; K# _" S# x. l( z# A# k
  3.   CreateWindow();7 Q8 Q; a. J* h8 U2 b1 r
  4.   ......
    ! L' }3 j7 e! K( d2 w
  5. }& x4 y6 P6 _! m  ]8 q
复制代码
CreateWindow调用实体在新保存WindowDLG.c文件中,emWin GUIBuilder已经将电脑中编辑的图形界面,生成可由编译工具编译的C代码。这里图形环境的框架就在Cubemx和emWin GUIBuilder的帮助下搭建好了。要实现上边视频的内容,就要对框架中的内容进行素材填充和逻辑代码调整。
. T! ?) v! s0 B) a4 J) z. z
) V! a7 y3 y4 H' C( I3 |
2)素材的转换
   在实验视频中,官方提供了动手实验的素材:01-assets.7z,其中包括
background.png、butterfly_blue.bmp、butterfly_green.bmp、butterfly_pink.bmp、butterfly_yellow.bmp 等文件
视频中给出的方法是将png、bmp文件转换为数组存放在.c文件中供框架调用以便液晶屏根据代码界面显示内容。
{Cubemx生成项目}\Middlewares\ST\STemWin\Software目录中已经提供了将图形文件转换为.c文件的工具,如下图:
67.jpg
0 j% A: d4 g9 {/ V
分别用BmpCvtST工具打开PNG、BMP文件
68.jpg
另存为C文件
69.jpg
Background.png转换的格式为:“True Color With alpha, r/b swapped, alpha inverted ”
70.jpg
其余的butterfly*.bmp转换格式为:“High color whit Alpha[565], read and blue swapped”
71.jpg

/ |& |, I% ]' D* b& P
这是素材转换就准备好了,为什么格式不一样可以同时使用?这里的答案已经在直播视频中,请诸位在直播中去寻找。
+ g: @0 [6 V7 K# B9 h- ?* o
1 t" \# p6 ?# l
3)控制逻辑修改
用IDE打开工程,把对应的C代码引入工程中
72.jpg
修改STemWin/APP如下文件的内容:
73.jpg

4 p1 G( I/ u& z$ N' J( ?
修改后的内容分别如下:
GUI_APP.c文件中
  1. void GRAPHICS_MainTask(void) {* [# J( Z- W) [# |; \, A
  2.   ……
    6 U  ]% K3 I, [2 y9 _" ^/ @" _6 v3 o
  3.   WM_HWIN hWin = CreateWindow();  x$ U. n6 d; F7 a8 ]
  4.   while(1) {        # ^% t. Q2 J4 ?# \2 |
  5.     WM_InvalidateWindow(hWin);
    , t( T& ]9 P3 I& u% u, y4 x
  6.     GUI_Delay(1000);' B- s1 t( d# S  u
  7.   }
    6 N7 I8 P) Y- z; F& X6 B4 [8 f
  8.   ……
    : z1 ^- M4 E  P- ?
  9. }
    4 X! B7 w6 W% `% v
复制代码
WindowDLG.c文件中
  1. //引入图片文件
    8 x; J/ ]# C& r
  2. // USER START (Optionally insert additional defines)
    + d; ^. Q& L7 v9 ]; a1 n3 J
  3. extern GUI_CONST_STORAGE GUI_BITMAP bmbackground;  ^- J6 O- b' i- r/ j
  4. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_blue;2 Z( c) W% q: G, c5 X( F3 b
  5. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_green;) L, J. z* S; \: e; [
  6. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_pink;% U# {. @3 W$ \  c% t/ k, h
  7. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_yellow;3 V" f0 D& {4 }2 m, `% Z
  8. // USER END6 m3 F& n5 J" [5 P5 ?# n
  9. …….' t" O! h2 m, k: r5 B8 a
  10. //定义图片状态
    , }) J8 z9 ]2 z4 P8 Y7 e0 ]
  11. // USER START (Optionally insert additional static code)8 H; J& Y* u7 j* x  O* z0 ~% k
  12.    static int butterflay_status=0;$ O) S: t+ S* K0 J2 v! f" E# j/ q3 F
  13. // USER END% K/ O  s  ?- F8 a$ i! b
  14. ……
    4 m% ?2 L4 t: M2 S% W
  15. //修改显示控制
    / q* s; R% }0 v1 C
  16. static void _cbDialog(WM_MESSAGE * pMsg) {
    % ^2 U$ w+ X3 J5 [( w
  17. ……
    % y+ i/ C# c6 U( N
  18. switch (pMsg->MsgId) {
    5 T( @& U. x( |
  19.   case WM_INIT_DIALOG:
    1 L% d* A( p+ B" Y, f
  20.     hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);% m9 e7 B+ W5 e) H/ j
  21.     IMAGE_SetBitmap(hItem, &bmbackground);
    2 _* S2 }# I$ S* h( Q! b4 Y

  22. : d9 p; e; n* c. _8 e1 L
  23.     hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    ) w$ d8 T6 f# W+ B
  24.     IMAGE_SetBitmap(hItem, &bmbutterfly_blue);* S6 f* E5 \' S( n
  25.         ( l- e4 t  P% \' D8 y/ ^% L( |# F, ]
  26.     break;6 g4 L/ Z8 ?3 J+ J0 P7 J
  27.   default:
    + e# p  [2 `' \! f4 d6 G
  28.           if (butterflay_status==0){
    - Y1 u4 A* O3 Q1 F
  29.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);) m# p. f! _% a+ ~( _" j
  30.                   IMAGE_SetBitmap(hItem, &bmbutterfly_green);
    / W! d2 A1 R6 e* }. D: A
  31.                   butterflay_status=1;' I" ~# s4 V- F1 q( O
  32.           }else if (butterflay_status==1){
    , C3 ^/ p9 b% J7 c5 w) _8 d
  33.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    $ \8 K6 F- F9 ^$ n- B
  34.                   IMAGE_SetBitmap(hItem, &bmbutterfly_pink);
    7 B7 z$ t* I# [# l
  35.                   butterflay_status=2;6 }* m9 M' I( }. Z* T2 c! [+ J% ]
  36.           }else if (butterflay_status==2){
    * k0 ~! u: V" J8 E
  37.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);' U& W. a( Q# Y8 q: u; \
  38.                   IMAGE_SetBitmap(hItem, &bmbutterfly_yellow);
    . E7 K  f3 [$ `5 |
  39.                   butterflay_status=3;5 z: C! F+ J0 E4 X8 L8 `
  40.           }else {
    ! w# N( V# ]+ X: d
  41.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);/ ?' h: a3 o9 b2 C
  42.                   IMAGE_SetBitmap(hItem, &bmbutterfly_blue);- {, z& @/ n3 D
  43.                   butterflay_status=0;
    * y. w& Y6 a+ t3 Q0 n
  44.         }
    ) b- X( f) L! N2 t
  45.     WM_DefaultProc(pMsg);
    4 u" L( F, \" Q9 y3 p9 O
  46.     break;
    . |- h: F* ~5 w* k# Z
  47.   }
    " d4 U$ x% t/ \2 J
  48. }
    . `! E& @1 R( S- s. `! o3 l
  49. …….
    , T- ]0 K. {+ F" @% I0 K( O
复制代码
6 m) @. z3 _/ S* y2 |+ M/ d& {
编译工程并下载到开发板中,即可实现上面GIF文件所展示的GUI图形显示功能。
9 R9 o" I2 K1 `& l0 w" X
在Cubemx、GUIBuilder、BmpCvtST等工具的辅助下,加快了GUI应用的实现。虽然是一个Demo已经完整地展示了图形框架的搭建、素材转换、以及控制逻辑修改等方法流程;对于学习GUI工程实现有很大的帮助;
3 H- t' d+ E, r2 ~' A

" }; k- L. K" s% f) ^8 Y

7 ]* R& V: w8 C. s
真正的工程应用会使用其他方法解决Demo中几个问题:
1、占用内部Flash太大;
2、图片的更换需要更新工程代码;
3、可以将STM32F769I的设备引用进来,充分利用硬件的特性;
比如:JPG硬件加速、SD卡设备读取外部文件等等,
GUI这个技术含量颇高的功能已经掌握后,STM32F769IDisco的其他应用拓展正等着诸位前去逐一熟悉。
" Y- N8 o3 u. v% C7 \3 B0 V0 \! [" z- ?0 Q2 V* C
STM32F769I-DISCO开发板GUI学习内容(一)_课前知识预习
( V/ q) _# j+ ~STM32F769I-DISCO开发板GUI学习内容(二)_课前硬件基础, W, w& D6 N7 S& A7 _4 i
STM32F769I-DISCO开发板GUI学习内容(三)_课前预习之CubeMX篇(上)$ a" A# _, \( G8 X, a6 q/ J
STM32F769I-DISCO开发板GUI学习内容(三)_课前预习之CubeMX篇(下)+ Q+ z' _9 r* Z% q
收藏 评论4 发布时间:2018-7-21 12:00

举报

4个回答
jinglixixi 回答时间:2018-7-22 09:27:47
点赞!
591745543 回答时间:2018-12-27 17:45:34
学习中
Kevin_G 回答时间:2018-12-29 11:02:09
学习中
liu888888 回答时间:2019-1-14 13:10:05
学习中
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版