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

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

[复制链接]
wolfgang 发布时间:2018-7-21 12:00
本帖最后由 wolfgang2015 于 2018-7-21 12:06 编辑 , E- B& M3 ^9 {$ Y* }7 t3 D; ?. j
; ^5 L8 q8 F$ M6 x# ^  J
在之前的LTDC、DSIHOST、FMC、图形中间件搭建环境好并验证成功之后,要实现图形化还需要很便捷的图形界面实现工具,加速图形应用的开发,下面这个动画,不断切换蝴蝶颜色的案例,怎么做呢?
Viedo1_0_20180721093657.gif
                              
培训视频中的方法:
  就是将图片调入内存中,不断切换图片局部的图形内容来实现;
工具呢?还用emWin一行一行代码写并作下载调试?有没有所见即所得的方法?一次下载就能完成?
答案是有,ST官方已经集成在CubeMX中,并以Lib文件形式免费使用
. Q# C+ g1 Q3 {0 _% i8 M
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) {8 N+ Y" z' E7 a* n7 E, z) }' O
  2.   ......
    / q8 K* Q( @7 e
  3.   CreateWindow();
    ! }8 r: Z8 ]+ T9 s
  4.   ......) ^: R8 I) y: z6 d# e. b
  5. }/ `! E8 t/ c" J; ~3 Y$ a/ C
复制代码
CreateWindow调用实体在新保存WindowDLG.c文件中,emWin GUIBuilder已经将电脑中编辑的图形界面,生成可由编译工具编译的C代码。这里图形环境的框架就在Cubemx和emWin GUIBuilder的帮助下搭建好了。要实现上边视频的内容,就要对框架中的内容进行素材填充和逻辑代码调整。
9 X4 j, D. d% E) ~. t( f
! l  M, ~2 M# b  t2 B+ T2 l! N
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
3 s7 e' v2 f9 `/ c, G/ r
分别用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
3 h( l; ~8 l6 V, r' k: F3 {8 T! I
这是素材转换就准备好了,为什么格式不一样可以同时使用?这里的答案已经在直播视频中,请诸位在直播中去寻找。
7 l' m$ g4 a9 d+ B% s6 ]
* ~6 A' X# @% f$ S6 K
3)控制逻辑修改
用IDE打开工程,把对应的C代码引入工程中
72.jpg
修改STemWin/APP如下文件的内容:
73.jpg

0 q  {! V7 J2 g8 D
修改后的内容分别如下:
GUI_APP.c文件中
  1. void GRAPHICS_MainTask(void) {
    3 D  g& }0 t9 X! q  k
  2.   ……
    + v) X1 k; q6 I& Q
  3.   WM_HWIN hWin = CreateWindow();8 o- n/ @, l$ i: K3 N6 o/ x
  4.   while(1) {        " z, e% d" T, W9 ^! f% J
  5.     WM_InvalidateWindow(hWin);
    . f' j: a2 d- A: b0 l
  6.     GUI_Delay(1000);
    4 Z; J- i/ z9 R
  7.   }
    + b+ K) a* X# Y# w! I% u
  8.   ……
    # s+ X. ]% Q) R% G, u# H
  9. }1 F! X7 n3 `5 F3 U" g3 H- x
复制代码
WindowDLG.c文件中
  1. //引入图片文件
    , i& V! B* W$ I
  2. // USER START (Optionally insert additional defines)0 `0 Z/ d/ v6 N( Y
  3. extern GUI_CONST_STORAGE GUI_BITMAP bmbackground;
    7 w) |' v7 g/ C3 D- t+ s1 V' d
  4. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_blue;+ I9 _; t3 E5 E& {2 K9 p
  5. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_green;. B8 R: |$ `; I# v+ m
  6. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_pink;# {9 V1 A* L" H5 E
  7. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_yellow;
    3 x2 [: i4 C' s$ w5 T
  8. // USER END9 K1 @7 n1 S' }5 i/ u9 R
  9. …….) X8 a( {1 p. A  }9 K" U0 H
  10. //定义图片状态; o5 _. m& U3 M/ N7 N
  11. // USER START (Optionally insert additional static code): t1 a: k& r6 y0 T  l: p
  12.    static int butterflay_status=0;" @& ?  P) z; _+ ^) W/ Z+ f3 v
  13. // USER END9 D0 S! t7 R+ \- U! x) E" S& f- `
  14. ……0 p- o0 Q' O/ m
  15. //修改显示控制2 T- l4 u7 t# a. Z8 o# H6 |
  16. static void _cbDialog(WM_MESSAGE * pMsg) {$ h% C( b/ A' m; v) V
  17. ……. b+ n% j0 o4 {9 c; I  X( b7 S
  18. switch (pMsg->MsgId) {
    3 O3 q$ `6 K, g* Z. x4 f
  19.   case WM_INIT_DIALOG:
    " \0 m7 v! T5 D2 R2 J
  20.     hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);3 x/ ]$ ^, ^$ ?  K9 g. N0 c
  21.     IMAGE_SetBitmap(hItem, &bmbackground);2 W( t) j: a& `' A' F) m" x) l

  22. ) {* h8 ^) h5 m+ `: Y
  23.     hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    1 T9 R& B2 b3 l$ J
  24.     IMAGE_SetBitmap(hItem, &bmbutterfly_blue);  Y- Q2 e: I* W* G
  25.         & a9 P6 p: t/ y7 c9 d: Q
  26.     break;
    4 C4 s; j- O# ?. O
  27.   default:
    ( B8 G1 \; u/ W5 ~: ^% b3 S8 k5 T
  28.           if (butterflay_status==0){1 U0 n2 x+ `* j, Y- ?
  29.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    6 f+ L8 @7 [5 n4 w4 D: f3 S
  30.                   IMAGE_SetBitmap(hItem, &bmbutterfly_green);
    % f+ ?# t5 `8 X0 S# _5 S% E
  31.                   butterflay_status=1;. I9 |7 V$ s$ A7 ]
  32.           }else if (butterflay_status==1){7 |' j" J& }8 ?
  33.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);6 e4 U9 D3 j8 q  o1 z, @
  34.                   IMAGE_SetBitmap(hItem, &bmbutterfly_pink);5 [9 H# i  p" @
  35.                   butterflay_status=2;
    # p0 e% {* R4 _, C! A' ?4 M& v
  36.           }else if (butterflay_status==2){
    4 s7 ~$ z+ `" O3 P$ U
  37.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);% H5 c; d) b+ o& @
  38.                   IMAGE_SetBitmap(hItem, &bmbutterfly_yellow);
    / V! K) g, S. }8 P' t! D
  39.                   butterflay_status=3;3 C  _4 c* X+ K, m, {
  40.           }else {
    : k7 g2 \8 c$ l
  41.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    $ B  v  p9 [* D, T" f% [- S
  42.                   IMAGE_SetBitmap(hItem, &bmbutterfly_blue);9 U+ Y2 ~8 m! z, d1 a) {. N! L
  43.                   butterflay_status=0;5 C; t" x, e3 \7 u
  44.         }
    , \% a5 ^! C: Q. g/ ]# S
  45.     WM_DefaultProc(pMsg);
    ! Z- d" N5 B; K. U; }  @
  46.     break;  w, q* b: C/ q* z
  47.   }
      W7 e* [6 f  B1 ~) g" t
  48. }1 t1 B' B6 I7 G' T7 V8 y
  49. …….: ~( U& A; N6 e+ V) L7 ^1 w1 L5 s
复制代码
- J3 Y; `! g8 g2 E
编译工程并下载到开发板中,即可实现上面GIF文件所展示的GUI图形显示功能。

/ g( e5 Z3 g7 O* O" a
在Cubemx、GUIBuilder、BmpCvtST等工具的辅助下,加快了GUI应用的实现。虽然是一个Demo已经完整地展示了图形框架的搭建、素材转换、以及控制逻辑修改等方法流程;对于学习GUI工程实现有很大的帮助;

" w$ [" }- @, J; b4 O

0 _9 Y8 C+ D; w9 ~. V6 {0 }
% l8 `9 r$ P/ m
真正的工程应用会使用其他方法解决Demo中几个问题:
1、占用内部Flash太大;
2、图片的更换需要更新工程代码;
3、可以将STM32F769I的设备引用进来,充分利用硬件的特性;
比如:JPG硬件加速、SD卡设备读取外部文件等等,
GUI这个技术含量颇高的功能已经掌握后,STM32F769IDisco的其他应用拓展正等着诸位前去逐一熟悉。
5 T5 J, i9 r) o, E5 K: f( s5 j. [& W1 t! b) f) x# K+ x
STM32F769I-DISCO开发板GUI学习内容(一)_课前知识预习1 e+ z) {  ^! M  X  v
STM32F769I-DISCO开发板GUI学习内容(二)_课前硬件基础" W2 p# Q% o0 \- B+ O, E' w/ R3 f" T
STM32F769I-DISCO开发板GUI学习内容(三)_课前预习之CubeMX篇(上)7 M% u# _* m1 @6 d& k" G
STM32F769I-DISCO开发板GUI学习内容(三)_课前预习之CubeMX篇(下)
+ j5 u/ T) }' B3 r1 S* U( `5 w% i
赞 收藏 评论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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版