跳转到主要内容

5. 外部RAM中的帧缓冲

动机

在这一步,我们将帧缓存从内部RAM移至外部RAM,并确保帧缓存内容仍可以传输到显示屏。

Note
如果所用开发板不外扩RAM,请跳过此步。

由于显示控制器对传输速度有一定要求,因此该步骤将基于外部RAM进行压力测试。 该过程中可能发生错误。 常见错误为外部RAM的带宽不够高所造成的LTDC下溢,或RAM配置不正确和“超规格”运行而导致的图像错误。

目标

此步骤把使用内部RAM作为帧缓存,改为使用外部RAM做帧缓存。

验证

以下是这部分的验证点。 这些验证点与帧缓存位于内部RAM中时的验证点相似,但应再次检查,因为外部存储器的访问速度可能会影响从帧缓存向显示屏的传输。

验证点基本原理
显示帧缓存显示控制器或SPI已配置并正在运行
显示更新的帧缓存我们知道如何重复发送帧缓存数据
帧率正确配置像素时钟和同步沿,以获得所需帧率

先决条件

以下是此步骤的先决条件:

  • 外部RAM中帧缓存地址

执行

我们有两个任务:

  • 将帧缓存放在外部RAM
  • 设置显示控制器,以从外部RAM读取数据

当帧缓存位于外部RAM中时,通常的做法不为其分配数组。 只需声明一个指向正确地址的指针即可。 然后手动选择外部RAM地址。 该地址可位于外部RAM中的任何位置,但通常位于RAM的开头:

main.c
uint16_t* framebuffer = (uint16_t*)0xC0000000;  //16 bpp framebuffer

您可以重用在内部RAM显示步骤中创建的小型测试程序。

LTDC层配置

请记住更改LTDC图层的配置。 由于我们现在有了帧缓存的特定地址,我们可以通过CubeMx将该地址进行设置(即帧缓存起始地址):

配置LTDC层参数

请记住从你的程序中删除此行和帧缓存数组:

main.c
  /* USER CODE BEGIN 2 */
HAL_LTDC_SetAddress(&hltdc, framebuffer, LTDC_LAYER_1);
/* USER CODE END 2 */

如果在步骤03将LTDC图层大小设置为仅更新部分显示(由于内部RAM的数量) ,则现在需要重做。 重新配置LTDC图层参数,以便支持整个显示屏。