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

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

[复制链接]
wolfgang 发布时间:2018-7-21 12:00
本帖最后由 wolfgang2015 于 2018-7-21 12:06 编辑 9 H4 I4 {! s1 N6 d

3 m  _+ |: }* b
在之前的LTDC、DSIHOST、FMC、图形中间件搭建环境好并验证成功之后,要实现图形化还需要很便捷的图形界面实现工具,加速图形应用的开发,下面这个动画,不断切换蝴蝶颜色的案例,怎么做呢?
Viedo1_0_20180721093657.gif
                              
培训视频中的方法:
  就是将图片调入内存中,不断切换图片局部的图形内容来实现;
工具呢?还用emWin一行一行代码写并作下载调试?有没有所见即所得的方法?一次下载就能完成?
答案是有,ST官方已经集成在CubeMX中,并以Lib文件形式免费使用
0 {. K$ i* P  q- D  v
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) {
    / K- `  H. j5 O# _, c( K/ m
  2.   ......
    * s# W5 v0 r! p  E! _
  3.   CreateWindow();
    ! P& Q. c/ M& V
  4.   ......& g: x1 Q- X3 Q; U
  5. }
    + s# x, U# ^& p  _' s; S
复制代码
CreateWindow调用实体在新保存WindowDLG.c文件中,emWin GUIBuilder已经将电脑中编辑的图形界面,生成可由编译工具编译的C代码。这里图形环境的框架就在Cubemx和emWin GUIBuilder的帮助下搭建好了。要实现上边视频的内容,就要对框架中的内容进行素材填充和逻辑代码调整。

& \8 F! y# k, m2 r4 ]' C' n% z

1 \6 e8 l2 v* q% {
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

$ U2 Q& W; H9 b3 q# @& b: m! X" s
分别用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

- |& Z2 ?2 S4 a7 n8 A$ ]
这是素材转换就准备好了,为什么格式不一样可以同时使用?这里的答案已经在直播视频中,请诸位在直播中去寻找。

8 Y/ h& M  n. z6 n# i3 h2 n# l, Y! Y

* X' }6 \% B2 b& w7 O% N
3)控制逻辑修改
用IDE打开工程,把对应的C代码引入工程中
72.jpg
修改STemWin/APP如下文件的内容:
73.jpg

% ~  J/ O0 R5 r! z
修改后的内容分别如下:
GUI_APP.c文件中
  1. void GRAPHICS_MainTask(void) {
    ! W3 [7 H9 G1 a9 n0 Z1 V
  2.   ……+ @# B# d6 ^1 m
  3.   WM_HWIN hWin = CreateWindow();+ _$ K5 G2 X, v5 U1 m2 i
  4.   while(1) {        : W- R8 G- S/ s9 h/ @! y
  5.     WM_InvalidateWindow(hWin);
    $ e9 x7 ~4 }9 l* m4 p- H' Q& n
  6.     GUI_Delay(1000);
    - o$ K$ n. a, t  C9 w
  7.   }
    8 n. r7 H) N) |  F2 a/ B0 q
  8.   ……
    ) U. p7 z8 A3 q& T
  9. }
    + j* T! H0 R" a, K8 k
复制代码
WindowDLG.c文件中
  1. //引入图片文件
    # n- L; K6 G* L/ ]) j/ s% G+ W
  2. // USER START (Optionally insert additional defines)
      M" T. P% h" O+ m4 T
  3. extern GUI_CONST_STORAGE GUI_BITMAP bmbackground;
    0 K6 L0 p6 m7 p5 m$ ]
  4. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_blue;4 _9 t0 B4 J2 j; l; {
  5. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_green;
    9 c$ |6 h7 c% }0 J9 Y0 c% b
  6. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_pink;
    0 `( l' e6 M5 m% m( ~
  7. extern GUI_CONST_STORAGE GUI_BITMAP bmbutterfly_yellow;' Q6 m) X$ ^  m1 Q, \+ `  h, m
  8. // USER END
    ; F- A; i0 ?; k/ E
  9. …….
    / {% N+ X# A. I, |# k
  10. //定义图片状态
    ! N. h' E2 x/ t' h
  11. // USER START (Optionally insert additional static code)/ |6 L0 o. g: ~- F0 k
  12.    static int butterflay_status=0;
    / Q) H  k; @9 P. R& m1 S
  13. // USER END9 g) i5 t' c9 _* ]
  14. ……. q3 }8 y3 v. n9 A! [: M  y
  15. //修改显示控制, F! i3 R( O& Y- D
  16. static void _cbDialog(WM_MESSAGE * pMsg) {; ~1 K1 a& U. ~5 M' C
  17. ……3 M8 u1 E: N& S' J4 [( B
  18. switch (pMsg->MsgId) {6 t; o! o$ i( q% G
  19.   case WM_INIT_DIALOG:" j) ~( D+ d5 r" S
  20.     hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);
    ) G+ X+ o, P' w. \: j7 s* y' M
  21.     IMAGE_SetBitmap(hItem, &bmbackground);6 J7 y) ~8 v0 S% u

  22. " g3 Z# c& T5 T9 x
  23.     hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    ) D* Y0 K4 z! Z
  24.     IMAGE_SetBitmap(hItem, &bmbutterfly_blue);
    & f6 J  d& B, D: m
  25.         
    - l5 k0 _& n0 I5 l, m
  26.     break;
    / c: E6 N1 a! \6 G7 u, J
  27.   default:1 Z+ z' a5 V! G* Z& T/ L
  28.           if (butterflay_status==0){
    4 ?4 e+ Y: F+ W$ l9 z# x
  29.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);6 {3 r2 }: |! D& ]: |+ r
  30.                   IMAGE_SetBitmap(hItem, &bmbutterfly_green);3 M: W& t) g" P1 P/ m$ L
  31.                   butterflay_status=1;- S4 s/ c# I# w+ y- a* ~( `
  32.           }else if (butterflay_status==1){& h' N, l& _' e! b+ |2 V8 o
  33.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    / R8 h% C- c/ j& w5 I
  34.                   IMAGE_SetBitmap(hItem, &bmbutterfly_pink);8 P$ X1 J) H. _) Z
  35.                   butterflay_status=2;* y, z) T% w6 A7 M; ?
  36.           }else if (butterflay_status==2){6 ~0 T/ I1 ]+ t- v8 s5 b6 ?
  37.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    / G. g4 A8 n+ e% x4 k- `5 k) F
  38.                   IMAGE_SetBitmap(hItem, &bmbutterfly_yellow);8 _1 p! m$ l3 V( _
  39.                   butterflay_status=3;- V# @6 f4 n( ?% C" o8 u
  40.           }else {
    7 K+ n, q7 i1 e! K
  41.                   hItem=WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);! K! |' E# E/ W5 ~5 k, ]
  42.                   IMAGE_SetBitmap(hItem, &bmbutterfly_blue);# G, W( c5 K& ^; v5 \5 m6 g
  43.                   butterflay_status=0;2 q. G1 c) M6 C/ x& V3 |5 W; v
  44.         }
    & u# ^0 n7 N1 S) s3 Q( r4 z, a1 \5 @' _
  45.     WM_DefaultProc(pMsg);
    : q# \3 @% {0 D- }8 u
  46.     break;" ?2 t8 O% S" q
  47.   }
    6 t( q' n2 `# J2 t* G7 Z( d8 K
  48. }& z" J) J1 I! K3 w5 r5 I
  49. …….
    # }! m- r5 V( h+ W0 n
复制代码

+ N, M5 Z1 z: F! |- z1 U! D
编译工程并下载到开发板中,即可实现上面GIF文件所展示的GUI图形显示功能。
7 Z! w8 L2 ?: C+ J7 P% r3 w: l3 K
在Cubemx、GUIBuilder、BmpCvtST等工具的辅助下,加快了GUI应用的实现。虽然是一个Demo已经完整地展示了图形框架的搭建、素材转换、以及控制逻辑修改等方法流程;对于学习GUI工程实现有很大的帮助;

3 k& l3 `2 d$ t- A

: I1 D) s1 z7 c
2 U# A' ]+ P+ h' \1 @: [
真正的工程应用会使用其他方法解决Demo中几个问题:
1、占用内部Flash太大;
2、图片的更换需要更新工程代码;
3、可以将STM32F769I的设备引用进来,充分利用硬件的特性;
比如:JPG硬件加速、SD卡设备读取外部文件等等,
GUI这个技术含量颇高的功能已经掌握后,STM32F769IDisco的其他应用拓展正等着诸位前去逐一熟悉。
. x" S) d3 e! H4 O3 ^; m- V9 j9 C/ }# z9 X4 u
STM32F769I-DISCO开发板GUI学习内容(一)_课前知识预习
5 j( L8 F; d& U9 ?% J* SSTM32F769I-DISCO开发板GUI学习内容(二)_课前硬件基础
. F& M) P  B0 c* p' O5 j5 [. p. ~4 JSTM32F769I-DISCO开发板GUI学习内容(三)_课前预习之CubeMX篇(上)0 V7 }$ ]) z# m* N7 z! n
STM32F769I-DISCO开发板GUI学习内容(三)_课前预习之CubeMX篇(下)
; \/ N9 K, D5 ^' G" v; ^: c
赞 收藏 评论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 手机版