打印
[STM32H7]

STM32H750B-DK TouchGFX 测评——应用篇

[复制链接]
812|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 纪国圣 于 2022-9-4 11:08 编辑

可切换背景图,曲线合成,硬件RTC的读取与设置,CPU的电压与温度采集与显示,背光的开关控制:
@21小跑堂







使用特权

评论回复
沙发
纪国圣|  楼主 | 2022-8-28 17:41 | 只看该作者

使用特权

评论回复
板凳
纪国圣|  楼主 | 2022-9-4 08:32 | 只看该作者
本帖最后由 纪国圣 于 2022-9-4 10:45 编辑


优化了一下界面,让其效果更好一些。
简单的讲一下四线效果:
1.开机动画:
首先从百度下载一份GIF动图,然后通过网站其他图像文件转换至JPG文件将GIF文件转换成一组JPG图片,然后再跟换图片格式为PNG:

之后新建一个Screen,命名为Hello,并添加一个AnimatedImage。按照下图顺序设置AnimatedImage:

为了实现开机动画效果,即GIF播放完毕后实现界面切换,还需一下设置:

注意点:在对图片标号时,一开始我的标号顺序是a1~a9,a10~a19,a20~a29。以为播放顺序与标号顺序一致,但实际上其播放顺序为a1-a10-a11-......a19-a2-a20-a21-a23-......,所以在标号时a1~a9的编号为a01~a09才能正确的按顺序播放。
建议:官方能否在TouchGFX中添加一个GIF转换为PNG的小工具,或者直接让AnimatedImage支持GIF格式的图片,这样AnimatedImage得使用会更加方便。
2.MainWindow简介:
界面效果如下:

这里介绍一下scrollwheel的使用。
首先点击Containers,然后添加一个Container并命名为ImageWheel。再其基础上添加Image控件。然后按照下图设置srcollwheel:
回到MainWindow界面,添加之前创建的container:

注意:MainWindow中的Scroll与Comtainer中的属性值必须一致。
打开TouchGFX\gui\include\gui\container\ImageWheel.hpp,添加红色的代码:
#include <gui_generated/containers/ImageWheelBase.hpp>
<font color="#ff0000">#include <BitmapDatabase.hpp></font>

class ImageWheel : public ImageWheelBase
{
public:
    ImageWheel();
    virtual ~ImageWheel() {}

    virtual void initialize();
        
<font color="#ff0000">        void setIcon(int16_t itemIndex)
        {
                switch (itemIndex)
                {
                case 0:icon.setBitmap(Bitmap(BITMAP_ICON1_ID));
                        break;
                case 1:icon.setBitmap(Bitmap(BITMAP_ICON2_ID));
                        break;
                case 2:icon.setBitmap(Bitmap(BITMAP_ICON3_ID));
                        break;
                case 3:icon.setBitmap(Bitmap(BITMAP_ICON4_ID));
                        break;
                case 4:icon.setBitmap(Bitmap(BITMAP_ICON5_ID));
                        break;
                }
        }</font>
protected:
};
打开TouchGFX\gui\include\gui\mainwindow_screen\MainWindowView.hpp,添加红色的代码:
#include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
<font color="#ff0000">#include <gui/mainwindow_screen/MainWindowPresenter.hpp>
</font>
class MainWindowView : public MainWindowViewBase
{
public:
    MainWindowView();
    virtual ~MainWindowView() {}
    virtual void setupScreen();
    virtual void tearDownScreen();

<font color="#ff0000">        virtual void scrollWheel1UpdateItem(ImageWheel& item, int16_t itemIndex)
        {
                item.setIcon(itemIndex);
               
                image1.setXY(0,0);
                switch (itemIndex)
                {
                case 0:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND3_ID));
                        break;
                case 1:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND4_ID));
                        break;
                case 2:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND5_ID));
                        break;
                case 3:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND6_ID));
                        break;
                case 4:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND_ID));
                        break;
                }
               
                image1.invalidate();</font>
               
        }
protected:
};
scrollwheel的设置就算完成了。通过拨动scroollwhell可以实现背景图片的切换。
3.ClockWindow与SetTimeWindow简介:
界面效果如下:

这里简单的说明一下Clock控件的使用。
界面中包含了AnalogClock和DigtalClock,而提供时钟数据的是STM32H750的RTC。首先编写RTC的初始化、设置与读取函数:

unsigned char hour;
unsigned char minutes;
unsigned char second;

void RTC_Set(unsigned char hour,unsigned char minutes,unsigned char second)
{
#ifdef SIMULATOR

#else
  RTC_DateTypeDef  sdatestructure;
  RTC_TimeTypeDef  stimestructure;

  /*##-1- Configure the Date #################################################*/
  /* Set Date: Tuesday September 4th 2018 */
  sdatestructure.Year = 0x18;
  sdatestructure.Month = RTC_MONTH_SEPTEMBER;
  sdatestructure.Date = 0x4;
  sdatestructure.WeekDay = RTC_WEEKDAY_TUESDAY;

  if(HAL_RTC_SetDate(&hrtc,&sdatestructure,RTC_FORMAT_BCD) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }

  /*##-2- Configure the Time #################################################*/
  /* Set Time: 16:30:00 */
  stimestructure.Hours = hour;
  stimestructure.Minutes = minutes;
  stimestructure.Seconds = second;
  stimestructure.TimeFormat = RTC_HOURFORMAT_24;
  stimestructure.DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
  stimestructure.StoreOperation = RTC_STOREOPERATION_RESET;

  if(HAL_RTC_SetTime(&hrtc,&stimestructure,RTC_FORMAT_BCD) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
#endif
}

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Display the current time.
  * @param  showtime : pointer to buffer
  * @retval None
  */
void RTC_TimeShow(void)
{
#ifdef SIMULATOR

#else
  RTC_DateTypeDef sdatestructureget;
  RTC_TimeTypeDef stimestructureget;

  /* Get the RTC current Time */
  HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  /* Get the RTC current Date */
  HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
  /* Display time Format : hh:mm:ss */
  hour = stimestructureget.Hours;
  minutes = stimestructureget.Minutes;
  second = stimestructureget.Seconds;
#endif
}

unsigned char Get_Hour(void)
{
        return hour;
}

unsigned char Get_Minutes(void)
{
        return minutes;
}

unsigned char Get_Second(void)
{
        return second;
}
之后按下图所示顺序在Interactions添加Tick触发函数,调用之前编写的RTC控制函数以实现周期性的读取RTC的值:

同理,对RTC的设置,按照下图顺序设置即可:

4.OSCWindow界面简介
界面效果如下:

其实现效果为滑动Slider改变正弦波的频率,同时将不同频率的正弦波相乘并显示在DynamicGraph。
Slider滑动效果设置如下:

使用Tick周期获取正弦数值:

关于DynamicGraph的设置如下:


图14中的1是为了给YLabel让出空间,图15中的2-5为YLabel的设置。
图14中的3、4设置曲线显示范围。
图15中的1为曲线种类设置。
至此DynamicGraph的设置完成。
5.AboutWindow界面简介
界面效果如下:

与OSCWindow类似,通过周期调用编写好的ADC控制函数读取D值并显示在Graph中:

ADC函数如下:

unsigned short Get_ADC(void)
{
        unsigned short uwConvertedValue = 0;

#ifdef SIMULATOR

#else       
        /* Start ADC conversion */
        if (HAL_ADC_Start(&hadc3) != HAL_OK)
        {
        Error_Handler();
        }  

        if (HAL_ADC_PollForConversion(&hadc3, 10) != HAL_OK)
        {
          Error_Handler();
        }

        /* Read the converted value */
        uwConvertedValue = HAL_ADC_GetValue(&hadc3);
       
        HAL_ADC_Stop(&hadc3);
#endif       
        return uwConvertedValue;
}

float Get_Vint(void)
{
#ifdef SIMULATOR
        return 0;
#else       
  ADC_ChannelConfTypeDef sConfig = {0};

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_VREFINT;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  sConfig.OffsetSignedSaturation = DISABLE;
  if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  
  return (*(__IO uint32_t *)0x1FF1E860)*3.3f/Get_ADC();
#endif       

}



float Get_Temp(void)
{
#ifdef SIMULATOR
        return 0;
#else       
  const unsigned short t1 = *(__IO uint32_t *)0x1FF1E820;
  const unsigned short t2 = *(__IO uint32_t *)0x1FF1E840;
  
  ADC_ChannelConfTypeDef sConfig = {0};

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  sConfig.OffsetSignedSaturation = DISABLE;
  if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  
  return 100.0f/(t2 - t1)*(Get_ADC() - t1) + 30.0f;
#endif       

}
背光控制是通过如下设置实现:


void Toggle_BL(void)
{
#ifdef SIMULATOR

#else
        HAL_GPIO_TogglePin(LCD_BL_CTRL_GPIO_Port, LCD_BL_CTRL_Pin);
#endif
}




使用特权

评论回复
地板
纪国圣|  楼主 | 2022-9-4 11:30 | 只看该作者
本帖最后由 纪国圣 于 2022-9-4 11:35 编辑

失败的Video尝试首先添加Video控件并添加视频:. 然后在CubeMX使能JPEG等:



为了解决工程生成后video_washer_bin_start[]未定义地址的情况,从官方例程中找到了该视频的数组函数并重新定义地址:

编译下载,结果死机了。
修改STM32H750XBHX_FLASH.ld,增大HEAP与STACK的值:

编译下载,不死机了,但是没视频出现。
@香水城
请问我这里有什么地方设置不正确。















使用特权

评论回复
5
shimx| | 2022-9-4 23:16 | 只看该作者
看不了,是我网页设置问题吗

使用特权

评论回复
6
minzisc| | 2022-9-8 13:57 | 只看该作者
touchgfx要收费吗

使用特权

评论回复
7
aspoke| | 2022-9-8 19:51 | 只看该作者
stm32h750的发热量很大,怎么解决的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

405

帖子

5

粉丝