注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
damiaa的个人空间 https://home.eeworld.com.cn/space-uid-59433.html [收藏] [复制] [分享] [RSS]
日志

【STM32H7S78-DK】 四 下载失败问题及解决、计数器实现及分析

已有 145 次阅读2024-11-3 11:23 |个人分类:STM32

                【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()函数页对数值的大小进行了限制,而且重新设置了按键的背景图片。
最后让countTxtbuttonUpbuttonDown失效,这样就能实现重画而更新界面。
 
好,先分析到这里
谢谢

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章