EDPI
该示例演示LCDC外设中EDPI接口的应用。
环境需求
该示例支持以下开发套件:
硬件平台 |
设备名称 |
---|---|
RTL87x2G HDK |
RTL87x2G EVB |
更多信息请参考快速入门。
硬件连线
需要任意EK9716屏幕或逻辑分析仪。
P0_2接到屏幕WRCLK。
P1_5接到屏幕HSYNC。
P0_1接到屏幕VSYNC。
P0_0接到屏幕DE。
数据线的引脚请参考
EK9716_800480_rgb.h
。
或以上所有引脚连接至逻辑分析仪。
配置选项
无
编译和下载
该示例的工程路径如下:
Project file: samples\peripheral\lcdc\lcdc_dpi\proj\rtl87x2g\mdk
Project file: samples\peripheral\lcdc\lcdc_dpi\proj\rtl87x2g\gcc
请按照以下步骤操作构建并运行该示例:
打开工程文件。
按照 快速入门 中 编译APP Image 给出的步骤构建目标文件。
编译成功后,在路径
mdk\bin
下会生成 app binapp_MP_xxx.bin
文件。按下复位按键,开始运行。
测试验证
观察到屏幕点亮为绿色,或逻辑分析仪观察到正确波形。
代码介绍
该章节分为以下几个部分:
源码路径
工程路径:
sdk\samples\peripheral\lcdc\lcdc_dpi\proj
源代码路径:
sdk\samples\peripheral\lcdc\lcdc_dpi\src
该工程的工程文件代码结构如下:
└── Project: edpi
└── lcdc
├── config includes project construct configuration
├── display includes 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 source code of LCDC edpi sample
├── main_ns.c
└── EK9716_800480_rgb.c driver of LCD screen
初始化
初始化流程包含在 lcd_pad_and_clk_init()
中。
使能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
初始化需要使用的引脚。
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);
选择需要的颜色格式,指定使用EDPI接口。
LCDC_InitTypeDef lcdc_init = {0};
lcdc_init.LCDC_Interface = LCDC_IF_DPI;
lcdc_init.LCDC_PixelInputFormat = LCDC_INPUT_RGB565;
lcdc_init.LCDC_PixelOutputFormat = 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);
初始化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);
通过控制Reset引脚使屏幕完成Reset。
ek9716_reset_high();
platform_delay_ms(200);
ek9716_reset_low();
platform_delay_ms(200);
ek9716_reset_high();
platform_delay_ms(200);
功能实现
通过函数
rtk_lcd_hal_update_framebuffer()
将指定的buffer更新给屏幕。
常见问题
颜色不符合预期
检查EDPI的颜色格式是否设定错误,颜色排布格式是否与屏幕要求不符。
屏幕显示内容出现闪烁
检查当前正在写数据的内存区域是否是屏幕正用于显示的区域。