EDPI

该示例演示LCDC外设中EDPI接口的应用。

环境需求

该示例支持以下开发套件:

开发套件

硬件平台

设备名称

RTL87x2G HDK

RTL87x2G EVB

更多信息请参考快速入门

硬件连线

需要任意EK9716屏幕或逻辑分析仪。

  1. P0_2接到屏幕WRCLK。

  2. P1_5接到屏幕HSYNC。

  3. P0_1接到屏幕VSYNC。

  4. P0_0接到屏幕DE。

  5. 数据线的引脚请参考:file:EK9716_800480_rgb.h

或以上所有引脚连接至逻辑分析仪。

配置选项

编译和下载

该示例的工程路径如下:

Project file: samples\peripheral\lcdc\lcdc_dpi\proj\rtl87x2g\mdk

Project file: samples\peripheral\lcdc\lcdc_dpi\proj\rtl87x2g\gcc

请按照以下步骤操作构建并运行该示例:

  1. 打开工程文件。

  2. 按照 Quick Start编译APP Image 给出的步骤构建目标文件。

  3. 编译成功后,在路径 mdk\bin 下会生成 app bin app_MP_xxx.bin 文件。

  4. 按照 Quick StartMPTool下载 给出的步骤将app bin烧录至EVB内。

  5. 按下复位按键,开始运行。

测试验证

  1. 观察到屏幕点亮为绿色,或逻辑分析仪观察到正确波形。

代码介绍

该章节分为以下几个部分:

  1. 源码路径

  2. 初始化函数将在 初始化 章节介绍。

  3. 初始化后的功能实现将在 功能实现 章节介绍。

源码路径

  • 工程路径: sdk\samples\peripheral\lcdc\lcdc_dpi\proj

  • 源码路径: sdk\samples\peripheral\lcdc\lcdc_dpi\src

该工程的工程文件代码结构如下:

└── Project: edpi
    └── lcdc
        ├── config                       include project construct configuration
        ├── display                      include the peripheral drivers related with display
        └── Device                       includes startup code
            ├── startup_rtl.c
            └── system_rtl.c
        ├── CMSIS                        includes CMSIS header files
        ├── CMSE Library                 non-secure callable lib
        ├── lib                          includes all binary symbol files that user application is built on
        ├── peripheral                   includes all peripheral drivers and module code used by the application
        └── APP                          soucrce code of LCDC edpi sample
            ├── main_ns.c
            └── EK9716_800480_rgb.c      driver of LCD screen

初始化

初始化流程包含在 lcd_pad_and_clk_init() 中。

  1. 使能LCDC时钟,并选择合适的时钟源 。

/* config LCD dev info */
RCC_PeriphClockCmd(APBPeriph_DISP, APBPeriph_DISP_CLOCK, ENABLE);

//from XTAL SOURCE = 40M
PERIBLKCTRL_PERI_CLK->u_324.BITS_324.disp_ck_en = 1;
PERIBLKCTRL_PERI_CLK->u_324.BITS_324.disp_func_en = 1;
PERIBLKCTRL_PERI_CLK->u_324.BITS_324.r_disp_mux_clk_cg_en = 1;

//From PLL1, SOURCE = 100M
PERIBLKCTRL_PERI_CLK->u_324.BITS_324.r_disp_div_en = 1;
PERIBLKCTRL_PERI_CLK->u_324.BITS_324.r_disp_clk_src_sel0 = 0; //pll1_peri(0) or pll2(1, pll2 = 160M)
PERIBLKCTRL_PERI_CLK->u_324.BITS_324.r_disp_clk_src_sel1 = 1; //pll(1) or xtal(0)
PERIBLKCTRL_PERI_CLK->u_324.BITS_324.r_disp_div_sel = 0; //div
  1. 初始化需要使用的引脚。

Pad_Config(LCDC_RGB_WRCLK, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE,
           PAD_OUT_HIGH);
Pad_Config(LCDC_HSYNC, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pad_Config(LCDC_VSYNC, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pad_Config(LCDC_CSN_DE, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);

Pad_Dedicated_Config(LCDC_RGB_WRCLK, ENABLE);
Pad_Dedicated_Config(LCDC_HSYNC, ENABLE);
Pad_Dedicated_Config(LCDC_VSYNC, ENABLE);
Pad_Dedicated_Config(LCDC_CSN_DE, ENABLE);
  1. 选择需要的颜色格式,指定使用EDPI接口。

LCDC_InitTypeDef lcdc_init = {0};
lcdc_init.LCDC_Interface = LCDC_IF_DPI;
lcdc_init.LCDC_PixelInputFarmat = LCDC_INPUT_RGB565;
lcdc_init.LCDC_PixelOutpuFarmat = LCDC_OUTPUT_RGB888;
lcdc_init.LCDC_PixelBitSwap = LCDC_SWAP_BYPASS; //lcdc_handler_cfg->LCDC_TeEn = LCDC_TE_DISABLE;
lcdc_init.LCDC_GroupSel = 1;

lcdc_init.LCDC_DmaThreshold =
    112;    //only support threshold = 8 for DMA MSIZE = 8; the other threshold setting will be support later
lcdc_init.LCDC_InfiniteModeEn = 1;
LCDC_Init(&lcdc_init);
  1. 初始化EDPI接口,指定分频系数与屏幕时序控制参数,例如back porch信号等。

uint32_t HSA = 48, HFP = 40, HBP = 40, HACT = EK9716_800480_LCD_WIDTH;
uint32_t VSA = 1, VFP = 13, VBP = 31, VACT = EK9716_800480_LCD_HEIGHT;

LCDC_eDPICfgTypeDef eDPICfg;//480*640  ---->   500 * 660
eDPICfg.eDPI_ClockDiv = 4;

eDPICfg.eDPI_HoriSyncWidth = HSA;
eDPICfg.eDPI_VeriSyncHeight = VSA;
eDPICfg.eDPI_AccumulatedHBP = HSA + HBP;
eDPICfg.eDPI_AccumulatedVBP = VSA + VBP;
eDPICfg.eDPI_AccumulatedActiveW = HSA + HBP + HACT;
eDPICfg.eDPI_AccumulatedActiveH = VSA + VBP + VACT;
eDPICfg.eDPI_TotalWidth = HSA + HBP + HACT + HFP;
eDPICfg.eDPI_TotalHeight = VSA + VBP + VACT + VFP;
eDPICfg.eDPI_HoriSyncPolarity = 0;
eDPICfg.eDPI_VeriSyncPolarity = 0;
eDPICfg.eDPI_DataEnPolarity = 1;
eDPICfg.eDPI_LineIntMask = 1;
eDPICfg.eDPI_ColorMap = EDPI_PIXELFORMAT_RGB888;//for RGB888
eDPICfg.eDPI_OperateMode = 0;//video mode
eDPICfg.eDPI_LcdArc = 0;
eDPICfg.eDPI_ShutdnPolarity = 0;
eDPICfg.eDPI_ColorModePolarity = 0;
eDPICfg.eDPI_ShutdnEn = 0;
eDPICfg.eDPI_ColorModeEn = 0;
eDPICfg.eDPI_UpdateCfgEn = 0;
eDPICfg.eDPI_TearReq = 0;
eDPICfg.eDPI_Halt = 0;
eDPICfg.eDPI_CmdMaxLatency = 0;//todo
eDPICfg.eDPI_LineBufferPixelThreshold = eDPICfg.eDPI_TotalWidth / 2;

EDPI_Init(&eDPICfg);
  1. 通过控制Reset引脚使屏幕完成Reset。

ek9716_reset_high();
platform_delay_ms(200);
ek9716_reset_low();
platform_delay_ms(200);
ek9716_reset_high();
platform_delay_ms(200);

功能实现

  1. 通过函数 rtk_lcd_hal_update_framebuffer() 将指定的buffer更新给屏幕。

常见问题

颜色不符合预期

检查EDPI的颜色格式是否设定错误,颜色排布格式是否与屏幕要求不符。

屏幕显示内容出现闪烁

检查当前正在写数据的内存区域是否是屏幕正用于显示的区域。