本帖最后由 damiaa 于 2024-11-4 08:30 编辑
【STM32H7S78-DK】 四 下载失败问题及解决、计数器实现及分析
一、 在测试和调试一个计数器的程序的时候发现下载不行,查看是连接不上ST-link V3了 如下:
但上次下的还是在显示屏上显示。
使用STM32CubeProgrammer连接也是连接不上:
发现这些问题后想想直接在复位时连接stlink接口IO,看行不行,如是还是用STM32CubeProgrammer连接 同时按板子复位键。连上 了还能读和擦除。
用同样的方法(在touchgfx下载程序时按复位),touchgfx designer 下载页可以了,
二、下面看看这个计数器的例子
从箭头哪里两个点 的地方进去可以编辑源代码
我们一般关注下面几个文件
MainViewBase.hpp和MainViewBase.cpp是touchgfx designer产生的文件,里面包含了基本的类和实现。
MainViewBase.hpp:
/*********************************************************************************/
/********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
/*********************************************************************************/
#ifndef MAINVIEWBASE_HPP
#define MAINVIEWBASE_HPP
#include <gui/common/FrontendApplication.hpp>
#include <mvp/View.hpp>
#include <gui/main_screen/MainPresenter.hpp>
#include <touchgfx/widgets/Box.hpp>
#include <touchgfx/widgets/Image.hpp>
#include <touchgfx/widgets/TextAreaWithWildcard.hpp>
#include <touchgfx/widgets/Button.hpp>
class MainViewBase : public touchgfx::View<MainPresenter>
{
public:
MainViewBase();
virtual ~MainViewBase();
virtual void setupScreen();
/*
* Virtual Action Handlers
*/
virtual void increaseValue()
{
// Override and implement this function in Main
}
virtual void decreaseValue()
{
// Override and implement this function in Main
}
protected:
FrontendApplication& application() {
return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());
}
/*
* Member Declarations
*/
touchgfx::Box __background;
touchgfx::Image backgroundImage;
touchgfx::Image counterBackgroundImage;
touchgfx::TextAreaWithOneWildcard countTxt;
touchgfx::Button buttonUp;
touchgfx::Button buttonDown;
/*
* Wildcard Buffers
*/
static const uint16_t COUNTTXT_SIZE = 5;
touchgfx::Unicode::UnicodeChar countTxtBuffer[COUNTTXT_SIZE];
private:
/*
* Callback Declarations
*/
touchgfx::Callback<MainViewBase, const touchgfx::AbstractButton&> buttonCallback;
/*
* Callback Handler Declarations
*/
void buttonCallbackHandler(const touchgfx::AbstractButton& src);
};
#endif // MAINVIEWBASE_HPP
MainViewBase.cpp
/*********************************************************************************/
/********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
/*********************************************************************************/
#include <gui_generated/main_screen/MainViewBase.hpp>
#include <touchgfx/Color.hpp>
#include <images/BitmapDatabase.hpp>
#include <texts/TextKeysAndLanguages.hpp>
MainViewBase::MainViewBase() :
buttonCallback(this, &MainViewBase::buttonCallbackHandler)
{
__background.setPosition(0, 0, 800, 480);
__background.setColor(touchgfx::Color::getColorFromRGB(0, 0, 0));
add(__background);
backgroundImage.setXY(150, 120);
backgroundImage.setBitmap(touchgfx::Bitmap(BITMAP_BG_ID));
add(backgroundImage);
counterBackgroundImage.setXY(400, 152);
counterBackgroundImage.setBitmap(touchgfx::Bitmap(BITMAP_COUNTER_BOX_ID));
add(counterBackgroundImage);
countTxt.setPosition(316, 189, 302, 104);
countTxt.setColor(touchgfx::Color::getColorFromRGB(255, 255, 255));
countTxt.setLinespacing(4);
Unicode::snprintf(countTxtBuffer, COUNTTXT_SIZE, "%s", touchgfx::TypedText(T___SINGLEUSE_XERM).getText());
countTxt.setWildcard(countTxtBuffer);
countTxt.setTypedText(touchgfx::TypedText(T_TEXTID1));
add(countTxt);
buttonUp.setXY(169, 173);
buttonUp.setBitmaps(touchgfx::Bitmap(BITMAP_UP_BTN_ID), touchgfx::Bitmap(BITMAP_UP_BTN_PRESSED_ID));
buttonUp.setAction(buttonCallback);
add(buttonUp);
buttonDown.setXY(169, 265);
buttonDown.setBitmaps(touchgfx::Bitmap(BITMAP_DOWN_BTN_ID), touchgfx::Bitmap(BITMAP_DOWN_BTN_PRESSED_ID));
buttonDown.setAction(buttonCallback);
add(buttonDown);
}
MainViewBase::~MainViewBase()
{
}
void MainViewBase::setupScreen()
{
}
void MainViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)
{
if (&src == &buttonUp)
{
//IncreaseValue
//When buttonUp clicked call virtual function
//Call increaseValue
increaseValue();
}
if (&src == &buttonDown)
{
//DecreaseValue
//When buttonDown clicked call virtual function
//Call decreaseValue
decreaseValue();
}
}
MainView.hpp和MainView.cpp是touchgfx designer产生的文件,里面包含了用户可以修改的类和实现,是继承了上面两个文件里面实现的基类。
MainView.hpp:
#ifndef MAIN_VIEW_HPP
#define MAIN_VIEW_HPP
#include <gui_generated/main_screen/MainViewBase.hpp>
#include <gui/main_screen/MainPresenter.hpp>
class MainView : public MainViewBase
{
public:
MainView();
~MainView() {};
virtual void setupScreen();
virtual void increaseValue();
virtual void decreaseValue();
void updateGFXElements();
protected:
private:
uint32_t count;
};
#endif // MAIN_VIEW_HPP
MainView.cpp:
#include <gui/main_screen/MainView.hpp>
#include "BitmapDatabase.hpp"
const uint32_t UPPER_LIMIT = 9999;
const uint32_t LOWER_LIMIT = 0;
MainView::MainView() : count(0) {}
void MainView::setupScreen()
{
updateGFXElements();
}
void MainView::increaseValue()
{
count = (count++ > UPPER_LIMIT) ? UPPER_LIMIT : count;
updateGFXElements();
}
void MainView::decreaseValue()
{
count = (count-- <= LOWER_LIMIT) ? LOWER_LIMIT : count;
updateGFXElements();
}
void MainView::updateGFXElements()
{
//Counter text area GFX uptade.
Unicode::snprintf(countTxtBuffer, 5, "%d", count);
//Button GFX update and touchable.
if (count < UPPER_LIMIT)
{
buttonUp.setBitmaps(Bitmap(BITMAP_UP_BTN_ID), Bitmap(BITMAP_UP_BTN_PRESSED_ID));
buttonUp.setTouchable(true);
}
else
{
buttonUp.setBitmaps(Bitmap(BITMAP_UP_BTN_DISABLED_ID), Bitmap(BITMAP_UP_BTN_DISABLED_ID));
buttonUp.setTouchable(false);
}
if (count > LOWER_LIMIT)
{
buttonDown.setBitmaps(Bitmap(BITMAP_DOWN_BTN_ID), Bitmap(BITMAP_DOWN_BTN_PRESSED_ID));
buttonDown.setTouchable(true);
}
else
{
buttonDown.setBitmaps(Bitmap(BITMAP_DOWN_BTN_DISABLED_ID), Bitmap(BITMAP_DOWN_BTN_DISABLED_ID));
buttonDown.setTouchable(false);
}
// Invalidate all GFX area, which will result in it being redrawn in next tick.
countTxt.invalidate();
buttonUp.invalidate();
buttonDown.invalidate();
}
为了把显示放的位置放到中间 并且显示数字可以9999以下,修改了几个地方
1,MainviewBase.hpp的基类中修改了这里,目的是把缓冲区变大,能存5个字节 :(这个文件一般用户代码不怎么修改一般由touchgfx designer修改,但我这里是借用的例子,就直接修改了)
2,修改下面MainviewBase.cpp
3,修改Mainview.hpp的uint8_t count uint32_t count
4,修改Mainview.cpp的UPPER_LIMIT为9999
5,代码浅释:
Mainview.hpp中定义了继承于MainViewBase 的MainView 类
主要定义了虚函数 设置屏幕、值加减、和图片更新函数和变量count
class MainView : public MainViewBase
{
public:
MainView();
~MainView() {};
virtual void setupScreen();
virtual void increaseValue();
virtual void decreaseValue();
void updateGFXElements();
protected:
private:
uint32_t count;
};
Mainview.cpp中定义了这些函数的实现
increaseValue()和decreaseValue()分别实现加数和减数,并且调用updateGFXElements();进行界面数据和按键背景更新。
界面设置中对显示countTxt的页面进行了下面的设置
所以在updateGFXElements()函数中使用
Unicode::snprintf(countTxtBuffer, 5, "%d", count);
能对countTxt的内容进行更新
updateGFXElements()函数页对数值的大小进行了限制,而且重新设置了按键的背景图片。
最后让countTxt和buttonUp和buttonDown失效,这样就能实现重画而更新界面。
count实现count变量的初始化。
好,先分析到这里。
谢谢