SF32LB52x-DevKit-LCD添加SPI-LCD实例(外置)

1 确认rt-driver工程正常运行

调屏推荐采用rt-driver工程,调试前确认rt-driver工程能正常运行并有Log打印

1.1 编译

进入example\rt_driver\project目录,右键选择ComEmu_Here弹出编译命令串口,依次执行

> D:\sifli\git\sdk\v2.2.4\set_env.bat   #设置编译环境路径
> scons --board=sf32lb52-lcd_n16r8 -j8   #指定sf32lb52-lcd_n16r8模块编译rt-driver工程

alt text

1.2 进入BOOT模式

确认sf32lb52-lcd_n16r8模块板进入boot模式便于下载,如下图操作
alt text

1.3 下载

> build_sf32lb52-lcd_n16r8\uart_download.bat

     Uart Download

please input the serial port num:7 #然后选择sf32lb52-lcd_n16r8模块连接的串口号进行下载 

1.4 确认正常LOG

如下图,运行用户程序需要去掉勾选进入BOOT选项,确认板子跑起来后,就可以继续下一步添加新屏幕模组
alt text

2 添加屏驱gc9107

2.1 创建gc9107驱动

1)在新的屏驱文件夹sdk-demo中添加工程和修改Kconfig.proj文件
复制SDK\example\rt_driver(如果已有外置的工程,可以直接在工程中进行修改添加),并修改名称,以屏驱名称命名multi_screen放在SDK外部。并在project中修改Konfig.proj文件添加内容如下

#APP specific configuration.

comment "------------Project configuration-----------"  

if !BSP_USING_BUILT_LCD
    ···
endif

2)修改proj.conf文件

  • project\proj.conf中添加# CONFIG_BSP_USING_BUILTIN_LCD is not set,用来使用外置屏驱,关闭SDK内部屏驱。
    如果想单独某个板子使用外置屏驱,或者使用内置屏驱,需要再project目录下新建文件例如sf32lb52-lcd_n16r8/proj.conf 其中添加# CONFIG_BSP_USING_BUILTIN_LCD is not setCONFIG_BSP_USING_BUILTIN_LCD=y 3) 复制驱动
    SDK内屏驱动位于sdk\customer\peripherals内,复制一份其他spi接口的驱动放在新创建的屏驱文件夹sdk-demo中并更名为qspi_gc9107

2.3 Menuconfig选中gc9107_Multi_screen

以上步骤完成后,编译窗口输入下面命令,并选中刚添加的gc9107_Multi_screen屏
menuconfig --board=sf32lb52-lcd_n16r8 (打开menuconfig窗口) 在这个路径下(Top) →Custom LCD driver选中刚添加的屏,示例如下,保存退出,即选中了spi_gc9107_Multi_screen目录下屏驱动参加编译
alt text

3 屏硬件连接

3.1 排线连接

如果购买的是匹配的屏幕模组,直接排线连接到插座即可,如下图
alt text

3.2 飞线连接

如果新的屏幕模组,排线排列不一致,就需要自己设计排线转接板或者从插针飞线调试。
转接板的设计可以参考SF32LB52-DevKit-LCD转接板制作指南

4 屏驱动配置

4.1 默认IO配置

如果采用的默认IO,此处可以跳过

4.1.1 IO模式设置

LCD采用的是LCDC1硬件来输出波形,需配置为对应的FUNC模式,
每个IO有哪些Funtion可以参考硬件文档 下载SF32LB52X_Pin_config
alt text
LCD和TP的RESET脚都是采用GPIO模式,则默认已经配置为GPIO模式

 HAL_PIN_Set(PAD_PA00, GPIO_A0,  PIN_NOPULL, 1);     // #LCD_RESETB
 HAL_PIN_Set(PAD_PA09, GPIO_A9,  PIN_NOPULL, 1);     // CTP_RESET

4.1.2 IO上下电操作

下面是上电LCD初始化流程
rt_hw_lcd_ini->api_lcd_init->lcd_task->lcd_hw_open->BSP_LCD_PowerUp-find_right_driver->LCD_drv.LCD_Init->LCD_drv.LCD_ReadID->lcd_set_brightness->LCD_drv.LCD_DisplayOn
可以看到上电BSP_LCD_PowerUp在屏驱动初始化LCD_drv.LCD_Init之前
所以需要在初始化LCD前,确保BSP_LCD_PowerUp中已经打开LCD供电
alt text

4.1.3 背光PWM配置

pwm软件中有一个默认配置,配置在文件customer\boards\sf32lb52-lcd_n16r8\Kconfig.board中,此Kconfig.board的配置会编译后在rtconfig.h中生成下面3个宏

//PWM3需要打开GPTIM2,PWM和TIMER对应关系,可以查看FAQ的PWM部分或者文件`pwm_config.h`
#define LCD_PWM_BACKLIGHT_INTERFACE_NAME "pwm3" //pwm设备名
#define LCD_PWM_BACKLIGHT_CHANEL_NUM 4 //Channel 4
#define LCD_BACKLIGHT_CONTROL_PIN 1 //PA01

用PWM3需要用到GPTIM2(位于Hcpu)输出,还需确认rtconfig.h下面宏是否生效

#define BSP_USING_GPTIM2 1 //如果用PWM3,需要menuconfig --board=sf32lb52-lcd_n16r8打开
#define RT_USING_PWM 1
#define BSP_USING_PWM 1
#define BSP_USING_PWM3 1 //如果没有,需要menuconfig --board=sf32lb52-lcd_n16r8打开

如下文件pwm_config.hpwm3GPTIM2的对应关系

#ifdef BSP_USING_PWM3
#define PWM3_CONFIG                             \
    {                                           \
       .tim_handle.Instance     = GPTIM2,         \
       .tim_handle.core         = PWM3_CORE,    \
       .name                    = "pwm3",       \
       .channel                 = 0             \
    }
#endif /* BSP_USING_PWM3 */

alt text
软件默认PA01从GPTIM2"pwm3"设备输出PWM波形,默认配置在
alt text

HAL_PIN_Set(PAD_PA01, GPTIM2_CH4, PIN_NOPULL, 1);   // LCDC1_BL_PWM_CTRL, LCD backlight PWM

备注:
通过函数HAL_PIN_Set配置后,GPTIM2_CH4跟PA01的对应关系就会建立起来,具体体现在寄存器配置hwp_hpsys_cfg->GPTIM2_PINR中,如下图:
alt text
可以看到可以配置为CH1-CH4输出,而且必须是PA00-PA44口

4.2 屏驱复位时序

下面几个延时比较关键,需要参照屏驱IC相关文档的初始化时序,谨慎修改

    BSP_LCD_Reset(0);//Reset LCD
    HAL_Delay_us(20);
    BSP_LCD_Reset(1);

4.3 屏驱寄存器修改

每个屏驱IC的初始化寄存器配置差异较大,需要按照屏厂提供的寄存器参数,按照他们的SPI时序依次通过SPI写入屏驱IC,特别注意0x11寄存器后的延时长度要求

    LCD_WriteReg_More(hlcdc, 0x11, parameter, 1);
    LCD_DRIVER_DELAY_MS(120);

    LCD_WriteReg_More(hlcdc, 0xFE, parameter, 0); // internal reg enable
    LCD_WriteReg_More(hlcdc, 0xEF, parameter, 0); // internal reg enable

4.4 屏驱参数配置

  • .lcd_itf : 选择LCDC_INTF_SPI_DCX_1DATA表示SPI 1线模式

  • .freq :选择48000000,表示SPI的clk主频为48Mhz,这个时钟要依据屏驱IC支持的最高时钟来选择,越高每帧送数时间越短,帧率会越高

  • .color_mode :选择RGB565 还是RGB888格式

  • .syn_mode :选择是否启用TE防撕裂功能,如果启动TE,屏驱IC无TE信号,不会送屏,会出现Timeout死机,前期调试建议关闭TE

  • .vsyn_polarity :选择TE的极性

  • .vsyn_delay_us :选择TE波形到来后多久LCDC1开始送数给屏驱IC

  • .readback_from_Dx : 选择QSPI读Chipid时,屏驱IC的数据是从D0-D3的哪条信号线输出(参照屏驱IC手册)

static LCDC_InitTypeDef lcdc_int_cfg =
{
    .lcd_itf = LCDC_INTF_SPI_DCX_1DATA,
    .freq = 48000000,
    .color_mode = LCDC_PIXEL_FORMAT_RGB565,
    .cfg = {
        .spi = {

            .dummy_clock = 0,
            .syn_mode = HAL_LCDC_SYNC_DISABLE,
            .vsyn_polarity = 0,
            .vsyn_delay_us = 0,
            .hsyn_num = 0,
        },
    },

};

5 编译烧录下载结果

5.1 显示结果展示

如下图,如果显示正常会依次6种图像,3秒定时循环显示
alt text