本帖最后由 dele 于 2024-6-30 10:05 编辑

D133 RISC-V KunLun Pi开发板评测 02 LVGL移植与应用测试

  • LVGL简介

LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。

085803ceggzedb267xagzt

Key features(主要特性)


    • 丰富且强大的模块化图形组件:按钮 (buttons)、图表 (charts)、列表 (lists)、滑动条 (sliders)、图片 (images) 等
    • 高级的图形引擎:动画、抗锯齿、透明度、平滑滚动、图层混合等效果
    • 支持多种输入设备:触摸屏、 键盘、编码器、按键等
    • 支持多显示设备
    • 不依赖特定的硬件平台,可以在任何显示屏上运行
    • 配置可裁剪(最低资源占用:64 kB Flash,16 kB RAM)
    • 基于UTF-8的多语种支持,例如中文、日文、韩文、阿拉伯文等
    • 可以通过类CSS的方式来设计、布局图形界面(例如:Flexbox、Grid)
    • 支持操作系统、外置内存、以及硬件加速(LVGL已内建支持STM32 DMA2D、NXP PXP和VGLite)
    • 即便仅有单缓冲区(frame buffer)的情况下,也可保证渲染如丝般顺滑
    • 全部由C编写完成,并支持C++调用
    • 支持Micropython编程,参见:LVGL API in Micropython
    • 支持模拟器仿真,可以无硬件依托进行开发
    • 丰富详实的例程
    • 详尽的文档以及API参考手册,可线上查阅或可下载为PDF格式
    • 在 MIT 许可下免费和开源

Requirements(配置要求)

基本上,每个能够驱动显示器的现代控制器都适合运行 LVGL。 最低要求是:


    • 16、32 或 64 位微控制器或处理器
    • 建议使用 >16 MHz 时钟速度
    • 闪存/ROM: > 64 kB 用于非常重要的组件 (> 建议使用 180 kB)
      • RAM:
        静态 RAM 使用量:~2 kB,取决于使用的功能和对象类型堆: > 2kB (> 建议使用 8 kB)
        动态数据(堆): > 2 KB (> 如果使用多个对象,建议使用 16 kB). 在 lv_conf.h 文件中配置 LV_MEM_SIZE 生效。
        显示缓冲区:> “水平分辨率”像素(推荐 >10 × 10ד 水平分辨率”)MCU或外部显示控制器中的一个帧缓冲区

    • C99 或更新的编译器
  • LVGL在匠芯创中的使用
    • LVGL 使用指南

匠芯创提供了LVGL 使用指南,可以参考RTOS SDK中的多媒体章节的介绍。

085803nudcpktfttecnpzr 085803lbxxhz4amwghxcja


    • packages lvgl

在匠芯创芯片的lite开发源码中,packages里面提供大量的第三方的库文件,其中lvgl-ui是一个重要的案例,里面包含了大量的测试应用。

085804d2mddjmujj2mdw50 085804zh3h0khfhfreyq3h

aic_demo包含大量的测试案例,aic_ui,lv_conf,lv_demo.c等配置文件

085804wr1x8hr8416dhxus

在第一次开箱测试中,其实选择了官方的一个showcase_demo进行展示,简单的配置如下

输入scons --menuconfig进行配置界面,选择Application options,主要是选择demo加配置好相关的源文件的位置        

085805dc9gphbqkuo99vdv

085805r1opj9ljprppcrcl 085805vzjtoece6xfv3zik 085806hlhm7cl33h6sgnlk

保存退出,scons编译即可,下载代码,效果如下。

085806ca00hda9x0ff3dfs

  • 自定义使用

上面的都是测试官方的lvgl的配置流程,下面是进行简单的自定义的使用。

1. 编写lvgl界面代码

参考B站大佬的代码

  1. #include "yang.h"
  2. #include "lvgl.h"
  3. #include "stdlib.h"

  4. #define card_img_type_count 15
  5. #define left_count   20
  6. #define right_count 20
  7. #define mid_count   100
  8. #define bottom_count 8
  9. #define max_layer   4
  10. #define layer_row_count 8
  11. #define layer_col_count 6
  12. #define mid_x_start 230
  13. #define mid_y_start 20
  14. #define card_width   40
  15. #define card_height   50
  16. #define left_x_start 190
  17. #define right_x_start 570
  18. #define left_y_start 150
  19. #define right_y_start 150
  20. #define left_y_distance 5
  21. #define right_y_distance 5
  22. #define bottom_start_x 256
  23. #define bottom_start_y 395

  24. LV_IMG_DECLARE(grass2_img)
  25. LV_IMG_DECLARE(grass1_img)
  26. LV_IMG_DECLARE(yang_start_btn_img)
  27. LV_IMG_DECLARE(bottom_dock_img)
  28. LV_IMG_DECLARE(yang_card1_img)
  29. LV_IMG_DECLARE(yang_card2_img)
  30. LV_IMG_DECLARE(yang_card3_img)
  31. LV_IMG_DECLARE(yang_card4_img)
  32. LV_IMG_DECLARE(yang_card5_img)
  33. LV_IMG_DECLARE(yang_card6_img)
  34. LV_IMG_DECLARE(yang_card9_img)
  35. LV_IMG_DECLARE(yang_card7_img)
  36. LV_IMG_DECLARE(yang_card8_img)
  37. LV_IMG_DECLARE(yang_card9_img)
  38. LV_IMG_DECLARE(yang_card10_img)
  39. LV_IMG_DECLARE(yang_card11_img)
  40. LV_IMG_DECLARE(yang_card12_img)
  41. LV_IMG_DECLARE(yang_card13_img)
  42. LV_IMG_DECLARE(yang_card14_img)
  43. LV_IMG_DECLARE(yang_card15_img)

  44. typedef enum
  45. {
  46.   left =0,
  47.   mid,
  48.   right,
  49.   bottom,

  50. }area_enum;

  51. typedef struct
  52. {
  53.   lv_obj_t * obj;
  54.   bool alive;
  55.   char x;
  56.   char y;
  57.   area_enum area;
  58.   char layer;
  59.   char img_index;

  60. }card_typedef;

  61. card_typedef left_card[left_count]={0,};
  62. card_typedef right_card[right_count]={0,};
  63. card_typedef mid_card[max_layer*layer_col_count*layer_row_count]={0,};
  64. card_typedef bottom_card[bottom_count]={0,};

  65. static const lv_img_dsc_t * card_img[card_img_type_count] = { &yang_card1_img ,&yang_card2_img ,&yang_card3_img,&yang_card4_img,&yang_card5_img,
  66. &yang_card6_img,&yang_card7_img,&yang_card8_img,&yang_card9_img,&yang_card10_img,&yang_card11_img,&yang_card12_img,&yang_card13_img,&yang_card14_img,&yang_card15_img,};
  67. static const lv_img_dsc_t * grass_img[2] = { &grass1_img,&grass2_img,};
  68. lv_obj_t * screen,* map1,* start_btn,*dock;
  69. static void game_start(lv_event_t * e);
  70. static void cover_test();
  71. static void clicked_cb(lv_event_t * e);
  72. static void left_cover_test();
  73. static void right_cover_test();
  74. static void move_to_right(char index);
  75. static char find_same_card(char img_index);
  76. static void del_same_card();
  77. static void x_move_cb(void * var, int32_t v);
  78. static void y_move_cb(void * var, int32_t v);
  79. static void move_to_left();
  80. static void move_done_cb(lv_anim_t * a);
  81. static void game_over();
  82. static void card_anim_cb(void * var, int32_t v);
  83. static void card_del_cb(lv_anim_t* a);
  84. static void right_x_move_cb(void * var, int32_t v);

  85. void yang_game()
  86. {

  87.        lv_memset_00(left_card,sizeof(left_card));
  88.        lv_memset_00(right_card,sizeof(right_card));
  89.        lv_memset_00(mid_card,sizeof(mid_card));
  90.        lv_memset_00(bottom_card,sizeof(bottom_card));

  91.        screen=lv_tileview_create(lv_scr_act());
  92.        lv_obj_set_size(screen,800,480);
  93.        lv_obj_set_style_bg_color(screen,lv_color_hex(0xcdfd8b),0);
  94.        lv_obj_clear_flag(screen, LV_OBJ_FLAG_SCROLLABLE);

  95.        for(int i=0;i<20;i++)
  96.       {
  97.           lv_obj_t * g=lv_img_create(screen);
  98.           lv_img_set_src(g,grass_img[rand()%2]);
  99.           lv_obj_set_pos(g,rand()%750,rand()%450);
  100.       }

  101.        dock=lv_img_create(screen);
  102.        lv_img_set_src(dock, &bottom_dock_img);
  103.        lv_obj_align(dock,LV_ALIGN_BOTTOM_MID,0,-5);

  104.        start_btn=lv_img_create(screen);
  105.        lv_img_set_src(start_btn, &yang_start_btn_img);
  106.        lv_obj_center(start_btn);
  107. lv_obj_add_flag(start_btn, LV_OBJ_FLAG_CLICKABLE);
  108. lv_obj_add_event_cb(start_btn,game_start,LV_EVENT_RELEASED,0);

  109. }


  110. static void game_start(lv_event_t * e)
  111. {
  112.    int i,j;

  113.    lv_obj_del((lv_obj_t *)e->target);

  114.    for(i=0;i<left_count;i++)
  115.   {
  116.        left_card[i].obj=lv_img_create(screen);
  117.        left_card[i].alive=true;
  118.        left_card[i].y=i;
  119.        left_card[i].area=left;
  120.        left_card[i].layer=i;
  121.        left_card[i].img_index=rand()%card_img_type_count;
  122.        lv_img_set_src(left_card[i].obj, card_img[left_card[i].img_index]);
  123.        lv_obj_set_pos(left_card[i].obj,left_x_start,left_y_start+i*left_y_distance);
  124.        left_card[i].obj->user_data=&left_card[i].obj;
  125.        lv_obj_set_style_img_recolor(left_card[i].obj,lv_color_hex(0x000000),0);
  126.        lv_obj_set_style_img_recolor_opa(left_card[i].obj,100,0);
  127.        lv_obj_clear_flag(left_card[i].obj, LV_OBJ_FLAG_CLICKABLE);
  128.        lv_obj_add_event_cb(left_card[i].obj,clicked_cb,LV_EVENT_RELEASED,0);
  129.   }

  130.    for(i=0;i<right_count;i++)
  131.   {
  132.        right_card[i].obj=lv_img_create(screen);
  133.        right_card[i].alive=true;
  134.        right_card[i].y=i;
  135.        right_card[i].area=right;
  136.        right_card[i].layer=i;
  137.        right_card[i].img_index=rand()%card_img_type_count;
  138.        lv_img_set_src(right_card[i].obj, card_img[right_card[i].img_index]);
  139.        lv_obj_set_pos(right_card[i].obj,right_x_start,right_y_start+i*right_y_distance);
  140.        right_card[i].obj->user_data=&right_card[i].obj;
  141.        lv_obj_set_style_img_recolor(right_card[i].obj,lv_color_hex(0x000000),0);
  142.        lv_obj_set_style_img_recolor_opa(right_card[i].obj,100,0);
  143.        lv_obj_clear_flag(right_card[i].obj, LV_OBJ_FLAG_CLICKABLE);
  144.        lv_obj_add_event_cb(right_card[i].obj,clicked_cb,LV_EVENT_RELEASED,0);
  145.   }



  146.    for(j=0;j<max_layer;j++)
  147.   {
  148.        for(i=0;i<layer_row_count*layer_col_count ;i++)
  149.       {
  150.            mid_card[j*layer_row_count*layer_col_count+i].obj=lv_img_create(screen);
  151.            mid_card[j*layer_row_count*layer_col_count+i].alive=true;
  152.            mid_card[j*layer_row_count*layer_col_count+i].x=i%layer_row_count*2+j%2;
  153.            mid_card[j*layer_row_count*layer_col_count+i].y=i/layer_row_count*2+j%2;
  154.            mid_card[j*layer_row_count*layer_col_count+i].area=mid;
  155.            mid_card[j*layer_row_count*layer_col_count+i].layer=j;
  156.            mid_card[j*layer_row_count*layer_col_count+i].img_index=rand()%10;
  157.            lv_img_set_src(mid_card[j*layer_row_count*layer_col_count+i].obj, card_img[mid_card[j*layer_row_count*layer_col_count+i].img_index]);
  158.            lv_obj_set_pos(mid_card[j*layer_row_count*layer_col_count+i].obj,mid_x_start+mid_card[j*layer_row_count*layer_col_count+i].x*card_width/2,mid_y_start+mid_card[j*layer_row_count*layer_col_count+i].y*card_height/2);
  159.            mid_card[j*layer_row_count*layer_col_count+i].obj->user_data=&mid_card[j*layer_row_count*layer_col_count+i];
  160.            lv_obj_set_style_img_recolor(mid_card[j*layer_row_count*layer_col_count+i].obj,lv_color_hex(0x000000),0);
  161.            lv_obj_set_style_img_recolor_opa(mid_card[j*layer_row_count*layer_col_count+i].obj,0,0);
  162.            lv_obj_add_flag(mid_card[j*layer_row_count*layer_col_count+i].obj, LV_OBJ_FLAG_CLICKABLE);
  163.            lv_obj_add_event_cb(mid_card[j*layer_row_count*layer_col_count+i].obj,clicked_cb,LV_EVENT_RELEASED,0);
  164.       }
  165.   }
  166.    cover_test();
  167.    left_cover_test();
  168.    right_cover_test();
  169. }


  170. static void clicked_cb(lv_event_t * e)
  171. {
  172.    int i,j,k,m;
  173.    card_typedef * card=(card_typedef *)((lv_obj_t *)(e->target)->user_data);
  174.    card->alive=false;

  175.    cover_test();
  176.    left_cover_test();
  177.    right_cover_test();

  178.            m=find_same_card(card->img_index);
  179.            move_to_right(m);

  180.            bottom_card[m].alive=true;
  181.            bottom_card[m].obj=e->target;
  182.            bottom_card[m].img_index=card->img_index;
  183.            lv_obj_clear_flag(bottom_card[m].obj, LV_OBJ_FLAG_CLICKABLE);
  184.            lv_obj_move_foreground(bottom_card[m].obj);


  185.                    lv_anim_t a1;
  186. lv_anim_init(&a1);
  187. lv_anim_set_var(&a1,bottom_card[m].obj);
  188. lv_anim_set_exec_cb(&a1,x_move_cb);
  189. lv_anim_set_time(&a1,300);
  190. lv_anim_set_path_cb(&a1,lv_anim_path_ease_out);
  191. lv_anim_set_values(&a1,lv_obj_get_x(bottom_card[m].obj),bottom_start_x+m*(card_width+2));
  192. lv_anim_start(&a1);

  193. lv_anim_t a2;
  194. lv_anim_init(&a2);
  195. lv_anim_set_var(&a2,bottom_card[m].obj);
  196. lv_anim_set_exec_cb(&a2,y_move_cb);
  197. lv_anim_set_time(&a2,300);
  198. lv_anim_set_path_cb(&a2,lv_anim_path_ease_out);
  199. lv_anim_set_deleted_cb(&a2,move_done_cb);
  200. lv_anim_set_values(&a2,lv_obj_get_y(bottom_card[m].obj),bottom_start_y);
  201. lv_anim_start(&a2);

  202.    del_same_card();
  203.    move_to_left();
  204. }


  205. static void cover_test()
  206. {
  207.    int i,j;

  208.    for(i=0;i<layer_row_count*layer_col_count*(max_layer);i++)
  209.       {
  210.            if(mid_card[i].alive==true)
  211.           {
  212.                for(j=i+1;j<layer_row_count*layer_col_count*max_layer;j++)
  213.                   {
  214.                        if(mid_card[j].alive==true&&mid_card[j].layer>mid_card[i].layer)
  215.                         {
  216.                              if((mid_card[j].x- mid_card[i].x)<2&&(mid_card[i].x- mid_card[j].x)<2&&(mid_card[j].y- mid_card[i].y)<2&&(mid_card[i].y- mid_card[j].y)<2)
  217.                                 {
  218.                                    lv_obj_set_style_img_recolor_opa(mid_card[i].obj,100,0);
  219.                                    lv_obj_clear_flag(mid_card[i].obj, LV_OBJ_FLAG_CLICKABLE);break;
  220.                                 }
  221.                           }
  222.                         lv_obj_set_style_img_recolor_opa(mid_card[i].obj,0,0);
  223.                         lv_obj_add_flag(mid_card[i].obj, LV_OBJ_FLAG_CLICKABLE);
  224.                   }
  225.           }
  226.       }
  227.       if(mid_card[layer_row_count*layer_col_count*max_layer-1].alive==true)lv_obj_add_flag(mid_card[layer_row_count*layer_col_count*max_layer-1].obj, LV_OBJ_FLAG_CLICKABLE);
  228. }


  229. static void left_cover_test()
  230. {
  231.    int i;

  232.    for(i=left_count-1;i>=0;i--)
  233.       {
  234.            if(left_card[i].alive==true)
  235.           {
  236.                lv_obj_set_style_img_recolor_opa(left_card[i].obj,0,0);
  237.                lv_obj_add_flag(left_card[i].obj, LV_OBJ_FLAG_CLICKABLE);
  238.                return;
  239.           }
  240.       }
  241. }

  242. static void right_cover_test()
  243. {
  244.    int i;

  245.    for(i=right_count-1;i>=0;i--)
  246.       {
  247.            if(right_card[i].alive==true)
  248.           {
  249.                lv_obj_set_style_img_recolor_opa(right_card[i].obj,0,0);
  250.                lv_obj_add_flag(right_card[i].obj, LV_OBJ_FLAG_CLICKABLE);
  251.                return;
  252.           }
  253.       }
  254. }


  255. static void move_to_right(char index)
  256. {
  257.    int i;

  258.     for(i=6;i>index;i--)
  259.   {
  260.        bottom_card[i].alive=bottom_card[i-1].alive;
  261.        bottom_card[i].img_index=bottom_card[i-1].img_index;
  262.        bottom_card[i].obj=bottom_card[i-1].obj;
  263.        bottom_card[i-1].alive=false;

  264.         if(bottom_card[i].alive==true)
  265.         {
  266.           lv_anim_t a1;
  267.           lv_anim_init(&a1);
  268.           lv_anim_set_var(&a1,bottom_card[i].obj);
  269.            lv_anim_set_exec_cb(&a1,right_x_move_cb);
  270.            lv_anim_set_time(&a1,200);
  271.            lv_anim_set_values(&a1,bottom_start_x+(i-1)*(card_width+2),bottom_start_x+(i)*(card_width+2));
  272.           lv_anim_start(&a1);
  273.         }
  274.   }
  275. }



  276. static void move_to_left()
  277. {
  278.    int i,j;

  279.    for(j=0;j<6;j++)
  280.   {
  281.        if(bottom_card[j].alive==false)
  282.       {
  283.                 for(i=j+1;i<7;i++)
  284.               {
  285.                    if(bottom_card[i].alive==true)
  286.                     {
  287.                         bottom_card[j].alive=bottom_card[i].alive;
  288.                         bottom_card[j].img_index=bottom_card[i].img_index;
  289.                         bottom_card[j].obj=bottom_card[i].obj;
  290.                         bottom_card[i].alive=false;

  291.                        lv_anim_t a1;
  292.                        lv_anim_init(&a1);
  293.                        lv_anim_set_var(&a1,bottom_card[j].obj);
  294.                        lv_anim_set_delay(&a1,500);
  295.                        lv_anim_set_exec_cb(&a1,x_move_cb);
  296.                        lv_anim_set_time(&a1,200);
  297.                        lv_anim_set_values(&a1,bottom_start_x+(i)*(card_width+2),bottom_start_x+(j)*(card_width+2));
  298.                        lv_anim_start(&a1);

  299.                         break;
  300.                   }
  301.               }
  302.       }
  303.   }
  304. }



  305. static char find_same_card(char img_index)
  306. {
  307. int i,j,k;

  308. for(i=5;i>=0;i--)
  309.   {
  310.         if(bottom_card[i].alive&&bottom_card[i].img_index==img_index)
  311.         {
  312.             return i+1;
  313.         }

  314.   }

  315.    for(i=5;i>=0;i--)
  316.   {
  317.         if(bottom_card[i].alive)
  318.         {
  319.             return i+1;
  320.         }

  321.   }
  322. return 0;

  323. }


  324. static void del_same_card()
  325. {
  326. int i,j,k;

  327. for(i=0;i<7;i++)
  328.   {
  329.        if(bottom_card[i].alive==true)
  330.       {
  331.            for(j=i+1;j<7;j++)
  332.           {
  333.               if(bottom_card[j].alive==true&&bottom_card[i].img_index==bottom_card[j].img_index)
  334.               {
  335.                    for(k=j+1;k<7;k++)
  336.                   {
  337.                        if(bottom_card[k].alive==true&&bottom_card[j].img_index==bottom_card[k].img_index)
  338.                       {
  339.                            bottom_card[i].alive=false;
  340.                            bottom_card[j].alive=false;
  341.                            bottom_card[k].alive=false;

  342.                            lv_anim_t a1;
  343.                            lv_anim_init(&a1);
  344.                            lv_anim_set_var(&a1,bottom_card[i].obj);
  345.                            lv_anim_set_exec_cb(&a1,card_anim_cb);
  346.                            lv_anim_set_time(&a1,300);
  347.                            lv_anim_set_delay(&a1,300);
  348.                            lv_anim_set_deleted_cb(&a1,card_del_cb);
  349.                            lv_anim_set_values(&a1,256,1);
  350.                            lv_anim_start(&a1);

  351.                            lv_anim_init(&a1);
  352.                            lv_anim_set_var(&a1,bottom_card[j].obj);
  353.                            lv_anim_set_exec_cb(&a1,card_anim_cb);
  354.                            lv_anim_set_time(&a1,300);
  355.                            lv_anim_set_delay(&a1,300);
  356.                            lv_anim_set_deleted_cb(&a1,card_del_cb);
  357.                            lv_anim_set_values(&a1,256,1);
  358.                            lv_anim_start(&a1);

  359.                            lv_anim_init(&a1);
  360.                            lv_anim_set_var(&a1,bottom_card[k].obj);
  361.                            lv_anim_set_exec_cb(&a1,card_anim_cb);
  362.                            lv_anim_set_time(&a1,300);
  363.                            lv_anim_set_delay(&a1,300);
  364.                            lv_anim_set_deleted_cb(&a1,card_del_cb);
  365.                            lv_anim_set_values(&a1,256,1);
  366.                            lv_anim_start(&a1);

  367.                       }
  368.                   }

  369.               }

  370.           }
  371.       }
  372.   }
  373. }

  374. static void card_anim_cb(void * var, int32_t v)
  375. {
  376. lv_img_set_zoom(var,v);
  377. lv_obj_set_style_img_opa(var,v-1,0);
  378. }

  379. static void card_del_cb(lv_anim_t* a)
  380. {
  381.    lv_obj_del(a->var);
  382. }


  383. static void x_move_cb(void * var, int32_t v)
  384. {
  385. lv_obj_t * xxx=(lv_obj_t *)var;
  386. lv_obj_set_x(xxx,v);
  387. }


  388. static void right_x_move_cb(void * var, int32_t v)
  389. {
  390. lv_obj_t * xxx=(lv_obj_t *)var;
  391. lv_obj_set_x(xxx,v);
  392. }

  393. static void y_move_cb(void * var, int32_t v)
  394. {
  395. lv_obj_t * xxx=(lv_obj_t *)var;
  396. lv_obj_set_y(xxx,v);
  397. }

  398. static void move_done_cb(lv_anim_t * a)
  399. {
  400.    if(bottom_card[6].alive==true){game_over();}

  401. }

  402. static void game_over()
  403. {
  404.    lv_anim_del_all();
  405.    lv_obj_del(screen);
  406.    yang_game();
  407. }



    • 编写脚本Scons
  1. from building import *
  2. import os

  3. cwd = GetCurrentDir()
  4. group = []
  5. src = []
  6. CPPPATH = [cwd]

  7. src += Glob('*.c')

  8. list = os.listdir(cwd)
  9. for d in list:
  10.    path = os.path.join(cwd, d)
  11.    if os.path.isfile(os.path.join(path, 'SConscript')):
  12.        group = group + SConscript(os.path.join(d, 'SConscript'))

  13. group = group + DefineGroup('LVGL-port', src, depend = ['AIC_LVGL_METER_DEMO'], CPPPATH = CPPPATH)

  14. Return('group')


    • 创建文件夹工程

085806jpvqocpnc2ff27co


    • 配置LVGL线程相关文件

LVGL线程相关的代码在lvgl_demo文件中

  1. #include <lvgl.h>
  2. #ifdef KERNEL_RTTHREAD
  3. #include <rtthread.h>
  4. #endif
  5. #include "aic_core.h"
  6. #include "aic_osal.h"
  7. #include "aic_ui.h"
  8. #include "aic_dec.h"
  9. #include <dfs_fs.h>
  10. #include "aic_time.h"

  11. #ifndef LV_CACHE_IMG_NUM
  12. #define LV_CACHE_IMG_NUM 1
  13. #endif

  14. void lv_user_gui_init(void)
  15. {
  16.    // wait sdcard mounted
  17.    if (!strcmp(LVGL_STORAGE_PATH, "/sdcard")) {
  18.        aicos_msleep(1000);
  19.   }

  20.    lv_img_cache_set_size(LV_CACHE_IMG_NUM);
  21.    aic_dec_create();
  22.    aic_ui_init();
  23. }

  24. #ifdef KERNEL_RTTHREAD
  25. extern int lvgl_thread_init(void);

  26. INIT_APP_EXPORT(lvgl_thread_init);
  27. #endif

重要是修改aic_ui.c,在AIC_LVGL_METER_DEMO进行了修改,注释掉了原始的东西,添加我们编写的东西。

085807gm482mhbxmm4gx9x


    • menuconfig配置

085807qnzfr7r38007uo7v 085807qh15at5vh2bayyy2

编译代码

085808o6b7dikapf7ai57m 085808q65ckc55bb1y4t04

  • 下载代码测试效果

085809nd3l33hja83fd328

085809mhdtd5djt9n8knkf 085809nmjmi3ei4quvx8mv