旗点科技星空派(GD32)
直播中

qjp1988113

12年用户 343经验值
擅长:测量仪表 嵌入式技术 处理器/DSP 控制/MCU EDA/IC设计
私信 关注
[GD32F303]

【星空派GD32F303开发板试用体验】+LVGL移植

今天有点空,我们移植一下LVGL~
先看效果图:
Z1.jpg
Z2.jpg
Z3.jpg
在这之前,我们得调试好屏幕及触摸~
我们以之前的LCD那个程序为模板,开始添加LVGL文件。
先下载LVGL源文件包:
lvgl-master.zip (725.23 KB)
(下载次数: 13, 2021-11-9 09:23 上传)

删去一些不必要的,整理成:
GUI.rar (2.51 MB)
(下载次数: 34, 2021-11-9 09:26 上传)

解压下来,将GUI添加进工程:
其中由于LVGL的特性,需要添加C99支持,并屏蔽一些类型的警告:
勾选C99,并在Misc Controls 中填入 --diag_suppress=68 --diag_supp
ress=111 --diag_suppress=550:
Z5.png
添加LVGL的心跳,这了由于已经用了SYStiCK作为延时定时器。
我们这了新开一个定时器1,并设定为1ms中断,为LVGL提供心跳节拍~
  1. #include "timer.h"
  2. #include "lvgl.h"

  3. //1秒产生一次中断 int_time = CLK / ((prescaler+1) *  (period+1))
  4. void TIM1_Int_Init(u16 arr,u16 psc)
  5. {
  6.   timer_parameter_struct timer_parameter;

  7.   rcu_periph_clock_enable(RCU_TIMER1);

  8.   //预分频
  9.   timer_parameter.prescaler = psc,
  10.   //对齐模式
  11.   timer_parameter.alignedmode = TIMER_COUNTER_EDGE,
  12.   //定时器增长方向
  13.   timer_parameter.counterdirection = TIMER_COUNTER_UP,
  14.   //定时器自动加载值
  15.   timer_parameter.period = arr,
  16.   //时钟分频值
  17.   timer_parameter.clockdivision = TIMER_CKDIV_DIV4,

  18.   timer_init(TIMER1, &timer_parameter);

  19.   timer_interrupt_enable(TIMER1, TIMER_INT_UP);
  20.   nvic_irq_enable(TIMER1_IRQn, 0, 2);

  21.   timer_enable(TIMER1);
  22. }


  23. void TIMER1_IRQHandler()
  24. {
  25.   if (timer_interrupt_flag_get(TIMER1, TIMER_INT_UP) != RESET)
  26.   {
  27.     lv_tick_inc(1);//lvgl的1ms心跳
  28.     timer_interrupt_flag_clear(TIMER1, TIMER_INT_UP);
  29.   }
  30. }

在main初始化里面设定:
  1. TIM1_Int_Init(999,119);//定时器初始化(1ms 中断),用于给 lvgl 提供 1ms 的心跳节拍
其余就是一些常见的config的配置:
对lv_conf.h进行如下修改:
  1. /**
  2. * [url=home.php?mod=space&uid=1455510]@file[/url] lv_conf.h
  3. *
  4. */

  5. /*
  6. * COPY THIS FILE AS `lv_conf.h` NEXT TO the `lvgl` FOLDER
  7. */

  8. #if 1 /*Set it to "1" to enable content*/

  9. #ifndef LV_CONF_H
  10. #define LV_CONF_H
  11. /* clang-format off */

  12. #include

  13. /*====================
  14.    Graphical settings
  15. *====================*/

  16. /* Maximal horizontal and vertical resolution to support by the library.*/
  17. #define LV_HOR_RES_MAX          (320)  //320
  18. #define LV_VER_RES_MAX          (480)  //480

  19. /* Color depth:
  20. * - 1:  1 byte per pixel
  21. * - 8:  RGB233
  22. * - 16: RGB565
  23. * - 32: ARGB8888
  24. */
  25. #define LV_COLOR_DEPTH     16

  26. /* Swap the 2 bytes of RGB565 color.
  27. * Useful if the display has a 8 bit interface (e.g. SPI)*/
  28. #define LV_COLOR_16_SWAP   0

  29. /* 1: Enable screen transparency.
  30. * Useful for OSD or other overlapping GUIs.
  31. * Requires `LV_COLOR_DEPTH = 32` colors and the screen's style should be modified: `style.body.opa = ...`*/
  32. #define LV_COLOR_SCREEN_TRANSP    0

  33. /*Images pixels with this color will not be drawn (with chroma keying)*/
  34. #define LV_COLOR_TRANSP    LV_COLOR_LIME         /*LV_COLOR_LIME: pure green*/

  35. /* Enable anti-aliasing (lines, and radiuses will be smoothed) */
  36. #define LV_ANTIALIAS        1

  37. /* Default display refresh period.
  38. * Can be changed in the display driver (`lv_disp_drv_t`).*/
  39. #define LV_DISP_DEF_REFR_PERIOD      30      /*[ms]*/

  40. /* Dot Per Inch: used to initialize default sizes.
  41. * E.g. a button with width = LV_DPI / 2 -> half inch wide
  42. * (Not so important, you can adjust it to modify default sizes and spaces)*/
  43. #define LV_DPI              60     /*[px]*/

  44. /* Type of coordinates. Should be `int16_t` (or `int32_t` for extreme cases) */
  45. typedef int16_t lv_coord_t;

  46. /*=========================
  47.    Memory manager settings
  48. *=========================*/

  49. /* LittelvGL's internal memory manager's settings.
  50. * The graphical objects and other related data are stored here. */

  51. /* 1: use custom malloc/free, 0: use the built-in `lv_mem_alloc` and `lv_mem_free` */
  52. #define LV_MEM_CUSTOM      0
  53. #if LV_MEM_CUSTOM == 0
  54. /* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/
  55. #  define LV_MEM_SIZE    (16U * 1024U)

  56. /* Complier prefix for a big array declaration */
  57. #  define LV_MEM_ATTR

  58. /* Set an address for the memory pool instead of allocating it as an array.
  59. * Can be in external SRAM too. */
  60. #  define LV_MEM_ADR          0

  61. /* Automatically defrag. on free. Defrag. means joining the adjacent free cells. */
  62. #  define LV_MEM_AUTO_DEFRAG  1
  63. #else       /*LV_MEM_CUSTOM*/
  64. #  define LV_MEM_CUSTOM_INCLUDE    /*Header for the dynamic memory function*/
  65. #  define LV_MEM_CUSTOM_ALLOC   malloc       /*Wrapper to malloc*/
  66. #  define LV_MEM_CUSTOM_FREE    free         /*Wrapper to free*/
  67. #endif     /*LV_MEM_CUSTOM*/

  68. /* Garbage Collector settings
  69. * Used if lvgl is binded to higher level language and the memory is managed by that language */
  70. #define LV_ENABLE_GC 0
  71. #if LV_ENABLE_GC != 0
  72. #  define LV_GC_INCLUDE "gc.h"                           /*Include Garbage Collector related things*/
  73. #  define LV_MEM_CUSTOM_REALLOC   your_realloc           /*Wrapper to realloc*/
  74. #  define LV_MEM_CUSTOM_GET_SIZE  your_mem_get_size      /*Wrapper to lv_mem_get_size*/
  75. #endif /* LV_ENABLE_GC */

  76. /*=======================
  77.    Input device settings
  78. *=======================*/

  79. /* Input device default settings.
  80. * Can be changed in the Input device driver (`lv_indev_drv_t`)*/

  81. /* Input device read period in milliseconds */
  82. #define LV_INDEV_DEF_READ_PERIOD          30

  83. /* Drag threshold in pixels */
  84. #define LV_INDEV_DEF_DRAG_LIMIT           10

  85. /* Drag throw slow-down in [%]. Greater value -> faster slow-down */
  86. #define LV_INDEV_DEF_DRAG_THROW           20

  87. /* Long press time in milliseconds.
  88. * Time to send `LV_EVENT_LONG_PRESSSED`) */
  89. #define LV_INDEV_DEF_LONG_PRESS_TIME      400

  90. /* Repeated trigger period in long press [ms]
  91. * Time between `LV_EVENT_LONG_PRESSED_REPEAT */
  92. #define LV_INDEV_DEF_LONG_PRESS_REP_TIME  100

  93. /*==================
  94. * Feature usage
  95. *==================*/

  96. /*1: Enable the Animations */
  97. #define LV_USE_ANIMATION        1
  98. #if LV_USE_ANIMATION

  99. /*Declare the type of the user data of animations (can be e.g. `void *`, `int`, `struct`)*/
  100. typedef void * lv_anim_user_data_t;

  101. #endif

  102. /* 1: Enable shadow drawing*/
  103. #define LV_USE_SHADOW           1

  104. /* 1: Enable object groups (for keyboard/encoder navigation) */
  105. #define LV_USE_GROUP            1
  106. #if LV_USE_GROUP
  107. typedef void * lv_group_user_data_t;
  108. #endif  /*LV_USE_GROUP*/

  109. /* 1: Enable GPU interface*/
  110. #define LV_USE_GPU              0

  111. /* 1: Enable file system (might be required for images */
  112. #define LV_USE_FILESYSTEM       0
  113. #if LV_USE_FILESYSTEM
  114. /*Declare the type of the user data of file system drivers (can be e.g. `void *`, `int`, `struct`)*/
  115. typedef void * lv_fs_drv_user_data_t;
  116. #endif

  117. /*1: Add a `user_data` to drivers and objects*/
  118. #define LV_USE_USER_DATA        0

  119. /*========================
  120. * Image decoder and cache
  121. *========================*/

  122. /* 1: Enable indexed (palette) images */
  123. #define LV_IMG_CF_INDEXED       1

  124. /* 1: Enable alpha indexed images */
  125. #define LV_IMG_CF_ALPHA         1

  126. /* Default image cache size. Image caching keeps the images opened.
  127. * If only the built-in image formats are used there is no real advantage of caching.
  128. * (I.e. no new image decoder is added)
  129. * With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
  130. * However the opened images might consume additional RAM.
  131. * LV_IMG_CACHE_DEF_SIZE must be >= 1 */
  132. #define LV_IMG_CACHE_DEF_SIZE       1

  133. /*Declare the type of the user data of image decoder (can be e.g. `void *`, `int`, `struct`)*/
  134. typedef void * lv_img_decoder_user_data_t;

  135. /*=====================
  136. *  Compiler settings
  137. *====================*/
  138. /* Define a custom attribute to `lv_tick_inc` function */
  139. #define LV_ATTRIBUTE_TICK_INC

  140. /* Define a custom attribute to `lv_task_handler` function */
  141. #define LV_ATTRIBUTE_TASK_HANDLER

  142. /* With size optimization (-Os) the compiler might not align data to
  143. * 4 or 8 byte boundary. This alignment will be explicitly applied where needed.
  144. * E.g. __attribute__((aligned(4))) */
  145. #define LV_ATTRIBUTE_MEM_ALIGN

  146. /* Attribute to mark large constant arrays for example
  147. * font's bitmaps */
  148. #define LV_ATTRIBUTE_LARGE_CONST       

  149. /*===================
  150. *  HAL settings
  151. *==================*/

  152. /* 1: use a custom tick source.
  153. * It removes the need to manually update the tick with `lv_tick_inc`) */
  154. #define LV_TICK_CUSTOM     0
  155. #if LV_TICK_CUSTOM == 1
  156. #define LV_TICK_CUSTOM_INCLUDE  "something.h"       /*Header for the sys time function*/
  157. #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis())     /*Expression evaluating to current systime in ms*/
  158. #endif   /*LV_TICK_CUSTOM*/

  159. typedef void * lv_disp_drv_user_data_t;             /*Type of user data in the display driver*/
  160. typedef void * lv_indev_drv_user_data_t;            /*Type of user data in the input device driver*/

  161. /*================
  162. * Log settings
  163. *===============*/

  164. /*1: Enable the log module*/
  165. #define LV_USE_LOG      0
  166. #if LV_USE_LOG
  167. /* How important log should be added:
  168. * LV_LOG_LEVEL_TRACE       A lot of logs to give detailed information
  169. * LV_LOG_LEVEL_INFO        Log important events
  170. * LV_LOG_LEVEL_WARN        Log if something unwanted happened but didn't cause a problem
  171. * LV_LOG_LEVEL_ERROR       Only critical issue, when the system may fail
  172. * LV_LOG_LEVEL_NONE        Do not log anything
  173. */
  174. #  define LV_LOG_LEVEL    LV_LOG_LEVEL_WARN

  175. /* 1: Print the log with 'printf';
  176. * 0: user need to register a callback with `lv_log_register_print`*/
  177. #  define LV_LOG_PRINTF   0
  178. #endif  /*LV_USE_LOG*/

  179. /*================
  180. *  THEME USAGE
  181. *================*/
  182. #define LV_THEME_LIVE_UPDATE    1   /*1: Allow theme switching at run time. Uses 8..10 kB of RAM*/

  183. #define LV_USE_THEME_TEMPL      1   /*Just for test*/
  184. #define LV_USE_THEME_DEFAULT    1   /*Built mainly from the built-in styles. Consumes very few RAM*/
  185. #define LV_USE_THEME_ALIEN      1   /*Dark futuristic theme*/
  186. #define LV_USE_THEME_NIGHT      1   /*Dark elegant theme*/
  187. #define LV_USE_THEME_MONO       1   /*Mono color theme for monochrome displays*/
  188. #define LV_USE_THEME_MATERIAL   1   /*Flat theme with bold colors and light shadows*/
  189. #define LV_USE_THEME_ZEN        1   /*Peaceful, mainly light theme */
  190. #define LV_USE_THEME_NEMO       1   /*Water-like theme based on the movie "Finding Nemo"*/

  191. /*==================
  192. *    FONT USAGE
  193. *===================*/

  194. /* The built-in fonts contains the ASCII range and some Symbols with  4 bit-per-pixel.
  195. * The symbols are available via `LV_SYMBOL_...` defines
  196. * More info about fonts: https://docs.littlevgl.com/#Fonts
  197. * To create a new font go to: https://littlevgl.com/ttf-font-to-c-array
  198. */

  199. /* Robot fonts with bpp = 4
  200. * https://fonts.google.com/specimen/Roboto  */
  201. #define LV_FONT_ROBOTO_12    0
  202. #define LV_FONT_ROBOTO_16    1
  203. #define LV_FONT_ROBOTO_22    0
  204. #define LV_FONT_ROBOTO_28    0

  205. /*Pixel perfect monospace font
  206. * http://pelulamu.net/unscii/ */
  207. #define LV_FONT_UNSCII_8     0

  208. /* Optionally declare your custom fonts here.
  209. * You can use these fonts as default font too
  210. * and they will be available globally. E.g.
  211. * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1)
  212. *                                LV_FONT_DECLARE(my_font_2)
  213. */
  214. #define LV_FONT_CUSTOM_DECLARE

  215. /*Always set a default font from the built-in fonts*/
  216. #define LV_FONT_DEFAULT        &lv_font_roboto_16

  217. /* Enable it if you have fonts with a lot of characters.
  218. * The limit depends on the font size, font face and bpp
  219. * but with > 10,000 characters if you see issues probably you need to enable it.*/
  220. #define LV_FONT_FMT_TXT_LARGE   0

  221. /*Declare the type of the user data of fonts (can be e.g. `void *`, `int`, `struct`)*/
  222. typedef void * lv_font_user_data_t;

  223. /*=================
  224. *  Text settings
  225. *=================*/

  226. /* Select a character encoding for strings.
  227. * Your IDE or editor should have the same character encoding
  228. * - LV_TXT_ENC_UTF8
  229. * - LV_TXT_ENC_ASCII
  230. * */
  231. #define LV_TXT_ENC LV_TXT_ENC_UTF8

  232. /*Can break (wrap) texts on these chars*/
  233. #define LV_TXT_BREAK_CHARS                  " ,.;:-_"

  234. /*===================
  235. *  LV_OBJ SETTINGS
  236. *==================*/

  237. /*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/
  238. typedef void * lv_obj_user_data_t;

  239. /*1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/
  240. #define LV_USE_OBJ_REALIGN          1

  241. /* Enable to make the object clickable on a larger area.
  242. * LV_EXT_CLICK_AREA_OFF or 0: Disable this feature
  243. * LV_EXT_CLICK_AREA_TINY: The extra area can be adjusted horizontally and vertically (0..255 px)
  244. * LV_EXT_CLICK_AREA_FULL: The extra area can be adjusted in all 4 directions (-32k..+32k px)
  245. */
  246. #define LV_USE_EXT_CLICK_AREA  LV_EXT_CLICK_AREA_OFF

  247. /*==================
  248. *  LV OBJ X USAGE
  249. *================*/
  250. /*
  251. * Documentation of the object types: https://docs.littlevgl.com/#Object-types
  252. */

  253. /*Arc (dependencies: -)*/
  254. #define LV_USE_ARC      1

  255. /*Bar (dependencies: -)*/
  256. #define LV_USE_BAR      1

  257. /*Button (dependencies: lv_cont*/
  258. #define LV_USE_BTN      1
  259. #if LV_USE_BTN != 0
  260. /*Enable button-state animations - draw a circle on click (dependencies: LV_USE_ANIMATION)*/
  261. #  define LV_BTN_INK_EFFECT   0
  262. #endif

  263. /*Button matrix (dependencies: -)*/
  264. #define LV_USE_BTNM     1

  265. /*Calendar (dependencies: -)*/
  266. #define LV_USE_CALENDAR 1

  267. /*Canvas (dependencies: lv_img)*/
  268. #define LV_USE_CANVAS   1

  269. /*Check box (dependencies: lv_btn, lv_label)*/
  270. #define LV_USE_CB       1

  271. /*Chart (dependencies: -)*/
  272. #define LV_USE_CHART    1
  273. #if LV_USE_CHART
  274. #  define LV_CHART_AXIS_TICK_LABEL_MAX_LEN    20
  275. #endif

  276. /*Container (dependencies: -*/
  277. #define LV_USE_CONT     1

  278. /*Drop down list (dependencies: lv_page, lv_label, lv_symbol_def.h)*/
  279. #define LV_USE_DDLIST    1
  280. #if LV_USE_DDLIST != 0
  281. /*Open and close default animation time [ms] (0: no animation)*/
  282. #  define LV_DDLIST_DEF_ANIM_TIME     200
  283. #endif

  284. /*Gauge (dependencies:lv_bar, lv_lmeter)*/
  285. #define LV_USE_GAUGE    1

  286. /*Image (dependencies: lv_label*/
  287. #define LV_USE_IMG      1

  288. /*Image Button (dependencies: lv_btn*/
  289. #define LV_USE_IMGBTN   1
  290. #if LV_USE_IMGBTN
  291. /*1: The imgbtn requires left, mid and right parts and the width can be set freely*/
  292. #  define LV_IMGBTN_TILED 0
  293. #endif

  294. /*Keyboard (dependencies: lv_btnm)*/
  295. #define LV_USE_KB       1

  296. /*Label (dependencies: -*/
  297. #define LV_USE_LABEL    1
  298. #if LV_USE_LABEL != 0
  299. /*Hor, or ver. scroll speed [px/sec] in 'LV_LABEL_LONG_ROLL/ROLL_CIRC' mode*/
  300. #  define LV_LABEL_DEF_SCROLL_SPEED       25

  301. /* Waiting period at beginning/end of animation cycle */
  302. #  define LV_LABEL_WAIT_CHAR_COUNT        3

  303. /*Enable selecting text of the label */
  304. #  define LV_LABEL_TEXT_SEL               0

  305. /*Store extra some info in labels (12 bytes) to speed up drawing of very long texts*/
  306. #  define LV_LABEL_LONG_TXT_HINT          0
  307. #endif

  308. /*LED (dependencies: -)*/
  309. #define LV_USE_LED      1

  310. /*Line (dependencies: -*/
  311. #define LV_USE_LINE     1

  312. /*List (dependencies: lv_page, lv_btn, lv_label, (lv_img optionally for icons ))*/
  313. #define LV_USE_LIST     1
  314. #if LV_USE_LIST != 0
  315. /*Default animation time of focusing to a list element [ms] (0: no animation)  */
  316. #  define LV_LIST_DEF_ANIM_TIME  100
  317. #endif

  318. /*Line meter (dependencies: *;)*/
  319. #define LV_USE_LMETER   1

  320. /*Message box (dependencies: lv_rect, lv_btnm, lv_label)*/
  321. #define LV_USE_MBOX     1

  322. /*Page (dependencies: lv_cont)*/
  323. #define LV_USE_PAGE     1
  324. #if LV_USE_PAGE != 0
  325. /*Focus default animation time [ms] (0: no animation)*/
  326. #  define LV_PAGE_DEF_ANIM_TIME     400
  327. #endif

  328. /*Preload (dependencies: lv_arc, lv_anim)*/
  329. #define LV_USE_PRELOAD      1
  330. #if LV_USE_PRELOAD != 0
  331. #  define LV_PRELOAD_DEF_ARC_LENGTH   60      /*[deg]*/
  332. #  define LV_PRELOAD_DEF_SPIN_TIME    1000    /*[ms]*/
  333. #  define LV_PRELOAD_DEF_ANIM         LV_PRELOAD_TYPE_SPINNING_ARC
  334. #endif

  335. /*Roller (dependencies: lv_ddlist)*/
  336. #define LV_USE_ROLLER    1
  337. #if LV_USE_ROLLER != 0
  338. /*Focus animation time [ms] (0: no animation)*/
  339. #  define LV_ROLLER_DEF_ANIM_TIME     200

  340. /*Number of extra "pages" when the roller is infinite*/
  341. #  define LV_ROLLER_INF_PAGES         7
  342. #endif

  343. /*Slider (dependencies: lv_bar)*/
  344. #define LV_USE_SLIDER    1

  345. /*Spinbox (dependencies: lv_ta)*/
  346. #define LV_USE_SPINBOX       1

  347. /*Switch (dependencies: lv_slider)*/
  348. #define LV_USE_SW       1

  349. /*Text area (dependencies: lv_label, lv_page)*/
  350. #define LV_USE_TA       1
  351. #if LV_USE_TA != 0
  352. #  define LV_TA_DEF_CURSOR_BLINK_TIME 400     /*ms*/
  353. #  define LV_TA_DEF_PWD_SHOW_TIME     1500    /*ms*/
  354. #endif

  355. /*Table (dependencies: lv_label)*/
  356. #define LV_USE_TABLE    1
  357. #if LV_USE_TABLE
  358. #  define LV_TABLE_COL_MAX    12
  359. #endif

  360. /*Tab (dependencies: lv_page, lv_btnm)*/
  361. #define LV_USE_TABVIEW      1
  362. #  if LV_USE_TABVIEW != 0
  363. /*Time of slide animation [ms] (0: no animation)*/
  364. #  define LV_TABVIEW_DEF_ANIM_TIME    300
  365. #endif

  366. /*Tileview (dependencies: lv_page) */
  367. #define LV_USE_TILEVIEW     1
  368. #if LV_USE_TILEVIEW
  369. /*Time of slide animation [ms] (0: no animation)*/
  370. #  define LV_TILEVIEW_DEF_ANIM_TIME   300
  371. #endif

  372. /*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/
  373. #define LV_USE_WIN      1

  374. /*==================
  375. * Non-user section
  376. *==================*/

  377. #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)    /* Disable warnings for Visual Studio*/
  378. #  define _CRT_SECURE_NO_WARNINGS
  379. #endif

  380. /*--END OF LV_CONF_H--*/

  381. /*Be sure every define has a default value*/
  382. #include "lvgl/src/lv_conf_checker.h"

  383. #endif /*LV_CONF_H*/

  384. #endif /*End of "Content enable"*/
主要分辨率要选成自己的屏幕对于的,并关闭系统支持~
下面我们对底层进行移植:
主要是LCD驱动及TOUCH驱动,我们把LVGL里面porting文件夹里面的temp进行修改:
其中:
lv_port_dis.c
  1. /**
  2. * @file lv_port_disp.c
  3. *
  4. */

  5. /*Copy this file as "lv_port_disp.c" and set this value to "1" to enable content*/
  6. #if 1

  7. /*********************
  8. *      INCLUDES
  9. *********************/
  10. #include "lv_port_disp.h"
  11. #include "lcd.h"
  12. /*********************
  13. *      DEFINES
  14. *********************/

  15. /**********************
  16. *      TYPEDEFS
  17. **********************/

  18. /**********************
  19. *  STATIC PROTOTYPES
  20. **********************/
  21. static void disp_init(void);

  22. static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);
  23. #if LV_USE_GPU
  24. static void gpu_blend(lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa);
  25. static void gpu_fill(lv_color_t * dest, uint32_t length, lv_color_t color);
  26. #endif

  27. /**********************
  28. *  STATIC VARIABLES
  29. **********************/

  30. /**********************
  31. *      MACROS
  32. **********************/

  33. /**********************
  34. *   GLOBAL FUNCTIONS
  35. **********************/

  36. void lv_port_disp_init(void)
  37. {
  38.     /*-------------------------
  39.      * Initialize your display
  40.      * -----------------------*/
  41.     disp_init();

  42.     /*-----------------------------
  43.      * Create a buffer for drawing
  44.      *----------------------------*/
  45.     /* Example for 1) */
  46.     static lv_disp_buf_t disp_buf_1;
  47.     static lv_color_t buf1_1[LV_HOR_RES_MAX * 10];                      /*A buffer for 10 rows*/
  48.     lv_disp_buf_init(&disp_buf_1, buf1_1, NULL, LV_HOR_RES_MAX * 10);   /*Initialize the display buffer*/

  49.     /*-----------------------------------
  50.      * Register the display in LittlevGL
  51.      *----------------------------------*/

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

  54.     /*Set up the functions to access to your display*/

  55.     /*Set the resolution of the display*/
  56.                 //适配多个屏幕
  57.     disp_drv.hor_res = lcddev.width;
  58.     disp_drv.ver_res = lcddev.height;
  59.                

  60.     /*Used to copy the buffer's content to the display*/
  61.     disp_drv.flush_cb = disp_flush;

  62.     /*Set a display buffer*/
  63.     disp_drv.buffer = &disp_buf_1;

  64. #if LV_USE_GPU
  65.     /*Optionally add functions to access the GPU. (Only in buffered mode, LV_VDB_SIZE != 0)*/

  66.     /*Blend two color array using opacity*/
  67.     disp_drv.gpu_blend = gpu_blend;

  68.     /*Fill a memory array with a color*/
  69.     disp_drv.gpu_fill = gpu_fill;
  70. #endif

  71.     /*Finally register the driver*/
  72.     lv_disp_drv_register(&disp_drv);
  73. }

  74. /**********************
  75. *   STATIC FUNCTIONS
  76. **********************/

  77. /* Initialize your display and the required peripherals. */
  78. static void disp_init(void)
  79. {
  80.     /*You code here*/
  81. }

  82. /* Flush the content of the internal buffer the specific area on the display
  83. * You can use DMA or any hardware acceleration to do this operation in the background but
  84. * 'lv_disp_flush_ready()' has to be called when finished. */
  85. static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
  86. {
  87.                 LCD_Color_Fill(area->x1,area->y1,area->x2,area->y2,(u16*)color_p);
  88.     /* IMPORTANT!!!
  89.      * Inform the graphics library that you are ready with the flushing*/
  90.     lv_disp_flush_ready(disp_drv);
  91. }


  92. /*OPTIONAL: GPU INTERFACE*/
  93. #if LV_USE_GPU

  94. /* If your MCU has hardware accelerator (GPU) then you can use it to blend to memories using opacity
  95. * It can be used only in buffered mode (LV_VDB_SIZE != 0 in lv_conf.h)*/
  96. static void gpu_blend(lv_disp_drv_t * disp_drv, lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa)
  97. {
  98.     /*It's an example code which should be done by your GPU*/
  99.     uint32_t i;
  100.     for(i = 0; i < length; i++) {
  101.         dest[i] = lv_color_mix(dest[i], src[i], opa);
  102.     }
  103. }

  104. /* If your MCU has hardware accelerator (GPU) then you can use it to fill a memory with a color
  105. * It can be used only in buffered mode (LV_VDB_SIZE != 0 in lv_conf.h)*/
  106. static void gpu_fill_cb(lv_disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width,
  107.                     const lv_area_t * fill_area, lv_color_t color);
  108. {
  109.     /*It's an example code which should be done by your GPU*/
  110.     uint32_t x, y;
  111.     dest_buf += dest_width * fill_area->y1; /*Go to the first line*/

  112.     for(y = fill_area->y1; y < fill_area->y2; y++) {
  113.         for(x = fill_area->x1; x < fill_area->x2; x++) {
  114.             dest_buf[x] = color;
  115.         }
  116.         dest_buf+=dest_width;    /*Go to the next line*/
  117.     }
  118. }

  119. #endif  /*LV_USE_GPU*/

  120. #else /* Enable this file at the top */

  121. /* This dummy typedef exists purely to silence -Wpedantic. */
  122. typedef int keep_pedantic_happy;
  123. #endif

lv_port_indev.c
  1. /**
  2. * @file lv_port_indev.c
  3. *
  4. */

  5. /*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*/
  6. #if 1

  7. /*********************
  8. *      INCLUDES
  9. *********************/
  10. #include "lv_port_indev.h"
  11. #include "touch.h"
  12. /*********************
  13. *      DEFINES
  14. *********************/

  15. /**********************
  16. *      TYPEDEFS
  17. **********************/

  18. /**********************
  19. *  STATIC PROTOTYPES
  20. **********************/

  21. static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);



  22. /**********************
  23. *  STATIC VARIABLES
  24. **********************/



  25. /**********************
  26. *      MACROS
  27. **********************/

  28. /**********************
  29. *   GLOBAL FUNCTIONS
  30. **********************/

  31. void lv_port_indev_init(void)
  32. {
  33.     lv_indev_drv_t indev_drv;

  34.     /*------------------
  35.      * Touchpad
  36.      * -----------------*/

  37.     /*Register a touchpad input device*/
  38.     lv_indev_drv_init(&indev_drv);
  39.     indev_drv.type = LV_INDEV_TYPE_POINTER;
  40.     indev_drv.read_cb = touchpad_read;
  41.     lv_indev_drv_register(&indev_drv);
  42. }

  43. /**********************
  44. *   STATIC FUNCTIONS
  45. **********************/

  46. /* Will be called by the library to read the touchpad */
  47. static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
  48. {
  49.                 static uint16_t last_x = 0;
  50.                 static uint16_t last_y = 0;
  51.                 if(tp_dev.sta&TP_PRES_DOWN)//触摸按下了
  52.                 {
  53.                         last_x = tp_dev.x[0];
  54.                         last_y = tp_dev.y[0];
  55.                         data->point.x = last_x;
  56.                         data->point.y = last_y;
  57.                         data->state = LV_INDEV_STATE_PR;
  58.                 }else{
  59.                         data->point.x = last_x;
  60.                         data->point.y = last_y;
  61.                         data->state = LV_INDEV_STATE_REL;
  62.                 }
  63.     /*Return `false` because we are not buffering and no more data to read*/
  64.     return false;
  65. }





  66. #else /* Enable this file at the top */

  67. /* This dummy typedef exists purely to silence -Wpedantic. */
  68. typedef int keep_pedantic_happy;
  69. #endif

在新建一个GUI_APP文件夹,把里面我们要展示的例子,添加进去~
Z7.png
在main函数里面调用:
  1. TIM1_Int_Init(999,119);//定时器初始化(1ms 中断),用于给 lvgl 提供 1ms 的心跳节拍
  2.   LCD_Init();
  3.   tp_dev.init();//触摸初始化

  4.   
  5.   lv_init();                                                //lvgl系统初始化
  6.         lv_port_disp_init();        //lvgl显示接口初始化,放在lv_init()的后面
  7.         lv_port_indev_init();        //lvgl输入接口初始化,放在lv_init()的后面
  8.        
  9.         //通过TEST_NUM的值来选择运行不同的例程
  10.         #if(TEST_NUM==1)
  11.                 demo_create();                       
  12.         #elif(TEST_NUM==2)
  13.                 lv_test_theme_1(lv_theme_night_init(210, NULL));
  14.         #else
  15.                 lv_test_theme_2();
  16.         #endif
  17.        
  18.         while(1)
  19.         {
  20.                 tp_dev.scan(0);
  21.                 lv_task_handler();
  22.         }
编译,查看效果。如前图。好了LVGL的移植就到这了。谢谢大家观看~


更多回帖

发帖
×
20
完善资料,
赚取积分