查看: 2000|回复: 1

[分享] 【MCX-N947分享】--7. LVGL移植

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-30 22:42
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    7

    主题

    21

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    250
    最后登录
    2024-6-15
    发表于 2024-4-30 22:24:55 | 显示全部楼层 |阅读模式
    本帖最后由 dirty123 于 2024-4-30 22:39 编辑

          本篇讲述MCX-N947-BRK开发板LVGL移植。
    一.硬件准备
          使用ST7735S驱动IC的LCD屏,官方有现成的ST7796S驱动显示屏的demo,这里作为参考,适配自己手头的屏。
    1_LCD屏原理.jpg
    图1:ST7735S LCD原理接口

    2_开发板LCD接口.jpg
    图2:开发板LCD接口


    硬件连接如下:
    LCD模块      开发板            功能
    SCL             P4_1          SPI的时钟线
    SDA            P4_0          SPI的数据线
    RES             P4_7         LCD复位
    DC              P0_7         LCD数据/命令选择引脚
    CS              P0_12        LCD显示屏片选信号,低电平有效
    BLK            P0_13        背光控制开关

    4_屏实物.jpg
    图3:开发板与LCD连接


    二.代码准备
    1.打开mcxn9xxevk_lvgl_guider工程,在lcdc文件加下移植添加fsl_st7735s.c,fsl_st7735s.h源文件
    3_工程添加.jpg
    图4:工程添加

    2.在fsl_st7735s.c里的配置寄存器
    1. static const uint8_t s_st7735s_driver_preset_pars035[] = {
    2.     // /* clang-format off */
    3.     // 0x01, ST7735S_CMD_CSCON,   0xC3,                            // Enable command part 1
    4.     // 0x01, ST7735S_CMD_CSCON,   0x96,                            // Enable command part 2
    5.     // 0x01, ST7735S_CMD_INVTR,   0x01,                            // Display inversion
    6.     // 0x02, ST7735S_CMD_FRMCTR1, 0x80, 0x10,                      // Frame rate control 1
    7.     // 0x04, ST7735S_CMD_BPC,     0x1F, 0x50, 0x00, 0x20,          // Blanking porch control
    8.     // 0x03, ST7735S_CMD_DFC,     0x8A, 0x07, 0x3B,                // Display function control
    9.     // 0x02, ST7735S_CMD_PWR1,    0x80, 0x64,                      // Power control 1
    10.     // 0x01, ST7735S_CMD_PWR2,    0x13,                            // Power control 2
    11.     // 0x01, ST7735S_CMD_PWR3,    0xA7,                            // Power control 3
    12.     // 0x01, ST7735S_CMD_VCMPCTL, 0x09,                            // VCOM control
    13.     // 0x08, ST7735S_CMD_DOCA,    0x40, 0x8A, 0x00, 0x00, 0x29, 0x19, 0xA5, 0x33, // DOCA
    14.     // 0x0E, ST7735S_CMD_PGC,     0xF0, 0x06, 0x0B, 0x07, 0x06, 0x05, 0x2E, 0x33, 0x47, 0x3A, 0x17, 0x16, 0x2E, 0x31, // PGC
    15.     // 0x0E, ST7735S_CMD_NGC,     0xF0, 0x09, 0x0D, 0x09, 0x08, 0x23, 0x2E, 0x33, 0x46, 0x38, 0x13, 0x13, 0x2C, 0x32, // NGC
    16.     // 0x01, ST7735S_CMD_CSCON,   0x3C, // Disable command part 1
    17.     // 0x01, ST7735S_CMD_CSCON,   0x69, // Disable command part 2
    18.     // /* clang-format on */
    19.     #if 0
    20.     0x03, ST7735S_CMD_FRMCTR1,  0x00,0x08,0x05,//0x01,0x2C,0x2D,
    21.     0x03, ST7735S_CMD_FRMCTR2,  0x05,0x3A,0x3A,//0x01,0x2C,0x2D,
    22.     0x06, ST7735S_CMD_FRMCTR3,  0x05,0x3A,0x3A,0x05,0x3A,0x3A,//0x01,0x2C,0x2D,0x01,0x2C,0x2D,
    23.     0x01, ST7735S_CMD_FRMCTR4,  0x03,//0x07,
    24.     0x03, ST7735S_CMD_PWR1,     0x62,0x02,0x04,//0xA2,0x02,0x84,0xC1,
    25.     0x01, ST7735S_CMD_PWR2,     0xC0,//0xC5,
    26.     0x02, ST7735S_CMD_PWR3,     0xD0,0x00,//0x0A,0x00,
    27.     0x02, ST7735S_CMD_PWR4,     0x8D,0x6A,//0x8A,0x2A,
    28.     0x02, ST7735S_CMD_PWR5,     0x8D,0xEE,//0x8A,0xEE,
    29.     0x01, ST7735S_CMD_VCMPCTL,  0x08,//0x0E,
    30.     0x01, ST7735S_CMD_MADCTL,   0xC8, //竖屏--0xC8,横屏--0xA8,竖屏翻转180度--0x08,横屏翻转180度--0x68
    31.     0x10, ST7735S_CMD_PGC,      0x03,0x1B,0x12,0x11,0x3F,0x3A,0x32,0x34,0x2F,0x2B,0x30,0x3A,0x00,0x01,0x02,0x05,//0x0F,0x1A,0x0F,0x18,0x2F,0x28,0x20,0x22,0x1F,0x1B,0x23,0x37,0x00,0x07,0x02,0x10,
    32.     0x10, ST7735S_CMD_NGC,      0x03,0x1B,0x12,0x11,0x32,0x2F,0x2A,0x2F,0x2E,0x2C,0x35,0x3F,0x00,0x00,0x01,0x05,//0x0F,0x1B,0x0F,0x17,0x33,0x2C,0x29,0x2E,0x30,0x30,0x39,0x3F,0x00,0x07,0x03,0x10,
    33.     // 0x01, ST7735S_CMD_CSCON,    0x01,
    34.     // 0x01, ST7735S_CMD_LP,       0x00,
    35.     0x01, ST7735S_CMD_COLMOD,   0x05, //65K mode
    36.     #else
    37.     0x03,0xB1,0x00,0x08,0x05,
    38.     0x03,0xB2,0x05,0x3A,0x3A,
    39.     0x06,0xB3,0x05,0x3A,0x3A,0x05,0x3A,0x3A,
    40.     0x01,0xB4,0x03,
    41.     0x03,0xC0,0x62,0x02,0x04,
    42.     0x01,0xC1,0xc0,
    43.     0x02,0xC2,0x0D,0x00,
    44.     0x02,0xC3,0x8D,0x6A,
    45.     0x02,0xC4,0x8D,0xEE,
    46.     0x01,0xC5,0x08,
    47.     0x10,0xE0,0x03,0x1B,0x12,0x11,0x3F,0x3A,0x32,0x34,0x2F,0x2B,0x30,0x3A,0x00,0x01,0x02,0x05,
    48.     0x10,0xE1,0x03,0x1B,0x12,0x11,0x32,0x2F,0x2A,0x2F,0x2E,0x2C,0x35,0x3F,0x00,0x00,0x01,0x05,
    49.     0x01,0x3A,0x05,

    50.     #endif

    51. };
    复制代码
    2.在board\lvgl_support.h修改屏的参数及相关宏

    1. #ifndef BOARD_LCD_S035
    2. #define BOARD_LCD_S035  1//0
    3. #endif

    4. #if BOARD_LCD_S035
    5. #define LCD_WIDTH  165//480
    6. #define LCD_HEIGHT 128//320
    7. #else
    8. #define LCD_WIDTH  800
    9. #define LCD_HEIGHT 480
    10. #endif
    复制代码
    3.对LVGL代码了解

    (1)在main函数 BOARD_I2C_ReleaseBus();对I2C初始化。BOARD_InitBootPins(void)对开发板及LCD引脚初始化。
    (2)在[size=13.3333px]source\lvgl_guider.c,board\lvgl_support.h宏定义了引脚
    1. //source\lvgl_guider.c
    2. #define I2C_RELEASE_SDA_PORT  PORT4
    3. #define I2C_RELEASE_SCL_PORT  PORT4
    4. #define I2C_RELEASE_SDA_GPIO  GPIO4
    5. #define I2C_RELEASE_SDA_PIN   0U
    6. #define I2C_RELEASE_SCL_GPIO  GPIO4
    7. #define I2C_RELEASE_SCL_PIN   1U
    8. #define I2C_RELEASE_BUS_COUNT 100U
    复制代码

    1. //board\lvgl_support.h
    2. /* LCD panel. */
    3. #define BOARD_LCD_RST_GPIO GPIO4
    4. #define BOARD_LCD_RST_PIN  7
    5. #define BOARD_LCD_TE_GPIO  GPIO0
    6. #define BOARD_LCD_TE_PIN   13
    7. #define BOARD_LCD_CS_GPIO  GPIO0
    8. #define BOARD_LCD_CS_PIN   12
    9. #define BOARD_LCD_RS_GPIO  GPIO0
    10. #define BOARD_LCD_RS_PIN   7
    11. #define BOARD_LCD_INT_PORT PORT4
    12. #define BOARD_LCD_INT_GPIO GPIO4
    13. #define BOARD_LCD_INT_PIN  6
    复制代码
    (3)Deno_FlushDisplay刷新函数是一个很重要函数,为设定区域与现实颜色。
    (4)lvgl任务AppTask
    1. static void AppTask(void *param)
    2. {

    3. #if LV_USE_LOG
    4.     lv_log_register_print_cb(print_cb);
    5. #endif

    6.     lv_port_pre_init();
    7.     lv_init();
    8.     lv_port_disp_init();
    9.     lv_port_indev_init();

    10.     s_lvgl_initialized = true;

    11.     PRINTF("To Run User UI ...\r\n");
    12.     setup_ui(&guider_ui);
    13.     events_init(&guider_ui);
    14.     custom_init(&guider_ui);

    15.     for (;;)
    16.     {
    17.         lv_task_handler();
    18.         vTaskDelay(5);
    19.     }

    20. }
    复制代码


    lv_port_pre_init();lv_init();lv_port_disp_init();/*这三个是LCD显示初始化,包含申请RAM空间,屏横竖像素配置等*/
    lv_port_indev_init();//这个是关于触摸的
    setup_ui(&guider_ui);//设置UI界面
    lv_task_handler(); // LVGL时钟节拍更新

           至此,LVGL移植框架基本完成了。但自己烧录测验时屏没有正确显示,花了比较长时间对着寄存器配置找也没发现问题点。文末附上这工程代码和屏驱动参照。有经验的小伙伴可以一起交流下,后续有时间这块再研究下。



    LCD_Driver.rar

    15.24 KB, 下载次数: 0, 下载积分: 威望 1

    LCD驱动参考

    mcxn9xxevk_lvgl_guider.rar

    13.15 MB, 下载次数: 0, 下载积分: 威望 1

    ST7735S LCD LVGL

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 292 天

    连续签到: 1 天

    [LV.8]以坛为家I

    82

    主题

    1161

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3027
    最后登录
    2025-7-22
    发表于 2024-6-3 10:42:58 | 显示全部楼层
    打卡打卡,插个眼后面等屏到了
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-27 12:25 , Processed in 0.080640 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表