简介
我们在之前适配FreeRTOS工程的基础上继续更新,添加LCD模块的显示功能验证。STM32H745I-DISCO 开发板上集成了4.3寸的TFT 480*272 的RGB显示屏幕(RK043FN88H-CT661C)。LCD屏幕连接到了了MCU 的LTDC IP,通过LTDC 模块来驱动LCD显示屏,对应原理图如下。


LCD 参数配置

格局上述参数配置LCD 工作频率为8~12M,按照典型值9M来配置

根据上述timing 的参数表配置LCD 的垂直方向的同步参数配置,我们都按照推荐的典型值来配置。

配置LCD 工作模式控制GPIO,屏幕点亮需要拉高对应GPIO.

上述配置好时钟,gpio,及LCD参数信息,会生成如下的LCD配置函数,我们将frame_buff指向特定rgb数据即可完成LTDC的显示。
/**
* @brief LTDC Initialization Function
* @param None
* @retval None
*/
static void MX_LTDC_Init(void)
{
/* USER CODE BEGIN LTDC_Init 0 */
/* USER CODE END LTDC_Init 0 */
LTDC_LayerCfgTypeDef pLayerCfg = {0};
/* USER CODE BEGIN LTDC_Init 1 */
/* USER CODE END LTDC_Init 1 */
hltdc.Instance = LTDC;
hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
hltdc.Init.HorizontalSync = 3;
hltdc.Init.VerticalSync = 3;
hltdc.Init.AccumulatedHBP = 46;
hltdc.Init.AccumulatedVBP = 15;
hltdc.Init.AccumulatedActiveW = 526;
hltdc.Init.AccumulatedActiveH = 287;
hltdc.Init.TotalWidth = 534;
hltdc.Init.TotalHeigh = 295;
hltdc.Init.Backcolor.Blue = 0;
hltdc.Init.Backcolor.Green = 0;
hltdc.Init.Backcolor.Red = 0;
if (HAL_LTDC_Init(&hltdc) != HAL_OK)
{
Error_Handler();
}
pLayerCfg.WindowX0 = 0;
pLayerCfg.WindowX1 = 479;
pLayerCfg.WindowY0 = 0;
pLayerCfg.WindowY1 = 271;
pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
pLayerCfg.Alpha = 255;
pLayerCfg.Alpha0 = 100;
pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
pLayerCfg.FBStartAdress = (uint32_t)&RGB565_480x272;;
pLayerCfg.ImageWidth = 480;
pLayerCfg.ImageHeight = 272;
pLayerCfg.Backcolor.Blue = 0;
pLayerCfg.Backcolor.Green = 0;
pLayerCfg.Backcolor.Red = 0;
if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN LTDC_Init 2 */
/* USER CODE END LTDC_Init 2 */
}
板子验证
在默认task 内添加如下测试代码以1S的周期,刷新显示FrameBuffer
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN 5 */
/* Infinite loop */
for(;;)
{
HAL_LTDC_SetAddress(&hltdc, (uint32_t)&RGB565_480x272, 0);
HAL_LTDC_Reload( &hltdc,LTDC_RELOAD_IMMEDIATE);
vTaskDelay(1000);
HAL_LTDC_SetAddress(&hltdc, (uint32_t)&_acrgb565data, 0);
HAL_LTDC_Reload( &hltdc,LTDC_RELOAD_IMMEDIATE);
vTaskDelay(1000);
}
/* USER CODE END 5 */
}
运行结果如下,从效果看刷新全屏显示还是很丝滑的,性能感人。
至此已经完成了基础工程(uart 日志打印+ freertos)和底层LTDC的适配,下一步继续GUI DEMO试验适配LVGL. |