[STM32H7] 【STM32H745I-DISCO 试用】+双图层动画效果测试及程序分析

[复制链接]
 楼主| jinglixixi 发表于 2025-3-18 16:57 | 显示全部楼层 |阅读模式
<
本帖最后由 jinglixixi 于 2025-3-18 19:20 编辑

在官方提供的例程中,含有LCD屏的内容以供测试和学习,其效果还是比较有特点的。
以双层动画效果的例程为例,其显示效果如图1和图2所示,即2张图片可以实现位置的交换。
8e102a3b842a3bf3a42a3c543e974807
图1 效果1

4484b8bb4b602fe6e7686159e0344383
图2 效果2

其M7的主程序内容为:
  1. int main(void)
  2. {
  3. uint32_t index = 0;
  4. MPU_Config();
  5. CPU_CACHE_Enable();
  6. HAL_Init();
  7. SystemClock_Config();
  8. BSP_LED_Init(LED2);
  9. LCD_Config();
  10. HAL_LTDC_ConfigCLUT(&LtdcHandle, (uint32_t *)L8_320x240_CLUT, 256, 0);
  11. HAL_LTDC_EnableCLUT(&LtdcHandle, 0);
  12. while (1)
  13. {
  14. for (index = 0; index < 32; index++)
  15. {
  16. // 计算新的图片位置
  17. PicturesPosition(&Xpos1, &Ypos1, &Xpos2, &Ypos2, (index+1));
  18. //重新配置第1层位置,无需重新加载
  19. HAL_LTDC_SetWindowPosition_NoReload(&LtdcHandle, Xpos1, Ypos1, 0);
  20. //重新配置第2层位置,无需重新加载
  21. HAL_LTDC_SetWindowPosition_NoReload(&LtdcHandle, Xpos2, Ypos2, 1);
  22. //在下一个垂直空白期间请求LTDC重新加载
  23. ReloadFlag = 0;
  24. HAL_LTDC_Reload(&LtdcHandle,LTDC_RELOAD_VERTICAL_BLANKING);
  25. while(ReloadFlag == 0)
  26. {
  27. }
  28. }
  29. HAL_Delay(500);
  30. for (index = 0; index < 32; index++)
  31. {
  32. // 计算新的图片位置
  33. PicturesPosition(&Xpos2, &Ypos2, &Xpos1, &Ypos1, (index+1));
  34. //重新配置第1层位置,无需重新加载
  35. HAL_LTDC_SetWindowPosition_NoReload(&LtdcHandle, Xpos1, Ypos1, 0);
  36. //重新配置第2层位置,无需重新加载
  37. HAL_LTDC_SetWindowPosition_NoReload(&LtdcHandle, Xpos2, Ypos2, 1);
  38. //在下一个垂直空白期间请求LTDC重新加载
  39. ReloadFlag = 0;
  40. HAL_LTDC_Reload(&LtdcHandle,LTDC_RELOAD_VERTICAL_BLANKING);
  41. while(ReloadFlag == 0)
  42. {
  43. }
  44. }
  45. HAL_Delay(500);
  46. }
  47. }

经程序的分析可知,它在循环体内原来作了2件事,一件是使图片1沿着对角线向左上角移动(图片2沿相反方向移动),另一件是使图片2沿着对角线向左上角移动(图片1沿相反方向移动)。
其垂直方向的移动量正是32个像素点,而水平方向的移动量是水平方向的5倍,即160个像素点。
这个变换的处理过程由如下函数实现:
  1. static void PicturesPosition(uint32_t* x1, uint32_t* y1, uint32_t* x2, uint32_t* y2, uint32_t index)
  2. {
  3. // 图片1位置
  4. *x1 = index*5;
  5. *y1 = index;
  6. // 图片2位置
  7. *x2 = 160 - index*5;
  8. *y2 = 32 - index;
  9. }

至于图片1和图片2的数据则是由以下2个数组来提供的。由数组的大小,可明显地观察到其中一个的数据多,而另一个的数据少,这也正是2副图片在复杂程度有很大差别的原因,之外由数据量还可以看出,其中一个的数据量极为偏少,应该是采用编码压缩处理。
  1. const uint32_t L8_320x240_CLUT[256] =76800/300
  2. {
  3. 0x0,
  4. 0x800000,
  5. 0x8000,
  6. 0x808000,
  7. 0x80,
  8. ...
  9. }
  10. const uint32_t L8_320x240[19200] =76800/4
  11. {
  12. 0xF9F9F9F9,
  13. 0xF9F9F9F9,
  14. ...
  15. }

从显示效果看,其程序设计的还是十分精巧的,产生图层透明的效果且移动时十分流畅。

演示视频:


yangjiaxu 发表于 2025-4-9 14:40 | 显示全部楼层
这么流畅?太强了吧,这芯片啊
 楼主| jinglixixi 发表于 2025-4-9 19:03 | 显示全部楼层
效果的确是十分流畅!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

517

主题

2932

帖子

39

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