本帖最后由 小马哥-1650185 于 2018-6-15 23:50 编辑
先看下效果图吧
增强型液晶显示界面(eLCDIF)是一种通用的显示方式控制器 eLCDIF 具有以下特性:
支持显示动态图片并需要 RGB 接口模式(DOTCLK 接口)的显示器。
主机总线接口为显示器刷新源帧缓冲数据。此接口也可用于驱动“智能”显示器的数
据。
支持 DMA 接口,用于管理“智能”显示器与 SoC 之间的数据传输。
支持 8/16/18/24 位 LCD 数据总线模式。
可编程的 DOTCLK LCD 接口时序和参数。
配置步骤:
将 eLCDIF 相关引脚复用为 eLCDIF 模式并对引脚功能进行配置;
选择 eLCDIF 时钟源,配置时钟频率;
初始化显示器,包括显示器复位,背光点亮等;
使能 eLCDIF 时钟;
复位 eLCDIF 外设;
配置 eLCDIF 模式,包括显示器分辨率、像素格式、数据总线位数、 HSYNC 和 VSYNC参数等;
如果使用中断需要置位相应中断位,并使能中断号;
将 eLCDIF 相关引脚复用为 eLCDIF 模式并对引脚功能进行配置;
选择 eLCDIF 时钟源,配置时钟频率;
初始化显示器,包括显示器复位,背光点亮等;
使能 eLCDIF 时钟;
复位 eLCDIF 外设;
配置 eLCDIF 模式,包括显示器分辨率、像素格式、数据总线位数、 HSYNC 和 VSYNC参数等;
如果使用中断需要置位相应中断位,并使能中断号;
DOTCLK接口时序
原理图
lcd的分辨率为- /* LCD 分辨率 */
- #define LCD_PIXEL_WIDTH 800
- #define LCD_PIXEL_HEIGHT 480
- //兼容官方demo
- #define APP_IMG_WIDTH LCD_PIXEL_WIDTH
- #define APP_IMG_HEIGHT LCD_PIXEL_HEIGHT
复制代码 LCD数据线类型
- #define APP_LCDIF_DATA_BUS kELCDIF_DataBus16Bit
复制代码
lcd的引脚配置,初始化LCD相关IOMUXC的MUX复用配置- static void LCD_IOMUXC_MUX_Config(void)
- {
- /* 所有引脚均不开启SION功能 */
- /* 时序控制信号线 */
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_00_LCD_CLK, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_02_LCD_HSYNC, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_03_LCD_VSYNC, 0U);
-
- /* RGB565数据信号线,
- DATA0~DATA4:B3~B7
- DATA5~DATA10:G2~G7
- DATA11~DATA15:R3~R7 */
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_04_LCD_DATA00, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_05_LCD_DATA01, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_06_LCD_DATA02, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_07_LCD_DATA03, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_08_LCD_DATA04, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_09_LCD_DATA05, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_10_LCD_DATA06, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_11_LCD_DATA07, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_12_LCD_DATA08, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_13_LCD_DATA09, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_14_LCD_DATA10, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B0_15_LCD_DATA11, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B1_00_LCD_DATA12, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B1_01_LCD_DATA13, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B1_02_LCD_DATA14, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_B1_03_LCD_DATA15, 0U);
-
- /* LCD_BL背光控制信号线 */
- IOMUXC_SetPinMux(LCD_BL_IOMUXC, 0U);
- }
复制代码
初始化LCD相关IOMUXC的PAD属性配置
- static void LCD_IOMUXC_PAD_Config(void)
- {
- /* 所有引脚均使用同样的PAD配置 */
- /* 时序控制信号线 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_00_LCD_CLK,LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_01_LCD_ENABLE, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_02_LCD_HSYNC, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_03_LCD_VSYNC, LCD_PAD_CONFIG_DATA);
- /* RGB565数据信号线,
- DATA0~DATA4:B3~B7
- DATA5~DATA10:G2~G7
- DATA11~DATA15:R3~R7 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_04_LCD_DATA00, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_05_LCD_DATA01, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_06_LCD_DATA02, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_07_LCD_DATA03, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_08_LCD_DATA04, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_09_LCD_DATA05, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_10_LCD_DATA06, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_11_LCD_DATA07, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_12_LCD_DATA08, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_13_LCD_DATA09, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_14_LCD_DATA10, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_15_LCD_DATA11, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_00_LCD_DATA12, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_01_LCD_DATA13, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_02_LCD_DATA14, LCD_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_03_LCD_DATA15, LCD_PAD_CONFIG_DATA);
-
- /* LCD_BL背光控制信号线 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_15_GPIO1_IO15, LCD_PAD_CONFIG_DATA);
- }
复制代码
初始化ELCDIF外设
- static void LCD_ELCDIF_Config(void)
- {
- const elcdif_rgb_mode_config_t config = {
- .panelWidth = LCD_PIXEL_WIDTH,
- .panelHeight = LCD_PIXEL_HEIGHT,
- .hsw = APP_HSW,
- .hfp = APP_HFP,
- .hbp = APP_HBP,
- .vsw = APP_VSW,
- .vfp = APP_VFP,
- .vbp = APP_VBP,
- .polarityFlags = APP_POL_FLAGS,
- .bufferAddr = (uint32_t)s_psBufferLcd[0],
- .pixelFormat = kELCDIF_PixelFormatXRGB8888,
- .dataBus = APP_LCDIF_DATA_BUS,
- };
-
- ELCDIF_RgbModeInit(APP_ELCDIF, &config);
- ELCDIF_RgbModeStart(APP_ELCDIF);
- }
复制代码
初始化ELCDIF使用的时钟
void LCD_InitClock(void)
{
/*
* 要把帧率设置成60Hz,所以像素时钟频率为:
* 水平像素时钟个数:(APP_IMG_WIDTH + APP_HSW + APP_HFP + APP_HBP )
* 垂直像素时钟个数:(APP_IMG_HEIGHT + APP_VSW + APP_VFP + APP_VBP)
*
* 像素时钟频率:(800 + 1 + 10 + 46) * (480 + 1 + 22 + 23) * 60 = 27.05M.
* 本例子设置 LCDIF 像素时钟频率为 27M.
*/
/*
* 初始化 Video PLL.
* Video PLL 输出频率为
* OSC24M * (loopDivider + (denominator / numerator)) / postDivider = 108MHz.
*/
clock_video_pll_config_t config = {
.loopDivider = 36, .postDivider = 8, .numerator = 0, .denominator = 0,
};
CLOCK_InitVideoPll(&config);
/*
* 000 derive clock from PLL2
* 001 derive clock from PLL3 PFD3
* 010 derive clock from PLL5
* 011 derive clock from PLL2 PFD0
* 100 derive clock from PLL2 PFD1
* 101 derive clock from PLL3 PFD1
*/
/* 选择为vedio PLL*/
CLOCK_SetMux(kCLOCK_LcdifPreMux, 2);
/* 设置分频 */
CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 1);
CLOCK_SetDiv(kCLOCK_LcdifDiv, 1);
}
初始化液晶屏
- void LCD_Init(bool enableInterrupt)
- {
- *((uint32_t *)0x41044100) = 0x0000000f;
- *((uint32_t *)0x41044104) = 0x0000000f;
- LCD_IOMUXC_MUX_Config();
- LCD_IOMUXC_PAD_Config();
- LCD_ELCDIF_Config();
- LCD_InitClock();
- LCD_BackLight_ON();
-
- if(enableInterrupt)
- {
- LCD_InterruptConfig();
- }
- }
复制代码
画点函数
- void PutPixel(uint16_t Xpos, uint16_t Ypos)
- {
- if ( ( Xpos < LCD_PIXEL_WIDTH ) && ( Ypos < LCD_PIXEL_HEIGHT ) )
- {
- *(uint32_t *)(CurrentFrameBuffer + APP_BPP*(Xpos + (LCD_PIXEL_WIDTH*Ypos))) = CurrentTextColor;
- }
- }
复制代码
绘图API
|