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);
...