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

【经验分享】stm32基于TouchGFX的GUI开发(一):创建第一个你自己的应用程序

[复制链接]
STMCU小助手 发布时间:2022-3-11 22:07
一、TouchGFX安装
1.从stm32Cubemx下载TouchGFX

LI7%0~60RX%C]4AE5ARO140.png

2.找到下载路径

这个路径是可以更改的,默认在C盘。
在stm32Cubemx的上方工具栏里依次选择Help->Updater settings(快捷键Alt+S)找到touchGFX的下载目录。

I9(4H$LMJDHG@NED%V6U9.png

3.为MDK5安装touchGFX插件
找到MDK5的TouchGFX安装包位置,具体位置在第2步的Packs文件夹下。...\Packs\STMicroelectronics\X-CUBE-TOUCHGFX\4.15.0\STMicroelectronics.X-CUBE-TOUCHGFX.4.15.0.exe

`(FD5HJXUTMHF]1)4I$UAWS.png

安装完成后可以在 keil5的Pack Installer里看到已经安装好了。

}9VCZEDW6]U_G]}9))9MW16.png

4.安装touchGFX
安装包目录:...\Packs\STMicroelectronics\X-CUBE-TOUCHGFX\4.15.0\Utilities\PC_Software\TouchGFXDesigner\TouchGFX-4.15.0.exe。
也是在第2步的下载目录下。

KY$NKA6$}PQGPZIW}IFVL.png

至此,安装工作已经完成。

二、创建第一个示例工程
1.创建工程

创建工程,选择Blank UI,并设置你需要的屏幕大小。这里屏幕设置为480*272

9(5C}W07Y_4B4O6WFLIJ4}S.png

2.添加背景
1、TouchGFX 应用程序由多个屏幕组成。屏幕包含许多组成用户界面的小部件。屏幕覆盖整个显示器,因此一次只向用户显示一个屏幕。要做的第一件事是将初始屏幕的名称更改为Main,如下图所示。这样做的目的是以后有多屏幕应用的时候可以很好区分,对于程序维护和开发来说非常适合。
2、通常,用Box或Image给屏幕添加一个背景。此例子中,我们将使用Image给屏幕添加一个背景。TouchGFX支持BMP和PNG,尽量使用PNG,因为PNG更小而且支持透明度

D{0[W~(1C8%VZHO`TGPJY%9.png

工具栏左侧点击Add Widget 选择添加一个Image插件,同时别忘记更改控件名称

R983JF_(PV~(_FUPA~S1CJP.png

1、选择"Image"选项卡并单击蓝色加号图标。
2、找到下载的图片素材并选择"background.png",为了防止重复工作把其他需要的图片一起添加进去。可以多选一起添加。
3、导入后左侧会显示添加的图片

~7GND2E_}OJWXXHRVA$WS{0.png

1、回到画布视图
2、右侧选择image给控件添加背景图片

(5774B@TG(P$Z1Q6A_6S[FN.png

3.添加按钮
1、单击"小部件"选项卡中的"按钮"小部件,向屏幕添加两个按钮,并更改名字为        ButtonUp和ButtonDown
2、ButtonUp定位在 x=40,y=60。
3、ButtonDown定位在 x=40,y=150。

%NRD@M{ND[AM2VS3YPF1K%C.png

更改按钮的外观。在右侧更改按钮松开和按下时的背景图片。

5ZZ6F4~0XHWWJ7E1~UH{GBF.png

添加完成后,运行simulator,在PC模拟一下界面是否有问题。

OFKIO`80)`PZJ@__)JHL]{Y.png

4.添加文本
1、添加一个Image 控件
2、给它添加背景图片"counter_box.png"
3、坐标:x=250,y=59。
4、名字改为:counter_box

I6USASCDW9UZ2`TXB_EHQ[V.png

1、添加文本控件
2、坐标:x=250,y=90
3、右侧AutoSize取消勾选,设置W=152  H=90(必须先取消Autosize否则没法改宽度和高度)
4、名字设置countTxt
5、对其方式设置:center

XQ4NVSCN4EO3BD]$_6Q]3`G.png

按照下图设置TextArea的字体

E]81D{R~HO`WQ7QRQN_`WQ4.png

我们希望 TextArea 显示一个数字,我们可以用按钮更改该数字。
为此,更改文本以包括"通配符"。通配符是文本中的标记<d>,在运行时用其他内容替换。我们只想显示一个数字,因此我们
将文本更改为"<d>"。在其他项目中,可以将动态部件与固定文本相结合,例如"温度:<temp> °C"。另外,<...> 通配符是可选的。
1、添加通配符
2、设置通配符符号
3、设置初始化值
4、设置buffer

69(4E%3(}{I76]Z48PFHHP9.png

运行模拟器

LID)QQ]SUNOFY`%2S@_96_Q.png

5.添加代码
我们将创建两个InterActions,每个按钮一个。
1、添加交互
2、设置触发方式
3、设置触发源
4、设置触发时调用虚函数
5、增加虚函数名称,方便区分维护
6、为"交互"提供信息性名称,以便以后可以识别它,也可以默认不修改它

0`D6LWZ$V2HX(LH{B`4)C(7.png

检查无误后点击右上角Generate Code生成代码

%R552XCLPDLRHJACJY[IC7R.png

然后依次找到simulator\msvs\Application.sln并打开代码

2WGHQG63~PKUR[`EHISDR[B.png

直接编译工程或者按快捷键F5,中间有任何提示均选择是。

]$G8~3OP]N1W$ZW]8~O%~X7.png

最终结果和TouchGfx仿真结果一样

8$`]S7Q2FUUN3%T%H~WC3FF.png

6.生成的代码
虚方法位于类MainViewBase.hpp的公共部分。生成的方法具有空实现,需要重写。此文件不要更改,有touchGFX自动生成

  1. /*********************************************************************************/
  2. /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
  3. /*********************************************************************************/
  4. #ifndef MAINVIEWBASE_HPP
  5. #define MAINVIEWBASE_HPP

  6. #include <gui/common/FrontendApplication.hpp>
  7. #include <mvp/View.hpp>
  8. #include <gui/main_screen/MainPresenter.hpp>
  9. #include <touchgfx/widgets/Box.hpp>
  10. #include <touchgfx/widgets/Image.hpp>
  11. #include <touchgfx/widgets/Button.hpp>
  12. #include <touchgfx/widgets/TextAreaWithWildcard.hpp>

  13. class MainViewBase : public touchgfx::View<MainPresenter>
  14. {
  15. public:
  16.     MainViewBase();
  17.     virtual ~MainViewBase() {}
  18.     virtual void setupScreen();

  19.     /*
  20.      * Virtual Action Handlers
  21.      */
  22.     virtual void ButtonUpClick()
  23.     {
  24.         // Override and implement this function in Main
  25.         //需要重写
  26.     }

  27.     virtual void ButtonDownClick()
  28.     {
  29.         // Override and implement this function in Main
  30.         //需要重写
  31.     }

  32. protected:
  33.     FrontendApplication& application() {
  34.         return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());
  35.     }

  36.     /*
  37.      * Member Declarations
  38.      */
  39.     touchgfx::Box __background;
  40.     touchgfx::Image Background;
  41.     touchgfx::Button ButtonUp;
  42.     touchgfx::Button ButtonDown;
  43.     touchgfx::Image counter_box;
  44.     touchgfx::TextAreaWithOneWildcard countTxt;

  45.     /*
  46.      * Wildcard Buffers
  47.      */
  48.     static const uint16_t COUNTTXT_SIZE = 10;
  49.     touchgfx::Unicode::UnicodeChar countTxtBuffer[COUNTTXT_SIZE];

  50. private:

  51.     /*
  52.      * Callback Declarations
  53.      */
  54.     touchgfx::Callback<MainViewBase, const touchgfx::AbstractButton&> buttonCallback;

  55.     /*
  56.      * Callback Handler Declarations
  57.      */
  58.     void buttonCallbackHandler(const touchgfx::AbstractButton& src);

  59. };

  60. #endif // MAINVIEWBASE_HPP
复制代码

7.实现虚方法
  1. 在MainView.hpp中手动增加虚方法声明
  2. virtual void ButtonUpClick();//添加
  3. virtual void ButtonDownClick();//添加
复制代码
  1. #ifndef MAIN_VIEW_HPP
  2. #define MAIN_VIEW_HPP

  3. #include <gui_generated/main_screen/MainViewBase.hpp>
  4. #include <gui/main_screen/MainPresenter.hpp>

  5. class MainView : public MainViewBase
  6. {
  7. public:
  8.   MainView();
  9.   virtual ~MainView() {}
  10.   virtual void setupScreen();
  11.   virtual void tearDownScreen();
  12.   virtual void ButtonUpClick();//添加
  13.   virtual void ButtonDownClick();//添加
  14. }
复制代码

然后在MainView.cpp中增加ButtonUp和ButtonDown按下时打印提示

  1. #include <gui/main_screen/MainView.hpp>

  2. MainView::MainView()
  3. {

  4. }

  5. void MainView::setupScreen()
  6. {
  7.   MainViewBase::setupScreen();
  8. }

  9. void MainView::tearDownScreen()
  10. {
  11.   MainViewBase::tearDownScreen();
  12. }

  13. void MainView::ButtonUpClick()
  14. {
  15.         touchgfx_printf("buttonUpClicked\n");
  16. }

  17. void MainView::ButtonDownClick()
  18. {
  19.         touchgfx_printf("buttonDownClicked\n");
  20. }
复制代码

~B6YP19I$_UULX(O$}{3P63.png

在MainView.cpp的按键按下方法中,我们增加计数器值。然后,新值将转换为字符串,并复制到我们为上一步中的文本配置的 10 个字符缓冲区。

  1. #include <gui/main_screen/MainView.hpp>

  2. MainView::MainView()
  3. {

  4. }

  5. void MainView::setupScreen()
  6. {
  7.     MainViewBase::setupScreen();
  8. }

  9. void MainView::tearDownScreen()
  10. {
  11.     MainViewBase::tearDownScreen();
  12. }
  13. void MainView::ButtonUpClick()
  14. {
  15.         touchgfx_printf("buttonUpClicked\n");
  16.         counter++;
  17.         Unicode::snprintf(countTxtBuffer, COUNTTXT_SIZE, "%d", counter);
  18.         countTxt.invalidate();
  19. }

  20. void MainView::ButtonDownClick()
  21. {
  22.         touchgfx_printf("buttonDownClicked\n");
  23.         counter--;
  24.         Unicode::snprintf(countTxtBuffer, COUNTTXT_SIZE, "%d", counter);
  25.         countTxt.invalidate();
  26. }
复制代码

运行发现并没有按预期显示数字

(}XCM(ERCQV_JMR9ZR{1(JS.png

我们需要告诉 TouchGFX 设计器在"默认"排版中包含字符 0-9。
为此,请返回 TouchGFX 设计器,然后单击"Text"选项卡,然后单击"Typographies"选项卡。在默认排版"WildCard Ranges"列中,添加范围"0-9"。为了能表示负数还需要在WildCard characters 添加负号“-”。

3~HB2Q@BUR`SX46Z{SZYT~K.png

重新运行发现实现了我们预期的功能

%`@DB~O2W@Y4`AMI36IX[21.png

至此,我们已经完成了第一个实例。



收藏 1 评论0 发布时间:2022-3-11 22:07

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版