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

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

[复制链接]
wolfgang 发布时间:2018-7-21 12:00
本帖最后由 wolfgang2015 于 2018-7-21 12:06 编辑
+ M* t) G5 `; @/ e! p( H6 \% ~9 V  y9 m/ ~! z9 N
在之前的LTDC、DSIHOST、FMC、图形中间件搭建环境好并验证成功之后,要实现图形化还需要很便捷的图形界面实现工具,加速图形应用的开发,下面这个动画,不断切换蝴蝶颜色的案例,怎么做呢?
Viedo1_0_20180721093657.gif
                              
培训视频中的方法:
  就是将图片调入内存中,不断切换图片局部的图形内容来实现;
工具呢?还用emWin一行一行代码写并作下载调试?有没有所见即所得的方法?一次下载就能完成?
答案是有,ST官方已经集成在CubeMX中,并以Lib文件形式免费使用

9 H! s# D3 y, `, U6 l3 P' F
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) {
    + Y3 H. Q8 A0 d  o" v4 k$ E0 b
  2.   ......) f! M6 T. J5 e/ F3 Z% p
  3.   CreateWindow();
    ) C, [+ |- X1 o' O" K' r9 M
  4.   ......
    2 R+ b4 ?* s0 {) c; a' s) U0 X
  5. }
    ; _  e. |# R8 t0 ?( s* H: H- J! J
复制代码
CreateWindow调用实体在新保存WindowDLG.c文件中,emWin GUIBuilder已经将电脑中编辑的图形界面,生成可由编译工具编译的C代码。这里图形环境的框架就在Cubemx和emWin GUIBuilder的帮助下搭建好了。要实现上边视频的内容,就要对框架中的内容进行素材填充和逻辑代码调整。

3 d$ ?3 r  `8 _" x
% D+ x" j+ v) V) C% \- |
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
, ~% `1 B# N# y
分别用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
: l/ ?* Q( x" _; A( @) \0 D
这是素材转换就准备好了,为什么格式不一样可以同时使用?这里的答案已经在直播视频中,请诸位在直播中去寻找。
( s% P7 K+ S" s; S$ N; `
) V+ f8 H0 l2 |9 u4 h+ [
3)控制逻辑修改
用IDE打开工程,把对应的C代码引入工程中
72.jpg
修改STemWin/APP如下文件的内容:
73.jpg

9 }" J( Y! S/ d" ~% p. I, Y6 T) e8 M) x
修改后的内容分别如下:
GUI_APP.c文件中
  1. void GRAPHICS_MainTask(void) {( a' t$ D) O* Q$ \% `, N: H; C
  2.   ……
    5 `0 X. K2 F- E1 K! d
  3.   WM_HWIN hWin = CreateWindow();
    : u. |! a* [9 f  p+ T
  4.   while(1) {        . N4 m: h$ U# c: ~# p# t; {
  5.     WM_InvalidateWindow(hWin);3 o+ a$ Q# M& K, B7 n% X: q, x
  6.     GUI_Delay(1000);: \8 y6 H7 _1 D; a8 f* }  M  Y
  7.   }
    6 a$ X; r; z6 X' @/ w0 k) b
  8.   ……
    - o, V8 @+ L% L: @9 \' _6 ^
  9. }
    6 d% B( y2 b$ z, s0 D
复制代码
WindowDLG.c文件中
  1. //引入图片文件
    : T% g0 r' b( ]( H' H
  2. // USER START (Optionally insert additional defines)3 p3 y& M+ o, L0 c, ?
  3. extern GUI_CONST_STORAGE GUI_BITMAP bmbackground;
    6 H9 k0 B. y) s- P$ n* S
  4. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_blue;) T: ]' k1 P8 j! _  V) S5 c
  5. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_green;2 M- m* n2 [5 y% I0 y/ v  J
  6. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_pink;* u* o5 u3 f4 [3 p9 H
  7. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_yellow;
    9 c( e2 ]3 h( N! u  |' L* h
  8. // USER END! G+ \1 v8 J3 r' F% `: j$ d
  9. …….& Z6 r5 E' q3 E3 r" q
  10. //定义图片状态
    + {; U. B% K: ^: [
  11. // USER START (Optionally insert additional static code)+ ]* L/ }  o3 A8 ^0 s
  12.    static int butterflay_status=0;
    , q% k/ m) R& ]! u
  13. // USER END
    + V6 q( }$ u/ R1 K. u3 p: @
  14. ……  d+ P$ C7 m6 I* ^
  15. //修改显示控制. p" P! q& u: y: ^& ]1 c' B
  16. static void _cbDialog(WM_MESSAGE * pMsg) {# @- Y/ H/ i+ I# y7 l  r
  17. ……
    + a# F4 s* i/ _- R/ ]; c
  18. switch (pMsg->MsgId) {. ?# k& U( k. F) D- H
  19.   case WM_INIT_DIALOG:8 t0 j: y: \$ S/ b/ r/ `5 A6 C% x, f
  20.     hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);
    , t8 b$ w, }# [2 J3 B' S
  21.     IMAGE_SetBitmap(hItem, &bmbackground);, @) p' y( b# G9 G7 c; p, ]+ W$ j. ~+ [

  22. # `3 `1 u0 O3 o' a+ W/ b# j) P
  23.     hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    3 l. H* o: C# b# w. L
  24.     IMAGE_SetBitmap(hItem, &bmbutterfly_blue);
    8 {! Z% I( V! h3 y( Y. E- E  P
  25.         
    : `) m5 C2 `4 B' z) O- g
  26.     break;
    7 H' d/ A. g8 ]3 g2 t
  27.   default:3 x1 C; I/ E- \: D
  28.           if (butterflay_status==0){
    9 P% _' }( a# f$ ~) U2 n  o
  29.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);% q$ j( q9 M2 \+ g
  30.                   IMAGE_SetBitmap(hItem, &bmbutterfly_green);' [$ z  Y1 `. V' j5 C3 H9 O
  31.                   butterflay_status=1;
    3 H4 n* ~- k& \. z% Q# s
  32.           }else if (butterflay_status==1){; w; M; _2 Z. `; S! }3 y! L6 U
  33.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    # Y; Y8 A: q6 o) x6 V. [
  34.                   IMAGE_SetBitmap(hItem, &bmbutterfly_pink);5 ?- `/ o, C+ w9 w
  35.                   butterflay_status=2;
    ( e6 Y9 d+ N# X9 R% e
  36.           }else if (butterflay_status==2){: S' e5 x6 d7 y5 b# v$ `; e
  37.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    # Y, X" i1 r( Y% P: d
  38.                   IMAGE_SetBitmap(hItem, &bmbutterfly_yellow);
      [) g# s. ?- d' M
  39.                   butterflay_status=3;7 i3 r# O" h. L
  40.           }else {% Q; |- L# Z" M5 Y& x6 [
  41.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);% \! `& f* g2 B& r3 t. `
  42.                   IMAGE_SetBitmap(hItem, &bmbutterfly_blue);+ G4 j$ w3 d- z0 u/ l1 n0 l: ~- x" ?
  43.                   butterflay_status=0;
    ' ]5 W) s# c, l' }; F. ~
  44.         }5 S/ w0 I$ R; W" ^3 k' B
  45.     WM_DefaultProc(pMsg);; S9 P6 K4 j' l% T% l) I3 W
  46.     break;2 C) \1 K  ]/ G; {
  47.   }5 ^3 U! ~: C# u
  48. }
    : c6 R, x1 |, E8 D
  49. …….
    : l- E$ p  }. j
复制代码

0 d  W) r, K4 ^1 l
编译工程并下载到开发板中,即可实现上面GIF文件所展示的GUI图形显示功能。
4 W) l; o; J9 h" i2 T# t) _. j
在Cubemx、GUIBuilder、BmpCvtST等工具的辅助下,加快了GUI应用的实现。虽然是一个Demo已经完整地展示了图形框架的搭建、素材转换、以及控制逻辑修改等方法流程;对于学习GUI工程实现有很大的帮助;

6 d5 r' c9 C# Q4 ^
6 i" L: }! w; w3 ~+ H9 p
5 Q9 V; h. `( T0 t* {# T! H- V
真正的工程应用会使用其他方法解决Demo中几个问题:
1、占用内部Flash太大;
2、图片的更换需要更新工程代码;
3、可以将STM32F769I的设备引用进来,充分利用硬件的特性;
比如:JPG硬件加速、SD卡设备读取外部文件等等,
GUI这个技术含量颇高的功能已经掌握后,STM32F769IDisco的其他应用拓展正等着诸位前去逐一熟悉。
+ {) z. D4 M5 g; h: y9 H- h# k# `) D2 ~
STM32F769I-DISCO开发板GUI学习内容(一)_课前知识预习4 W3 @/ [* U$ M" o4 V
STM32F769I-DISCO开发板GUI学习内容(二)_课前硬件基础
/ ~) d7 V+ D/ O" l6 n  L8 `STM32F769I-DISCO开发板GUI学习内容(三)_课前预习之CubeMX篇(上)4 }) H8 s5 j1 z
STM32F769I-DISCO开发板GUI学习内容(三)_课前预习之CubeMX篇(下)
& E, A2 |5 I- \, \: [; ?2 _
收藏 评论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 手机版