[STM32H7] 【STM32H7S78-DK测评】基于TouchGFX搭建汽车G显示副屏

[复制链接]
6130|21
 楼主| abner_ma 发表于 2024-10-13 23:47 | 显示全部楼层 |阅读模式
      STM32H7S78-DK搭载高性能STM32H7S78 单片机,基于Arm Cortex-M7内核,主频可达600MHz,处理性能高达1284 DMIPS。这为其强大的图形处理能力提供了坚实的硬件基础。图形加速硬件,内置NeoChrom GPU,支持2D和2.5D图形加速,以及JPEG编解码器。这使得STM32H7S78能够轻松应对复杂的图形处理任务,实现高性能ARM A架构处理器效果。灵活的存储解决方案:集成64KB的bootflash存储器,支持多种外部存储接口,如xSPI、SD/SDIO/MMC和FMC。这为用户提供了丰富的存储选择,便于存储和访问大量的图形数据。可以进行流畅的人机交互和丰富的用户界面。   小米SU7很有个性的,车型的中控屏上方配备了用于显示G值的原型码表。这一设计不仅体现了小米汽车对于驾驶体验的重视,也展示了其在智能化、数字化方面的创新实力。通过实时显示G值,驾驶员可以更加直观地了解车辆的加速性能以及行驶状态,从而做出更加精准的驾驶判断。
  本次公开一个基于TouchGFX的设计一款G显示副屏,TouchGFX是一款针对STM32微控制器进行了优化的免费高级图形软件框架。它包含易于使用的拖放式图形构建PC工具TouchGFX Designer以及强大的优化图形处理内核TouchGFX引擎,TouchGFX大大简化了GUI开发过程。
   开始设计:
1.png
3.png
4.png

5.png
    思路:首先设计一个背景图,创建小圆点控件。在TouchGFX Designer中,使用圆形控件或其他形状控件来创建小圆点。设置控件的初始属性,如大小、颜色和透明度。添加位置控制逻辑,在TouchGFX的代码中,添加逻辑来处理小圆点的位置控制。可以使用触摸事件监听器来捕捉用户的触摸滑动动作,并根据滑动距离更新小圆点的位置。实现坐标更新:编写代码来更新小圆点的坐标。确保更新后的坐标在屏幕的有效范围内。实际引用是解析车载总线CAN,解析陀螺仪数据。
   代码开发:基于freertos 开发,cubeMX  资源配置:


2.png
  1. static void MX_LTDC_Init(void)
  2. {

  3.   /* USER CODE BEGIN LTDC_Init 0 */

  4.   /* USER CODE END LTDC_Init 0 */

  5.   LTDC_LayerCfgTypeDef pLayerCfg = {0};

  6.   /* USER CODE BEGIN LTDC_Init 1 */

  7.   /* USER CODE END LTDC_Init 1 */
  8.   hltdc.Instance = LTDC;
  9.   hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
  10.   hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
  11.   hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
  12.   hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
  13.   hltdc.Init.HorizontalSync = 4;
  14.   hltdc.Init.VerticalSync = 4;
  15.   hltdc.Init.AccumulatedHBP = 12;
  16.   hltdc.Init.AccumulatedVBP = 12;
  17.   hltdc.Init.AccumulatedActiveW = 812;
  18.   hltdc.Init.AccumulatedActiveH = 492;
  19.   hltdc.Init.TotalWidth = 820;
  20.   hltdc.Init.TotalHeigh = 506;
  21.   hltdc.Init.Backcolor.Blue = 0;
  22.   hltdc.Init.Backcolor.Green = 0;
  23.   hltdc.Init.Backcolor.Red = 0;
  24.   if (HAL_LTDC_Init(&hltdc) != HAL_OK)
  25.   {
  26.     Error_Handler();
  27.   }
  28.   pLayerCfg.WindowX0 = 0;
  29.   pLayerCfg.WindowX1 = 800;
  30.   pLayerCfg.WindowY0 = 0;
  31.   pLayerCfg.WindowY1 = 480;
  32.   pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
  33.   pLayerCfg.Alpha = 255;
  34.   pLayerCfg.Alpha0 = 0;
  35.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
  36.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
  37.   pLayerCfg.FBStartAdress = 0;
  38.   pLayerCfg.ImageWidth = 800;
  39.   pLayerCfg.ImageHeight = 480;
  40.   pLayerCfg.Backcolor.Blue = 0;
  41.   pLayerCfg.Backcolor.Green = 0;
  42.   pLayerCfg.Backcolor.Red = 0;
  43.   if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
  44.   {
  45.     Error_Handler();
  46.   }
  47.   /* USER CODE BEGIN LTDC_Init 2 */

  48.   /* USER CODE END LTDC_Init 2 */

  49. }

  50. /**
  51.   * [url=home.php?mod=space&uid=247401]@brief[/url] GPIO Initialization Function
  52.   * @param None
  53.   * @retval None
  54.   */
  55. static void MX_GPIO_Init(void)
  56. {
  57.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  58. /* USER CODE BEGIN MX_GPIO_Init_1 */
  59. /* USER CODE END MX_GPIO_Init_1 */

  60.   /* GPIO Ports Clock Enable */
  61.   __HAL_RCC_GPIOF_CLK_ENABLE();
  62.   __HAL_RCC_GPIOG_CLK_ENABLE();
  63.   __HAL_RCC_GPIOB_CLK_ENABLE();
  64.   __HAL_RCC_GPIOE_CLK_ENABLE();
  65.   __HAL_RCC_GPIOA_CLK_ENABLE();

  66.   /*Configure GPIO pin Output Level */
  67.   HAL_GPIO_WritePin(GPIOF, FRAME_RATE_Pin|RENDER_TIME_Pin|MCU_ACTIVE_Pin|VSYNC_FREQ_Pin, GPIO_PIN_RESET);

  68.   /*Configure GPIO pin Output Level */
  69.   HAL_GPIO_WritePin(LCD_EN_GPIO_Port, LCD_EN_Pin, GPIO_PIN_SET);

  70.   /*Configure GPIO pin Output Level */
  71.   HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_Port, LCD_BL_CTRL_Pin, GPIO_PIN_SET);

  72.   /*Configure GPIO pins : FRAME_RATE_Pin RENDER_TIME_Pin VSYNC_FREQ_Pin */
  73.   GPIO_InitStruct.Pin = FRAME_RATE_Pin|RENDER_TIME_Pin|VSYNC_FREQ_Pin;
  74.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  75.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  76.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  77.   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  78.   /*Configure GPIO pin : MCU_ACTIVE_Pin */
  79.   GPIO_InitStruct.Pin = MCU_ACTIVE_Pin;
  80.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  81.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  82.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  83.   HAL_GPIO_Init(MCU_ACTIVE_GPIO_Port, &GPIO_InitStruct);

  84.   /*Configure GPIO pin : LCD_EN_Pin */
  85.   GPIO_InitStruct.Pin = LCD_EN_Pin;
  86.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  87.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  88.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  89.   HAL_GPIO_Init(LCD_EN_GPIO_Port, &GPIO_InitStruct);

  90.   /*Configure GPIO pin : TP_IRQ_Pin */
  91.   GPIO_InitStruct.Pin = TP_IRQ_Pin;
  92.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  93.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  94.   HAL_GPIO_Init(TP_IRQ_GPIO_Port, &GPIO_InitStruct);

  95.   /*Configure GPIO pin : LCD_BL_CTRL_Pin */
  96.   GPIO_InitStruct.Pin = LCD_BL_CTRL_Pin;
  97.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  98.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  99.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  100.   HAL_GPIO_Init(LCD_BL_CTRL_GPIO_Port, &GPIO_InitStruct);

  101.   /* EXTI interrupt init*/
  102.   HAL_NVIC_SetPriority(TP_IRQ_EXTI_IRQn, 5, 0);
  103.   HAL_NVIC_EnableIRQ(TP_IRQ_EXTI_IRQn);

  104. /* USER CODE BEGIN MX_GPIO_Init_2 */
  105. /* USER CODE END MX_GPIO_Init_2 */
  106. }
  效果展示:
微信图片_20241013234512.jpg




Amazingxixixi 发表于 2024-10-31 16:18 | 显示全部楼层
统一的界面设计软件和QT一样
suncat0504 发表于 2024-10-31 17:27 | 显示全部楼层
是动态的吗?运行速度、反应速度怎么样?
地瓜patch 发表于 2024-10-31 18:47 来自手机 | 显示全部楼层
副屏?两块显示屏么
lzmm 发表于 2024-11-12 09:52 | 显示全部楼层
在TouchGFX Designer中进行图形界面设计,包括创建背景图、添加控件(如小圆点、按钮、文本等)并设置其属性。对于G显示副屏,可能需要设计特定的仪表盘样式,以直观展示车辆的加速度信息。
lzbf 发表于 2024-11-12 14:59 | 显示全部楼层
具有足够的性能和存储空间来支持TouchGFX的运行和图形渲染。
juliestephen 发表于 2024-11-13 12:02 | 显示全部楼层
合理利用TouchGFX的图形加速功能,减少CPU的负担。
sesefadou 发表于 2024-11-14 16:37 | 显示全部楼层
如果使用实时操作系统(RTOS),确保TouchGFX与RTOS兼容,并正确配置任务调度。
alvpeg 发表于 2024-11-17 15:42 | 显示全部楼层
在STM32CubeMX中安装TouchGFX软件包,并正确配置相关参数。
loutin 发表于 2024-11-17 17:54 | 显示全部楼层
在设计时考虑未来的扩展性,以便在需要时能够轻松添加新功能或升级硬件
everyrobin 发表于 2024-11-20 18:44 | 显示全部楼层
注意单片机的内存资源有限,合理分配和管理内存资源,避免内存泄漏或溢出。
使用高效的内存分配算法和数据结构,以提高内存利用率。
gygp 发表于 2024-11-20 20:14 | 显示全部楼层
利用TouchGFX Designer进行GUI设计,创建符合汽车G显示副屏需求的界面元素,如背景图、小圆点控件等。
updownq 发表于 2024-11-21 12:07 | 显示全部楼层
根据实际需求对TouchGFX进行性能优化,如减少渲染时间、降低CPU占用率等,以提高系统的响应速度和稳定性。
adolphcocker 发表于 2024-11-21 13:29 | 显示全部楼层
对 TouchGFX 应用进行性能优化。优化图像资源的加载和显示方式,采用合适的压缩算法减少图像数据量,提高加载速度;合理使用动画效果和过渡效果,避免过度复杂的动画导致帧率下降;对于频繁更新的显示内容,采用局部更新机制,减少不必要的重绘操作,提高显示效率。
averyleigh 发表于 2024-11-21 17:02 | 显示全部楼层
提供故障处理机制,如异常检测、错误提示等,以便在出现问题时能够及时发现并解决。
1988020566 发表于 2024-11-21 18:37 | 显示全部楼层
将解析后的G值数据实时显示在G显示副屏上,确保数据的准确性和实时性。同时,注意数据的单位转换和格式化,以便驾驶员能够直观地理解数据。
iyoum 发表于 2024-11-21 22:53 | 显示全部楼层
基于TouchGFX搭建汽车G显示副屏需要注意硬件选择与配置、TouchGFX软件配置与优化、数据解析与显示、安全与可靠性以及用户体验与合规性等方面。
uiint 发表于 2024-11-22 16:42 | 显示全部楼层
保护数据源和传输过程中的数据安全,防止数据被恶意篡改或泄露。
mikewalpole 发表于 2024-11-22 17:14 | 显示全部楼层
使用TouchGFX Designer进行界面设计,确保界面布局合理、美观且易于操作。
mnynt121 发表于 2024-11-22 18:39 | 显示全部楼层
在TouchGFX中配置触摸事件处理逻辑,如滑动、点击等,以实现用户与G显示副屏的交互
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

104

主题

191

帖子

3

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