在STM32U599J-DK开发板上,有两个用户可以控制的LED:
这篇分享,结合屏幕,对这两个LED进行控制。
一、TouchGFX界面设计
首先,在TouchGFX中,新建一个项目:
并选择对应的开发板:
然后,准备一张背景图片:
图片大小为480x480的,对应屏幕大小。
在TouchGFX中,进入到Images管理,添加图片:
然后,在Screen界面,添加这个图片做为背景图:
再添加两个按钮,用于控制两个LED:
再给两个按钮,都设置好点击调用:
设计过程中,随时可以点击右下角中间的按钮,进行模拟测试:
设计完成后,点击右下角的左边,生成代码:
然后,点击左则的 Files,即可打开生成后的代码和项目目录:
项目目录如下:
其中包含了STM32CubeIDE和Keil等编辑器的项目文件。
二、代码编写
我使用STM32CubeIDE进行开发,直接进入下面的目录打开即可:
TouchGFX采用了类似MVC的MVP开发模式:
生成的界面处理部分代码,和我们逻辑功能部分的代码,是分离的。
通过这样的方式,界面可以继续修改,不对我们实际逻辑处理的代码产生影响。
在生成的Screen1ViewBase.cpp文件中,有界面处理的实际代码:
在这个文件的头部,提示了,不要修改这个文件。除非,后续不再使用TouchGFX进一步修改设计了。
上述代码中,包含了按键调用的设置:
toggleButton_red.setAction(buttonCallback);
toggleButton_green.setAction(buttonCallback);
点击后,调用该文件中定义的回调:
void Screen1ViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)
{
if (&src == &toggleButton_green)
{
//Interaction_green
//When toggleButton_green clicked call virtual function
//Call ToggleLED_green
ToggleLED_green();
}
if (&src == &toggleButton_red)
{
//Interaction_red
//When toggleButton_red clicked call virtual function
//Call ToggleLED_red
ToggleLED_red();
}
}
在该回调中,通过判断点击来源,确定调用具体的处理逻辑函数。
根据界面的设置,需要在Screen1View.hpp中生命对应的逻辑处理函数:
然后在Screen1View.cpp中,编写具体的实现:
#include <gui/screen1_screen/Screen1View.hpp>
#ifndef SIMULATOR
#include "stm32u5xx_hal.h"
#endif
Screen1View::Screen1View()
{
}
void Screen1View::setupScreen()
{
Screen1ViewBase::setupScreen();
}
void Screen1View::tearDownScreen()
{
Screen1ViewBase::tearDownScreen();
}
void Screen1View::ToggleLED_green()
{
#ifndef SIMULATOR
if(toggleButton_green.getState())
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_RESET);//LD2蓝灯亮
在上述代码中,使用了 SIMULATOR 宏定义来判断是否处于模拟器模式。如果不加处理,则使用模拟器运行,可能会出错。
三、实际效果:
编写完成后,编译下载,最终效果如下:
|