TouchGFX之LTDC显示屏

1.根据原理图配置LTDC的GPIO(接线方式为RGB565)

2.根据LCD参数配置,LTDC时钟和参数

 

3.层参数配置

跟着documentation中:显示屏的帧缓存位于内部RAM 中章节中进行配置(1024*600 16bpp内部RAM不够用。因此只使用1024*200分辨率进行本实验)

 对于该测试,在TouchGFX中,我们通常仅使用一层。 第0层的分辨率应与帧缓冲大小匹配。 以后需要设置帧缓冲地址,这里先不理它。

4.启用LTDC中断

5.生成代码

6.打开背光

main.c  

/* USER CODE BEGIN 2 */
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
  /* USER CODE END 2 */

7.声明帧缓冲区

main.c

/* USER CODE BEGIN PV */
uint16_t framebuffer[1024*200];  //16 bpp framebuffer
/* USER CODE END PV */

8.设置帧缓冲地址

main.c

  /* USER CODE BEGIN 2 */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
  HAL_LTDC_SetAddress(&hltdc, (uint32_t)framebuffer, LTDC_LAYER_1);
  /* USER CODE END 2 */

9.使能LTDC中断

ltdc.c

  /* USER CODE BEGIN LTDC_Init 2 */
  LTDC->IER |= LTDC_IER_LIE; // Enable LTDC interrupts
  /* USER CODE END LTDC_Init 2 */

10.在中断处理程序中,必须在每次触发后重新启用中断

stm32f7xx_it.c

void LTDC_IRQHandler(void)
{
  /* USER CODE BEGIN LTDC_IRQn 0 */
  /* USER CODE END LTDC_IRQn 0 */
  HAL_LTDC_IRQHandler(&hltdc);
  /* USER CODE BEGIN LTDC_IRQn 1 */
  HAL_LTDC_ProgramLineEvent(&hltdc,0);
  /* USER CODE END LTDC_IRQn 1 */
}

11.通过使用LTDC行事件回调,每秒来修改一次帧缓存

main.c

/* USER CODE BEGIN 4 */
uint8_t r = 0x00, g = 0x00, b = 0x00;
uint16_t col = 0;
uint8_t color = 1;
void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef* hltdc)
{
  static int count = 0;
  count++;
  if (count >= 60)
  {
    count = 0;
    switch (color)
    {
    case 1:
      r = 0xFF; g = 0x00; b = 0x00;
      color = 2;
      break;
    case 2:
      r = 0x00; g = 0xFF; b = 0x00;
      color = 3;
      break;
    case 3:
      r = 0x00; g = 0x00; b = 0xFF;
      color = 1;
      break;
    default:
      break;
    }
    col = ((r>>3)<<11) | ((g>>2)<<5) | (b>>3);  // Convert colors to RGB565
    // Put colors into the framebuffer
    for(int i = 0; i < 1024*200; i++)
    {
      framebuffer[i] = col;
    }
  }
}
/* USER CODE END 4 */

12.烧录到开发板,屏幕按照一定帧率进行三色切换

13.检查帧率

首先,可以通过计算得出理论帧率

th = thpw + thb + thd + thfp = 20 + 140 + 1024 + 160 = 1344

tv = tvpw + tvb + tvd + tvfp = 3 + 20 + 600 + 12 = 635

fps = dclk / th / tv = 50000000 / 1344 / 635 = 58.5864267 Hz,即每帧17.0688ms。

然后代码验证,得到相同结果:每帧17ms

stm32f7xx_it.c

volatile int last = 0;
volatile int diff = 0;
void LTDC_IRQHandler(void)
{
  /* USER CODE BEGIN LTDC_IRQn 0 */
  int now = HAL_GetTick();
  diff = now - last;
  last = now;
  /* USER CODE END LTDC_IRQn 0 */
  HAL_LTDC_IRQHandler(&hltdc);
  ...

猜你喜欢

转载自blog.csdn.net/lushoumin/article/details/132393794