查看: 4767|回复: 0

[原创] 【野火i.MX RT1052】7.i.Maxrt1052之eLCDIF驱动5寸LCD屏

[复制链接]
  • TA的每日心情
    擦汗
    2019-6-26 20:59
  • 签到天数: 235 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2018-6-15 22:11:00 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 小马哥-1650185 于 2018-6-15 23:50 编辑

    先看下效果图吧

    1529075764675mz11.gif


    1529077722831mz111.gif


    增强型液晶显示界面(eLCDIF)是一种通用的显示方式控制器

    eLCDIF 具有以下特性:
     支持显示动态图片并需要 RGB 接口模式(DOTCLK 接口)的显示器。
     主机总线接口为显示器刷新源帧缓冲数据。此接口也可用于驱动“智能”显示器的数
    据。
     支持 DMA 接口,用于管理“智能”显示器与 SoC 之间的数据传输。
     支持 8/16/18/24 位 LCD 数据总线模式。
     可编程的 DOTCLK LCD 接口时序和参数。  


    elcd框图

    QQ截图20180615232252.jpg



    配置步骤:

     将 eLCDIF 相关引脚复用为 eLCDIF 模式并对引脚功能进行配置;
     选择 eLCDIF 时钟源,配置时钟频率;
     初始化显示器,包括显示器复位,背光点亮等;
     使能 eLCDIF 时钟;
     复位 eLCDIF 外设;
     配置 eLCDIF 模式,包括显示器分辨率、像素格式、数据总线位数、 HSYNC 和 VSYNC参数等;
     如果使用中断需要置位相应中断位,并使能中断号;
     将 eLCDIF 相关引脚复用为 eLCDIF 模式并对引脚功能进行配置;
     选择 eLCDIF 时钟源,配置时钟频率;
     初始化显示器,包括显示器复位,背光点亮等;
     使能 eLCDIF 时钟;
     复位 eLCDIF 外设;
     配置 eLCDIF 模式,包括显示器分辨率、像素格式、数据总线位数、 HSYNC 和 VSYNC参数等;
     如果使用中断需要置位相应中断位,并使能中断号;

    DOTCLK接口时序
    QQ截图20180615232905.jpg


    原理图

    QQ截图20180615232630.jpg


    lcd的分辨率为
    1. /* LCD 分辨率 */
    2. #define LCD_PIXEL_WIDTH     800
    3. #define LCD_PIXEL_HEIGHT    480
    4. //兼容官方demo
    5. #define APP_IMG_WIDTH   LCD_PIXEL_WIDTH
    6. #define APP_IMG_HEIGHT  LCD_PIXEL_HEIGHT
    复制代码
    LCD数据线类型
    1. #define APP_LCDIF_DATA_BUS    kELCDIF_DataBus16Bit
    复制代码


    lcd的引脚配置,初始化LCD相关IOMUXC的MUX复用配置
    1. static void LCD_IOMUXC_MUX_Config(void)
    2. {
    3.     /* 所有引脚均不开启SION功能 */
    4.     /* 时序控制信号线 */
    5.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_00_LCD_CLK, 0U);                                    
    6.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0U);                                    
    7.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_02_LCD_HSYNC, 0U);                                    
    8.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_03_LCD_VSYNC, 0U);
    9.   
    10.     /* RGB565数据信号线,
    11.      DATA0~DATA4:B3~B7
    12.      DATA5~DATA10:G2~G7
    13.      DATA11~DATA15:R3~R7 */
    14.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_04_LCD_DATA00, 0U);                                    
    15.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_05_LCD_DATA01, 0U);                                    
    16.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_06_LCD_DATA02, 0U);                                    
    17.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_07_LCD_DATA03, 0U);                                    
    18.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_08_LCD_DATA04, 0U);                                    
    19.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_09_LCD_DATA05, 0U);                                    
    20.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_10_LCD_DATA06, 0U);                                    
    21.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_11_LCD_DATA07, 0U);                                    
    22.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_12_LCD_DATA08, 0U);                                    
    23.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_13_LCD_DATA09, 0U);                                    
    24.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_14_LCD_DATA10, 0U);                                    
    25.     IOMUXC_SetPinMux(IOMUXC_GPIO_B0_15_LCD_DATA11, 0U);                                    
    26.     IOMUXC_SetPinMux(IOMUXC_GPIO_B1_00_LCD_DATA12, 0U);                                    
    27.     IOMUXC_SetPinMux(IOMUXC_GPIO_B1_01_LCD_DATA13, 0U);                                    
    28.     IOMUXC_SetPinMux(IOMUXC_GPIO_B1_02_LCD_DATA14, 0U);                                    
    29.     IOMUXC_SetPinMux(IOMUXC_GPIO_B1_03_LCD_DATA15, 0U);   
    30.    
    31.     /* LCD_BL背光控制信号线 */
    32.     IOMUXC_SetPinMux(LCD_BL_IOMUXC, 0U);
    33. }
    复制代码

    初始化LCD相关IOMUXC的PAD属性配置

    1. static void LCD_IOMUXC_PAD_Config(void)
    2. {  
    3.     /* 所有引脚均使用同样的PAD配置 */
    4.     /* 时序控制信号线 */
    5.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_00_LCD_CLK,LCD_PAD_CONFIG_DATA);
    6.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_01_LCD_ENABLE, LCD_PAD_CONFIG_DATA);
    7.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_02_LCD_HSYNC, LCD_PAD_CONFIG_DATA);  
    8.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_03_LCD_VSYNC, LCD_PAD_CONFIG_DATA);

    9.     /* RGB565数据信号线,
    10.      DATA0~DATA4:B3~B7
    11.      DATA5~DATA10:G2~G7
    12.      DATA11~DATA15:R3~R7 */
    13.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_04_LCD_DATA00, LCD_PAD_CONFIG_DATA);
    14.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_05_LCD_DATA01, LCD_PAD_CONFIG_DATA);
    15.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_06_LCD_DATA02, LCD_PAD_CONFIG_DATA);  
    16.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_07_LCD_DATA03, LCD_PAD_CONFIG_DATA);
    17.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_08_LCD_DATA04, LCD_PAD_CONFIG_DATA);
    18.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_09_LCD_DATA05, LCD_PAD_CONFIG_DATA);
    19.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_10_LCD_DATA06, LCD_PAD_CONFIG_DATA);
    20.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_11_LCD_DATA07, LCD_PAD_CONFIG_DATA);  
    21.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_12_LCD_DATA08, LCD_PAD_CONFIG_DATA);  
    22.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_13_LCD_DATA09, LCD_PAD_CONFIG_DATA);
    23.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_14_LCD_DATA10, LCD_PAD_CONFIG_DATA);
    24.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_15_LCD_DATA11, LCD_PAD_CONFIG_DATA);
    25.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_00_LCD_DATA12, LCD_PAD_CONFIG_DATA);
    26.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_01_LCD_DATA13, LCD_PAD_CONFIG_DATA);
    27.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_02_LCD_DATA14, LCD_PAD_CONFIG_DATA);
    28.     IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_03_LCD_DATA15, LCD_PAD_CONFIG_DATA);
    29.    
    30.     /* LCD_BL背光控制信号线 */
    31.     IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_15_GPIO1_IO15, LCD_PAD_CONFIG_DATA);
    32. }
    复制代码


    初始化ELCDIF外设

    1. static void LCD_ELCDIF_Config(void)
    2. {        
    3.     const elcdif_rgb_mode_config_t config = {
    4.         .panelWidth = LCD_PIXEL_WIDTH,
    5.         .panelHeight = LCD_PIXEL_HEIGHT,
    6.         .hsw = APP_HSW,
    7.         .hfp = APP_HFP,
    8.         .hbp = APP_HBP,
    9.         .vsw = APP_VSW,
    10.         .vfp = APP_VFP,
    11.         .vbp = APP_VBP,
    12.         .polarityFlags = APP_POL_FLAGS,
    13.         .bufferAddr = (uint32_t)s_psBufferLcd[0],
    14.         .pixelFormat = kELCDIF_PixelFormatXRGB8888,
    15.         .dataBus = APP_LCDIF_DATA_BUS,
    16.     };

    17.   ELCDIF_RgbModeInit(APP_ELCDIF, &config);
    18.   ELCDIF_RgbModeStart(APP_ELCDIF);
    19. }
    复制代码


    初始化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);
    }


    初始化液晶屏
    1. void LCD_Init(bool enableInterrupt)
    2. {
    3.   *((uint32_t *)0x41044100) = 0x0000000f;
    4.         *((uint32_t *)0x41044104) = 0x0000000f;

    5.   LCD_IOMUXC_MUX_Config();
    6.   LCD_IOMUXC_PAD_Config();
    7.   LCD_ELCDIF_Config();
    8.   LCD_InitClock();
    9.   LCD_BackLight_ON();
    10.   
    11.   if(enableInterrupt)
    12.   {
    13.     LCD_InterruptConfig();
    14.   }
    15. }
    复制代码


    画点函数
    1. void PutPixel(uint16_t Xpos, uint16_t Ypos)
    2. {   
    3.         if ( ( Xpos < LCD_PIXEL_WIDTH ) && ( Ypos < LCD_PIXEL_HEIGHT ) )
    4.   {
    5.                 *(uint32_t *)(CurrentFrameBuffer + APP_BPP*(Xpos + (LCD_PIXEL_WIDTH*Ypos))) = CurrentTextColor;
    6.         }
    7. }
    复制代码


    绘图API
    QQ截图20180615234145.jpg






    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 15:24 , Processed in 0.121397 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.