【前言】
GD32H759拥有强大的显示功能,能轻松的驱动RGB屏,当然离不开LVGL这个强大的图形工具!由于此开发板刚推出来,查不到任何相关的LVGL的移植先例,花费了好几天,终于成功,特此分享如下:
【移植步骤】
1、下载官方源码:Gitee 极速下载/littlevGL
2、新建littlevlg文件夹,把src目录下的相关文件复制进来,复制后目录如下:

由于源码需要添加的目录太多,我这里根据网友的经验,把相关文件整一下,各位也可以根据其他的移植方法添加相关的文件与目录。
image.png
3、把以上文件下examples的目录,的所有文件均添加进工种分组中。
image.png
4、新建工程分组lvgl/porting,新建littlevgl_support.c以及.h文件。
5、在littlevgl_support.c,分别驱动屏幕驱动以及sram驱动。详细代码如下:
  1. #include "gd32h7xx.h"
  2. #include "systick.h"
  3. #include <stdio.h>
  4. #include "main.h"
  5. #include "gd32h759i_eval.h"
  6. #include "littlevgl_support.h"
  7. #include "lvgl.h"
  8. #include "lv_conf.h"
  9. /*******************************************************************************
  10. * Definitions
  11. ******************************************************************************/

  12. #define HORIZONTAL_SYNCHRONOUS_PULSE  41
  13. #define HORIZONTAL_BACK_PORCH         2
  14. #define ACTIVE_WIDTH                  480
  15. #define HORIZONTAL_FRONT_PORCH        2

  16. #define VERTICAL_SYNCHRONOUS_PULSE    10
  17. #define VERTICAL_BACK_PORCH           2
  18. #define ACTIVE_HEIGHT                 272
  19. #define VERTICAL_FRONT_PORCH          2
  20. /*******************************************************************************
  21. * Prototypes
  22. ******************************************************************************/
  23. static void DEMO_FlushDisplay(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);
  24. static bool DEMO_ReadTouch(lv_indev_drv_t * indev_drv, lv_indev_data_t *data);

  25. static void tli_gpio_config(void);
  26. static void tli_config_twolayout(void);

  27. /*******************************************************************************
  28. * Variables
  29. ******************************************************************************/
  30. static volatile bool s_framePending;

  31. // static lv_color_t buf2_1[LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL]; /*A buffer for 10 rows*/
  32. // static lv_color_t buf2_2[LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL]; /*An other buffer for 10 rows*/

  33. /*******************************************************************************
  34. * SDRAM
  35. ******************************************************************************/
  36. // #include "exmc_sdram.h"
  37. /* Define mode register content */
  38. /* Burst Length */
  39. #define SDRAM_MODEREG_BURST_LENGTH_1             ((uint16_t)0x0000)
  40. #define SDRAM_MODEREG_BURST_LENGTH_2             ((uint16_t)0x0001)
  41. #define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)
  42. #define SDRAM_MODEREG_BURST_LENGTH_8             ((uint16_t)0x0003)

  43. /* Burst Type */
  44. #define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)
  45. #define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((uint16_t)0x0008)

  46. /* CAS Latency */
  47. #define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)
  48. #define SDRAM_MODEREG_CAS_LATENCY_3              ((uint16_t)0x0030)

  49. /* Write Mode */
  50. #define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
  51. #define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200)

  52. #define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)

  53. #define SDRAM_TIMEOUT                            ((uint32_t)0x0000FFFF)

  54. #define SDRAM_DEVICE0_ADDR                         ((uint32_t)0xC0000000)

  55. /*!
  56.     \brief      sdram peripheral initialize
  57.     \param[in]  sdram_device: specifie the SDRAM device
  58.     \param[out] none
  59.     \retval     none
  60. */
  61. void exmc_synchronous_dynamic_ram_init(uint32_t sdram_device)
  62. {
  63.      exmc_sdram_parameter_struct sdram_init_struct;
  64.     exmc_sdram_timing_parameter_struct sdram_timing_init_struct;
  65.     exmc_sdram_command_parameter_struct sdram_command_init_struct;

  66.     uint32_t command_content = 0, bank_select;
  67.     uint32_t timeout = SDRAM_TIMEOUT;

  68.     /* enable EXMC clock */
  69.     rcu_periph_clock_enable(RCU_EXMC);
  70.     rcu_periph_clock_enable(RCU_GPIOA);
  71.     rcu_periph_clock_enable(RCU_GPIOC);
  72.     rcu_periph_clock_enable(RCU_GPIOD);
  73.     rcu_periph_clock_enable(RCU_GPIOE);
  74.     rcu_periph_clock_enable(RCU_GPIOF);
  75.     rcu_periph_clock_enable(RCU_GPIOG);
  76.     rcu_periph_clock_enable(RCU_GPIOH);

  77.     /* common GPIO configuration */
  78.     /* SDNE0(PC2),SDCKE0(PC3) D12(PC0) pin configuration */
  79.     gpio_af_set(GPIOC, GPIO_AF_12, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_0);
  80.     gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_0);
  81.     gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_0);

  82.     /* D2(PD0),D3(PD1),D13(PD8),D14(PD9),D15(PD10),D0(PD14),D1(PD15) pin configuration */
  83.     gpio_af_set(GPIOD, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 |
  84.                 GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
  85.     gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_8 | GPIO_PIN_9 |
  86.                   GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
  87.     gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_8 | GPIO_PIN_9 |
  88.                             GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);

  89.     /* NBL0(PE0),NBL1(PE1),D4(PE7),D5(PE8),D6(PE9),D7(PE10),D8(PE11), D9(PE12),D10(PE13),D11(PE14) pin configuration */
  90.     gpio_af_set(GPIOE, GPIO_AF_12, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_7  | GPIO_PIN_8 |
  91.                 GPIO_PIN_9  | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 |
  92.                 GPIO_PIN_14);
  93.     gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_7  | GPIO_PIN_8 |
  94.                   GPIO_PIN_9  | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 |
  95.                   GPIO_PIN_14);
  96.     gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_7  | GPIO_PIN_8 |
  97.                             GPIO_PIN_9  | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 |
  98.                             GPIO_PIN_14);

  99.     /* A0(PF0),A1(PF1),A2(PF2),A3(PF3),A4(PF4),A5(PF5),NRAS(PF11),A6(PF12),A7(PF13),A8(PF14),A9(PF15) pin configuration */
  100.     gpio_af_set(GPIOF, GPIO_AF_12, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_2  | GPIO_PIN_3  |
  101.                 GPIO_PIN_4  | GPIO_PIN_5  | GPIO_PIN_11 | GPIO_PIN_12 |
  102.                 GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  103.     gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_2  | GPIO_PIN_3  |
  104.                   GPIO_PIN_4  | GPIO_PIN_5  | GPIO_PIN_11 | GPIO_PIN_12 |
  105.                   GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  106.     gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_2  | GPIO_PIN_3  |
  107.                             GPIO_PIN_4  | GPIO_PIN_5  | GPIO_PIN_11 | GPIO_PIN_12 |
  108.                             GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);

  109.     /* A10(PG0),A11(PG1),A12(PG2),BA0/A14(PG4),BA1/A15(PG5),SDCLK(PG8),NCAS(PG15) pin configuration */
  110.     gpio_af_set(GPIOG, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 |
  111.                 GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
  112.     gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 |
  113.                   GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
  114.     gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 |
  115.                             GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
  116.     /* SDNWE(PH5) pin configuration */
  117.     gpio_af_set(GPIOH, GPIO_AF_12, GPIO_PIN_5);
  118.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_5);
  119.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, GPIO_PIN_5);

  120.     /* specify which SDRAM to read and write */
  121.     if(EXMC_SDRAM_DEVICE0 == sdram_device) {
  122.         bank_select = EXMC_SDRAM_DEVICE0_SELECT;
  123.     } else {
  124.         bank_select = EXMC_SDRAM_DEVICE1_SELECT;
  125.     }

  126.     /* EXMC SDRAM device initialization sequence --------------------------------*/
  127.     /* Step 1 : configure SDRAM timing registers --------------------------------*/
  128.     /* LMRD: 2 clock cycles */
  129.     sdram_timing_init_struct.load_mode_register_delay = 4;
  130.     /* XSRD: min = 67ns */
  131.     sdram_timing_init_struct.exit_selfrefresh_delay = 24;
  132.     /* RASD: min=42ns , max=120k (ns) */
  133.     sdram_timing_init_struct.row_address_select_delay = 16;
  134.     /* ARFD: min=60ns */
  135.     sdram_timing_init_struct.auto_refresh_delay = 11;
  136.     /* WRD:  min=1 Clock cycles +6ns */
  137.     sdram_timing_init_struct.write_recovery_delay = 4;
  138.     /* RPD:  min=18ns */
  139.     sdram_timing_init_struct.row_precharge_delay = 8;
  140.     /* RCD:  min=18ns */
  141.     sdram_timing_init_struct.row_to_column_delay = 6;

  142.     /* step 2 : configure SDRAM control registers ---------------------------------*/
  143.     sdram_init_struct.sdram_device = sdram_device;
  144.     sdram_init_struct.column_address_width = EXMC_SDRAM_COW_ADDRESS_9;
  145.     sdram_init_struct.row_address_width = EXMC_SDRAM_ROW_ADDRESS_13;
  146.     sdram_init_struct.data_width = EXMC_SDRAM_DATABUS_WIDTH_16B;
  147.     sdram_init_struct.internal_bank_number = EXMC_SDRAM_4_INTER_BANK;
  148.     sdram_init_struct.cas_latency = EXMC_CAS_LATENCY_3_SDCLK;
  149.     sdram_init_struct.write_protection = DISABLE;
  150.     sdram_init_struct.sdclock_config = EXMC_SDCLK_PERIODS_3_CK_EXMC;
  151.     sdram_init_struct.burst_read_switch = ENABLE;
  152.     sdram_init_struct.pipeline_read_delay = EXMC_PIPELINE_DELAY_1_CK_EXMC;
  153.     sdram_init_struct.timing = &sdram_timing_init_struct;
  154.     /* EXMC SDRAM bank initialization */
  155.     exmc_sdram_init(&sdram_init_struct);

  156.     /* step 3 : configure CKE high command---------------------------------------*/
  157.     sdram_command_init_struct.command = EXMC_SDRAM_CLOCK_ENABLE;
  158.     sdram_command_init_struct.bank_select = bank_select;
  159.     sdram_command_init_struct.auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_1_SDCLK;
  160.     sdram_command_init_struct.mode_register_content = 0;
  161.     /* wait until the SDRAM controller is ready */
  162.     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0)) {
  163.         timeout--;
  164.     }
  165.     /* send the command */
  166.     exmc_sdram_command_config(&sdram_command_init_struct);

  167.     /* step 4 : insert 10ms delay----------------------------------------------*/
  168.     delay_1ms(100);

  169.     /* step 5 : configure precharge all command----------------------------------*/
  170.     sdram_command_init_struct.command = EXMC_SDRAM_PRECHARGE_ALL;
  171.     sdram_command_init_struct.bank_select = bank_select;
  172.     sdram_command_init_struct.auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_1_SDCLK;
  173.     sdram_command_init_struct.mode_register_content = 0;
  174.     /* wait until the SDRAM controller is ready */
  175.     timeout = SDRAM_TIMEOUT;
  176.     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0)) {
  177.         timeout--;
  178.     }
  179.     /* send the command */
  180.     exmc_sdram_command_config(&sdram_command_init_struct);

  181.     /* step 6 : configure Auto-Refresh command-----------------------------------*/
  182.     sdram_command_init_struct.command = EXMC_SDRAM_AUTO_REFRESH;
  183.     sdram_command_init_struct.bank_select = bank_select;
  184.     sdram_command_init_struct.auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_8_SDCLK;
  185.     sdram_command_init_struct.mode_register_content = 0;
  186.     /* wait until the SDRAM controller is ready */
  187.     timeout = SDRAM_TIMEOUT;
  188.     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0)) {
  189.         timeout--;
  190.     }
  191.     /* send the command */
  192.     exmc_sdram_command_config(&sdram_command_init_struct);

  193.     /* step 7 : configure load mode register command-----------------------------*/
  194.     /* program mode register */
  195.     command_content = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1        |
  196.                       SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
  197.                       SDRAM_MODEREG_CAS_LATENCY_3           |
  198.                       SDRAM_MODEREG_OPERATING_MODE_STANDARD |
  199.                       SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

  200.     sdram_command_init_struct.command = EXMC_SDRAM_LOAD_MODE_REGISTER;
  201.     sdram_command_init_struct.bank_select = bank_select;
  202.     sdram_command_init_struct.auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_1_SDCLK;
  203.     sdram_command_init_struct.mode_register_content = command_content;

  204.     /* wait until the SDRAM controller is ready */
  205.     timeout = SDRAM_TIMEOUT;
  206.     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0)) {
  207.         timeout--;
  208.     }
  209.     /* send the command */
  210.     exmc_sdram_command_config(&sdram_command_init_struct);

  211.     /* step 8 : set the auto-refresh rate counter--------------------------------*/
  212.     /* 64ms, 8192-cycle refresh, 64ms/8192=7.81us */
  213.     /* SDCLK_Freq = SYS_Freq/2 */
  214.     /* (7.81 us * SDCLK_Freq) - 20 */
  215.     exmc_sdram_refresh_count_set(1542);

  216.     /* wait until the SDRAM controller is ready */
  217.     timeout = SDRAM_TIMEOUT;
  218.     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0)) {
  219.         timeout--;
  220.     }
  221. }


  222. /*******************************************************************************
  223. * Code
  224. ******************************************************************************/
  225. void lv_port_disp_init(void)
  226. {
  227.     /*-------------------------
  228.      * Initialize your display
  229.      * -----------------------*/
  230.     exmc_synchronous_dynamic_ram_init(EXMC_SDRAM_DEVICE0);
  231.     delay_1ms(1);
  232.     memset((void *)EXT_BUFFER0_ADDR, 0, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL*4);
  233.     memset((void *)EXT_BUFFER1_ADDR, 0, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL*4);
  234.        
  235.     tli_gpio_config();
  236.     tli_config_twolayout();
  237.     tli_layer_enable(LAYER0);
  238.     tli_reload_config(TLI_REQUEST_RELOAD_EN);
  239.     tli_enable();


  240.     /*-----------------------------------
  241.      * Register the display in LittlevGL
  242.      *----------------------------------*/

  243.     lv_disp_drv_t disp_drv;      /*Descriptor of a display driver*/
  244.     lv_disp_drv_init(&disp_drv); /*Basic initialization*/

  245.     /*Set up the functions to access to your display*/
  246.     // static lv_disp_buf_t disp_buf_2;
  247.     // lv_disp_buf_init(&disp_buf_2, buf2_1, buf2_2, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL);   /*Initialize the display buffer*/
  248.     // disp_drv.buffer = &disp_buf_2;

  249.         static lv_disp_buf_t disp_buf;
  250.     lv_disp_buf_init(&disp_buf, (void *)EXT_BUFFER0_ADDR, (void *)EXT_BUFFER1_ADDR, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL);
  251.     disp_drv.buffer = &disp_buf;

  252.     disp_drv.hor_res = LCD_WIDTH;
  253.     disp_drv.ver_res = LCD_HEIGHT;

  254.     /*Used in buffered mode (LV_VDB_SIZE != 0  in lv_conf.h)*/
  255.     disp_drv.flush_cb = DEMO_FlushDisplay;

  256.     /*Finally register the driver*/
  257.     lv_disp_drv_register(&disp_drv);
  258. }


  259. /* Flush the content of the internal buffer the specific area on the display
  260. * You can use DMA or any hardware acceleration to do this operation in the background but
  261. * 'lv_disp_flush_ready()' has to be called when finished*/
  262. static void DEMO_FlushDisplay(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
  263. {
  264.     if (color_p == EXT_BUFFER0_ADDR)
  265.     {
  266.         tli_layer_disable(LAYER0);
  267.         tli_layer_enable(LAYER1);
  268.         tli_reload_config(TLI_FRAME_BLANK_RELOAD_EN);
  269.     }
  270.     else if (color_p == EXT_BUFFER1_ADDR)
  271.     {
  272.         tli_layer_disable(LAYER1);
  273.         tli_layer_enable(LAYER0);
  274.         tli_reload_config(TLI_FRAME_BLANK_RELOAD_EN);
  275.     }

  276.     /* IMPORTANT!!!
  277.      * Inform the graphics library that you are ready with the flushing*/
  278.     lv_disp_flush_ready(disp_drv);
  279. }

  280. static void tli_config_twolayout(void)
  281. {
  282.     tli_parameter_struct               tli_init_struct;
  283.     tli_layer_parameter_struct         tli_layer_init_struct;

  284.     rcu_periph_clock_enable(RCU_TLI);
  285.     tli_gpio_config();  
  286.     /* configure PLL2 to generate TLI clock 25MHz/25*216/3 = 72MHz */
  287.     rcu_pll_input_output_clock_range_config(IDX_PLL2, RCU_PLL2RNG_1M_2M, RCU_PLL2VCO_150M_420M);
  288.     if(ERROR == rcu_pll2_config(50, 188, 9, 9, 9)) {
  289.         while(1) {
  290.         }
  291.     }
  292.     rcu_pll_clock_output_enable(RCU_PLL2R);
  293.     rcu_tli_clock_div_config(RCU_PLL2R_DIV8);
  294.     rcu_osci_on(RCU_PLL2_CK);

  295.     if(ERROR == rcu_osci_stab_wait(RCU_PLL2_CK)) {
  296.         while(1) {
  297.         }
  298.     }

  299.     /* configure TLI parameter struct */
  300.     tli_init_struct.signalpolarity_hs = TLI_HSYN_ACTLIVE_LOW;
  301.     tli_init_struct.signalpolarity_vs = TLI_VSYN_ACTLIVE_LOW;
  302.     tli_init_struct.signalpolarity_de = TLI_DE_ACTLIVE_LOW;
  303.     tli_init_struct.signalpolarity_pixelck = TLI_PIXEL_CLOCK_TLI;
  304.     /* LCD display timing configuration */
  305.     tli_init_struct.synpsz_hpsz = HORIZONTAL_SYNCHRONOUS_PULSE - 1;
  306.     tli_init_struct.synpsz_vpsz = VERTICAL_SYNCHRONOUS_PULSE - 1;
  307.     tli_init_struct.backpsz_hbpsz = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH - 1;
  308.     tli_init_struct.backpsz_vbpsz = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH - 1;
  309.     tli_init_struct.activesz_hasz = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH + ACTIVE_WIDTH - 1;
  310.     tli_init_struct.activesz_vasz = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH + ACTIVE_HEIGHT - 1;
  311.     tli_init_struct.totalsz_htsz = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH + ACTIVE_WIDTH + HORIZONTAL_FRONT_PORCH - 1;
  312.     tli_init_struct.totalsz_vtsz = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH + ACTIVE_HEIGHT + VERTICAL_FRONT_PORCH - 1;
  313.     /* configure LCD background R,G,B values */
  314.     tli_init_struct.backcolor_red = 0xFF;
  315.     tli_init_struct.backcolor_green = 0xFF;
  316.     tli_init_struct.backcolor_blue = 0xFF;
  317.     tli_init(&tli_init_struct);

  318.     /* TLI layer1 configuration */
  319.     /* TLI window size configuration */
  320.     tli_layer_init_struct.layer_window_leftpos = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH;
  321.     tli_layer_init_struct.layer_window_rightpos = (LCD_WIDTH + HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH - 1);
  322.     tli_layer_init_struct.layer_window_toppos = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH;
  323.     tli_layer_init_struct.layer_window_bottompos = (LCD_HEIGHT + VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH - 1);
  324.     /* TLI window pixel format configuration */
  325.     tli_layer_init_struct.layer_ppf = LAYER_PPF_RGB565;
  326.     /* TLI window specified alpha configuration */
  327.     tli_layer_init_struct.layer_sa = 255;
  328.     /* TLI window blend configuration */
  329.     tli_layer_init_struct.layer_acf1 = LAYER_ACF1_PASA;
  330.     tli_layer_init_struct.layer_acf2 = LAYER_ACF2_PASA;
  331.     /* TLI layer default alpha R,G,B value configuration */
  332.     tli_layer_init_struct.layer_default_alpha = 0;
  333.     tli_layer_init_struct.layer_default_blue = 0xFF;
  334.     tli_layer_init_struct.layer_default_green = 0xFF;
  335.     tli_layer_init_struct.layer_default_red = 0xFF;
  336.     /* TLI layer frame buffer base address configuration */
  337.     tli_layer_init_struct.layer_frame_bufaddr = (uint32_t)EXT_BUFFER0_ADDR;
  338.     tli_layer_init_struct.layer_frame_line_length = ((LCD_WIDTH * 2) + 3);
  339.     tli_layer_init_struct.layer_frame_buf_stride_offset = (LCD_WIDTH * 4);
  340.     tli_layer_init_struct.layer_frame_total_line_number = LCD_HEIGHT;
  341.     tli_layer_init(LAYER1, &tli_layer_init_struct);
  342.   
  343.     /* TLI layer0 configuration */
  344.     tli_layer_init_struct.layer_window_leftpos = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH;
  345.     tli_layer_init_struct.layer_window_rightpos = (LCD_WIDTH + HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH - 1);
  346.     tli_layer_init_struct.layer_window_toppos = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH;
  347.     tli_layer_init_struct.layer_window_bottompos = (LCD_HEIGHT + VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH - 1);
  348.     tli_layer_init_struct.layer_ppf = LAYER_PPF_RGB565;
  349.     /* TLI window specified alpha configuration */
  350.     tli_layer_init_struct.layer_sa = 255;
  351.     /* TLI layer default alpha R,G,B value configuration */
  352.     tli_layer_init_struct.layer_default_blue = 0xFF;
  353.     tli_layer_init_struct.layer_default_green = 0xFF;
  354.     tli_layer_init_struct.layer_default_red = 0xFF;
  355.     tli_layer_init_struct.layer_default_alpha = 0xFF;
  356.     /* TLI window blend configuration */
  357.     tli_layer_init_struct.layer_acf1 = LAYER_ACF1_PASA;
  358.     tli_layer_init_struct.layer_acf2 = LAYER_ACF2_PASA;
  359.     /* TLI layer frame buffer base address configuration */
  360.     tli_layer_init_struct.layer_frame_bufaddr = (uint32_t)EXT_BUFFER1_ADDR;
  361.     tli_layer_init_struct.layer_frame_line_length = ((LCD_WIDTH * 2) + 3);
  362.     tli_layer_init_struct.layer_frame_buf_stride_offset = (LCD_WIDTH * 4);
  363.     tli_layer_init_struct.layer_frame_total_line_number = LCD_HEIGHT;
  364.     tli_layer_init(LAYER0, &tli_layer_init_struct);
  365.     tli_dither_config(TLI_DITHER_ENABLE);
  366. }

  367. /*!
  368.     \brief      configure TLI GPIO
  369.     \param[in]  none
  370.     \param[out] none
  371.     \retval     none
  372. */
  373. void tli_gpio_config(void)
  374. {
  375.     /* enable GPIO clock */
  376.     rcu_periph_clock_enable(RCU_GPIOA);
  377.     rcu_periph_clock_enable(RCU_GPIOB);
  378.     rcu_periph_clock_enable(RCU_GPIOC);
  379.     rcu_periph_clock_enable(RCU_GPIOD);
  380.     rcu_periph_clock_enable(RCU_GPIOE);
  381.     rcu_periph_clock_enable(RCU_GPIOF);
  382.     rcu_periph_clock_enable(RCU_GPIOH);
  383.     rcu_periph_clock_enable(RCU_GPIOG);

  384.     /* configure HSYNC(PE15), VSYNC(PA7), PCLK(PG7) */
  385.     gpio_af_set(GPIOE, GPIO_AF_14, GPIO_PIN_15);
  386.     gpio_af_set(GPIOA, GPIO_AF_14, GPIO_PIN_7);
  387.     gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_7);
  388.     gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);
  389.     gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_15);
  390.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
  391.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_7);
  392.     gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
  393.     gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_7);

  394.     /* configure LCD_R7(PG6), LCD_R6(PH12), LCD_R5(PH11), LCD_R4(PA5), LCD_R3(PH9),LCD_R2(PH8),
  395.                  LCD_R1(PH3), LCD_R0(PH2) */
  396.     gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_6);
  397.     gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_12);
  398.     gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_11);
  399.     gpio_af_set(GPIOA, GPIO_AF_14, GPIO_PIN_5);
  400.     gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_9);
  401.     gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_8);
  402.     gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_3);
  403.     gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_2);

  404.     gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
  405.     gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_6);
  406.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12);
  407.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_12);
  408.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
  409.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_11);
  410.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
  411.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_5);
  412.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
  413.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_9);
  414.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
  415.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_8);
  416.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3);
  417.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_3);
  418.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2);
  419.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_2);

  420.     /* configure  LCD_G7(PD3), LCD_G6(PC7), LCD_G5(PC1), LCD_G4(PH15), LCD_G3(PH14), LCD_G2(PH13),LCD_G1(PB0), LCD_G0(PB1) */
  421.     gpio_af_set(GPIOD, GPIO_AF_14, GPIO_PIN_3);
  422.     gpio_af_set(GPIOC, GPIO_AF_14, GPIO_PIN_7);
  423.     gpio_af_set(GPIOC, GPIO_AF_14, GPIO_PIN_1);
  424.     gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_15);
  425.     gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_14);
  426.     gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_13);
  427.     gpio_af_set(GPIOB, GPIO_AF_14, GPIO_PIN_0);
  428.     gpio_af_set(GPIOB, GPIO_AF_14, GPIO_PIN_1);

  429.     gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3);
  430.     gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_3);
  431.     gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
  432.     gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_7);
  433.     gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
  434.     gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_1);
  435.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);
  436.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_15);
  437.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14);
  438.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_14);
  439.     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13);
  440.     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_13);
  441.     gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_0);
  442.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_0);
  443.     gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
  444.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_1);

  445.     /* configure LCD_B7(PB9), LCD_B6(PB8), LCD_B5(PB5), LCD_B4(PC11), LCD_B3(PG11),LCD_B2(PG10), LCD_B1(PG12), LCD_B0(PG14) */
  446.     gpio_af_set(GPIOB, GPIO_AF_14, GPIO_PIN_9);
  447.     gpio_af_set(GPIOB, GPIO_AF_14, GPIO_PIN_8);
  448.     gpio_af_set(GPIOB, GPIO_AF_3, GPIO_PIN_5);
  449.     gpio_af_set(GPIOC, GPIO_AF_14, GPIO_PIN_11);
  450.     gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_11);
  451.     gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_10);
  452.     gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_12);
  453.     gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_14);

  454.     gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
  455.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_9);
  456.     gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
  457.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_8);
  458.     gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
  459.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_5);
  460.     gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
  461.     gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_11);
  462.     gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
  463.     gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_11);
  464.     gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10);
  465.     gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_10);
  466.     gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12);
  467.     gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_12);
  468.     gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14);
  469.     gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_14);

  470.     /* configure LCD_DE(PF10) */
  471.     gpio_af_set(GPIOF, GPIO_AF_14, GPIO_PIN_10);
  472.     gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10);
  473.     gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_10);
  474.     /* LCD PWM BackLight(PG13) */
  475.     gpio_mode_set(GPIOG, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_13);
  476.     gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_13);
  477.     gpio_bit_set(GPIOG, GPIO_PIN_13);
  478. }

4、添加测试函数:
  1.   lv_init();
  2.     lv_port_disp_init();
  3.    // lv_port_indev_init();
  4.     lv_obj_t* obj1 = lv_obj_create(lv_scr_act(),NULL);

  5.     lv_obj_set_height(obj1, 200); //只设置高度
  6.     lv_obj_set_width(obj1, 300); //只设置宽度
  7.     lv_obj_set_size(obj1, 300,200); //设置宽高

  8.     lv_obj_set_x(obj1, 10);//设置x
  9.     lv_obj_set_y(obj1, 20);//设置y
  10.     lv_obj_set_pos(obj1, 10,20);//设置xy
  11.                
  12.                 lv_obj_t *label = lv_label_create(lv_scr_act(),NULL);
  13.                 lv_obj_set_x(label, 10);//设置x
  14.     lv_obj_set_y(label, 20);//设置y

  15.                 lv_label_set_text(label,"Hello World\r\n GD32H759\r\n mbb.eet-china.com");

  16.     while(1) {
  17.         /* turn on LED1, turn off LED2 */
  18.                           delay_1ms(2);
  19.         lv_tick_inc(2);
  20.         lv_task_handler();
  21.                         mytick++;
  22.                        
  23.                         if(mytick < 100)
  24.                         {
  25.                                 gpio_bit_reset(GPIOA, GPIO_PIN_6);
  26.                                 gpio_bit_reset(GPIOF, GPIO_PIN_10);
  27.                         }
  28.                         else if(mytick>300 )
  29.                         {

  30.                                 mytick = 0;
  31.                         }
  32.                         else
  33.                         {
  34.                                
  35.                                 gpio_bit_set(GPIOA, GPIO_PIN_6);
  36.                                 gpio_bit_set(GPIOF, GPIO_PIN_10);
  37.                         }
  38.                        
  39.     }
【测试效果】
ef3c8a6b0b17670de1db72a3a04bd0a.jpg
【总结】
GD32H759有着强大的显示加速功能,配合LVGL,可以在图形方面胜出友商不少。