[STM32H7] STM32H750B-DK TouchGFX 测评——应用篇

[复制链接]
1101|7
 楼主| 纪国圣 发表于 2022-8-28 11:51 | 显示全部楼层 |阅读模式
本帖最后由 纪国圣 于 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:
1.PNG
之后新建一个Screen,命名为Hello,并添加一个AnimatedImage。按照下图顺序设置AnimatedImage:
2.PNG
为了实现开机动画效果,即GIF播放完毕后实现界面切换,还需一下设置:
3.png
注意点:在对图片标号时,一开始我的标号顺序是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简介:
界面效果如下:
4.PNG
这里介绍一下scrollwheel的使用。
首先点击Containers,然后添加一个Container并命名为ImageWheel。再其基础上添加Image控件。然后按照下图设置srcollwheel: 5.PNG
回到MainWindow界面,添加之前创建的container:
6.PNG
注意:MainWindow中的Scroll与Comtainer中的属性值必须一致。
打开TouchGFX\gui\include\gui\container\ImageWheel.hpp,添加红色的代码:
  1. #include <gui_generated/containers/ImageWheelBase.hpp>
  2. <font color="#ff0000">#include <BitmapDatabase.hpp></font>

  3. class ImageWheel : public ImageWheelBase
  4. {
  5. public:
  6.     ImageWheel();
  7.     virtual ~ImageWheel() {}

  8.     virtual void initialize();
  9.         
  10. <font color="#ff0000">        void setIcon(int16_t itemIndex)
  11.         {
  12.                 switch (itemIndex)
  13.                 {
  14.                 case 0:icon.setBitmap(Bitmap(BITMAP_ICON1_ID));
  15.                         break;
  16.                 case 1:icon.setBitmap(Bitmap(BITMAP_ICON2_ID));
  17.                         break;
  18.                 case 2:icon.setBitmap(Bitmap(BITMAP_ICON3_ID));
  19.                         break;
  20.                 case 3:icon.setBitmap(Bitmap(BITMAP_ICON4_ID));
  21.                         break;
  22.                 case 4:icon.setBitmap(Bitmap(BITMAP_ICON5_ID));
  23.                         break;
  24.                 }
  25.         }</font>
  26. protected:
  27. };
打开TouchGFX\gui\include\gui\mainwindow_screen\MainWindowView.hpp,添加红色的代码:
  1. #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
  2. <font color="#ff0000">#include <gui/mainwindow_screen/MainWindowPresenter.hpp>
  3. </font>
  4. class MainWindowView : public MainWindowViewBase
  5. {
  6. public:
  7.     MainWindowView();
  8.     virtual ~MainWindowView() {}
  9.     virtual void setupScreen();
  10.     virtual void tearDownScreen();

  11. <font color="#ff0000">        virtual void scrollWheel1UpdateItem(ImageWheel& item, int16_t itemIndex)
  12.         {
  13.                 item.setIcon(itemIndex);
  14.                
  15.                 image1.setXY(0,0);
  16.                 switch (itemIndex)
  17.                 {
  18.                 case 0:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND3_ID));
  19.                         break;
  20.                 case 1:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND4_ID));
  21.                         break;
  22.                 case 2:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND5_ID));
  23.                         break;
  24.                 case 3:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND6_ID));
  25.                         break;
  26.                 case 4:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND_ID));
  27.                         break;
  28.                 }
  29.                
  30.                 image1.invalidate();</font>
  31.                
  32.         }
  33. protected:
  34. };
scrollwheel的设置就算完成了。通过拨动scroollwhell可以实现背景图片的切换。
3.ClockWindow与SetTimeWindow简介:
界面效果如下: 7.PNG
9.PNG
这里简单的说明一下Clock控件的使用。
界面中包含了AnalogClock和DigtalClock,而提供时钟数据的是STM32H750的RTC。首先编写RTC的初始化、设置与读取函数:

  1. unsigned char hour;
  2. unsigned char minutes;
  3. unsigned char second;

  4. void RTC_Set(unsigned char hour,unsigned char minutes,unsigned char second)
  5. {
  6. #ifdef SIMULATOR

  7. #else
  8.   RTC_DateTypeDef  sdatestructure;
  9.   RTC_TimeTypeDef  stimestructure;

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

  16.   if(HAL_RTC_SetDate(&hrtc,&sdatestructure,RTC_FORMAT_BCD) != HAL_OK)
  17.   {
  18.     /* Initialization Error */
  19.     Error_Handler();
  20.   }

  21.   /*##-2- Configure the Time #################################################*/
  22.   /* Set Time: 16:30:00 */
  23.   stimestructure.Hours = hour;
  24.   stimestructure.Minutes = minutes;
  25.   stimestructure.Seconds = second;
  26.   stimestructure.TimeFormat = RTC_HOURFORMAT_24;
  27.   stimestructure.DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
  28.   stimestructure.StoreOperation = RTC_STOREOPERATION_RESET;

  29.   if(HAL_RTC_SetTime(&hrtc,&stimestructure,RTC_FORMAT_BCD) != HAL_OK)
  30.   {
  31.     /* Initialization Error */
  32.     Error_Handler();
  33.   }
  34. #endif
  35. }

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

  44. #else
  45.   RTC_DateTypeDef sdatestructureget;
  46.   RTC_TimeTypeDef stimestructureget;

  47.   /* Get the RTC current Time */
  48.   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  49.   /* Get the RTC current Date */
  50.   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
  51.   /* Display time Format : hh:mm:ss */
  52.   hour = stimestructureget.Hours;
  53.   minutes = stimestructureget.Minutes;
  54.   second = stimestructureget.Seconds;
  55. #endif
  56. }

  57. unsigned char Get_Hour(void)
  58. {
  59.         return hour;
  60. }

  61. unsigned char Get_Minutes(void)
  62. {
  63.         return minutes;
  64. }

  65. unsigned char Get_Second(void)
  66. {
  67.         return second;
  68. }
之后按下图所示顺序在Interactions添加Tick触发函数,调用之前编写的RTC控制函数以实现周期性的读取RTC的值:
8.png
同理,对RTC的设置,按照下图顺序设置即可:
10.png
4.OSCWindow界面简介
界面效果如下:
11.PNG
其实现效果为滑动Slider改变正弦波的频率,同时将不同频率的正弦波相乘并显示在DynamicGraph。
Slider滑动效果设置如下:
12.png
使用Tick周期获取正弦数值:
13.png
关于DynamicGraph的设置如下:
14.PNG
15.png
图14中的1是为了给YLabel让出空间,图15中的2-5为YLabel的设置。
图14中的3、4设置曲线显示范围。
图15中的1为曲线种类设置。
至此DynamicGraph的设置完成。
5.AboutWindow界面简介
界面效果如下:
16.PNG
与OSCWindow类似,通过周期调用编写好的ADC控制函数读取D值并显示在Graph中:
17.png
ADC函数如下:

  1. unsigned short Get_ADC(void)
  2. {
  3.         unsigned short uwConvertedValue = 0;

  4. #ifdef SIMULATOR

  5. #else       
  6.         /* Start ADC conversion */
  7.         if (HAL_ADC_Start(&hadc3) != HAL_OK)
  8.         {
  9.         Error_Handler();
  10.         }  

  11.         if (HAL_ADC_PollForConversion(&hadc3, 10) != HAL_OK)
  12.         {
  13.           Error_Handler();
  14.         }

  15.         /* Read the converted value */
  16.         uwConvertedValue = HAL_ADC_GetValue(&hadc3);
  17.        
  18.         HAL_ADC_Stop(&hadc3);
  19. #endif       
  20.         return uwConvertedValue;
  21. }

  22. float Get_Vint(void)
  23. {
  24. #ifdef SIMULATOR
  25.         return 0;
  26. #else       
  27.   ADC_ChannelConfTypeDef sConfig = {0};

  28.   /** Configure Regular Channel
  29.   */
  30.   sConfig.Channel = ADC_CHANNEL_VREFINT;
  31.   sConfig.Rank = ADC_REGULAR_RANK_1;
  32.   sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  33.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  34.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  35.   sConfig.Offset = 0;
  36.   sConfig.OffsetSignedSaturation = DISABLE;
  37.   if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  38.   {
  39.     Error_Handler();
  40.   }
  41.   
  42.   return (*(__IO uint32_t *)0x1FF1E860)*3.3f/Get_ADC();
  43. #endif       

  44. }



  45. float Get_Temp(void)
  46. {
  47. #ifdef SIMULATOR
  48.         return 0;
  49. #else       
  50.   const unsigned short t1 = *(__IO uint32_t *)0x1FF1E820;
  51.   const unsigned short t2 = *(__IO uint32_t *)0x1FF1E840;
  52.   
  53.   ADC_ChannelConfTypeDef sConfig = {0};

  54.   /** Configure Regular Channel
  55.   */
  56.   sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  57.   sConfig.Rank = ADC_REGULAR_RANK_1;
  58.   sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  59.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  60.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  61.   sConfig.Offset = 0;
  62.   sConfig.OffsetSignedSaturation = DISABLE;
  63.   if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  64.   {
  65.     Error_Handler();
  66.   }
  67.   
  68.   return 100.0f/(t2 - t1)*(Get_ADC() - t1) + 30.0f;
  69. #endif       

  70. }
背光控制是通过如下设置实现:
18.png

  1. void Toggle_BL(void)
  2. {
  3. #ifdef SIMULATOR

  4. #else
  5.         HAL_GPIO_TogglePin(LCD_BL_CTRL_GPIO_Port, LCD_BL_CTRL_Pin);
  6. #endif
  7. }




 楼主| 纪国圣 发表于 2022-9-4 11:30 | 显示全部楼层
本帖最后由 纪国圣 于 2022-9-4 11:35 编辑

失败的Video尝试首先添加Video控件并添加视频:. 6838263141768cec66.png 然后在CubeMX使能JPEG等:
20.png
21.png
22.png
为了解决工程生成后video_washer_bin_start[]未定义地址的情况,从官方例程中找到了该视频的数组函数并重新定义地址:
5130763141ac11ec56.png
编译下载,结果死机了。
修改STM32H750XBHX_FLASH.ld,增大HEAP与STACK的值:
9094263141b17b823d.png
编译下载,不死机了,但是没视频出现。
@香水城
请问我这里有什么地方设置不正确。















shimx 发表于 2022-9-4 23:16 | 显示全部楼层
看不了,是我网页设置问题吗
minzisc 发表于 2022-9-8 13:57 | 显示全部楼层
touchgfx要收费吗
aspoke 发表于 2022-9-8 19:51 | 显示全部楼层
stm32h750的发热量很大,怎么解决的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

407

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部