1058|4

261

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【ACM32G103RCT6】5-基于RGB_TFT裸机移植LVGL [复制链接]

 
本帖最后由 qiao--- 于 2024-1-18 01:30 编辑

前言

上期我们成功点亮了RGB_TFT屏幕,可以在这个屏幕上显示各种汉字和图形,但是手动的显示难免显示的图形界面有点不方便也有点麻烦,因为需要自己去找图形且设计,因此这次我们就来移植一下lvgl图形库。

首先来介绍一下LVGL,LVGL是一个开源的嵌入式图形库,用于创建图形用户界面(GUI)。它提供了丰富的图形元素和控件,可以在嵌入式系统上实现各种交互式用户界面。LVGL支持多种平台和显示设备,并具有高度可定制性和灵活性。它广泛应用于嵌入式系统、物联网设备、工业控制等领域。LVGL的全称是“LittlevGL”,是“Little Video Graphics Library”的缩写。

 

1.下载LVGL源码包

先给出lvgl的官网,源码包可以在lvgl的官方网站上下载,LVGL - Light and Versatile Embedded Graphics Library。我是从官网的github链接下载的,下载后的文件目录如下图所示

 
 其中比较重要的就是src,因为里面装了lvgl的源码,我们移植的重头戏也是这个文件夹里面的。其他的一些文件夹就是lvgl的一些移植文档和应用示例,有兴趣的贴友可以翻阅一下。

打开src文件夹,可以看一下我们需要移植的src文件夹里面有什么,如下图所示。

 
经过我的查阅,lvgl中的这些目录包含的文件的作用如下图所示:
  1. lv_core:这个子目录包含了LVGL的核心代码,例如事件处理、内存管理、对象管理等。这些代码是构建LVGL的基础,负责处理用户界面的基本功能。

  2. lv_draw:这个子目录包含了LVGL的绘图引擎,负责在显示设备上绘制各种图形元素和控件。这些代码通常包括了像像素级别的绘制、颜色管理等功能。

  3. lv_font:这个子目录包含了LVGL支持的字体库,用于在用户界面中显示文本。这些字体可以是固定宽度或变宽度的,可以支持不同的语言和字符集。

  4. lv_hal:这个子目录包含了LVGL的硬件抽象层(HAL),负责与显示设备、输入设备等硬件进行交互。这些代码通常需要根据具体的硬件平台进行定制。

  5. lv_misc:这个子目录包含了LVGL的一些辅助功能,例如颜色转换、文件操作等。

  6. lv_objx:这个子目录包含了LVGL的各种控件和对象,例如按钮、标签、列表等。这些控件是用户界面的构建块,可以用来创建各种交互式界面。

在example文件夹下中其中的porting文件夹也是我们移植的重头戏,因为这个文件夹中包含着lvgl的设备输入和显示输入的一些相关文件。如下图所示

 

2.移植lvgl源码

打开我们之前的创建的RGB_TFT的工程。创建一个GUI的目录,在其下面创建一个lvgl文件夹并复制lvgl的源码和porting文件夹到这个文件夹内,将lvgl源码中的lv_conf_template.h文件改名为lv_conf.h复制到lvgl目录下。如下图。我把demos文件夹也复制过去了,方便移植lvgl自带的例程。

 
 

打开工程,将src文件夹的所有文件添加到工程中,将porting文件夹中的文件也添加到工程中。如下图所示

 

 
 

 

3.修改代码

将 lv_port_disp.c 、 lv_port_disp.h 、 lv_port_indev.c 、 lv_port_indev.h、 lv_conf.h中if 0改成 if 1,lv_port_fs.c暂时用不到,先不修改。

 

此时我们来编译一下原工程,发现有很多报错,我们逐一修改:

(1)将_template去掉,因为我们之前有修改过源文件
(2)将…/…/去掉
(3)将#include "../../lvgl.h"改成#include "../lvgl.h"

紧接着修改lv_port_disp.c文件,定义屏幕像素的长和宽

婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚敐澶婄闁挎繂妫Λ鍕⒑閸濆嫷鍎庣紒鑸靛哺瀵鈽夊Ο閿嬵潔濠殿喗顨呴悧濠囧极妤e啯鈷戦柛娑橈功閹冲啰绱掔紒姗堣€跨€殿喖顭烽弫鎰緞婵犲嫷鍚呴梻浣瑰缁诲倸螞椤撶倣娑㈠礋椤栨稈鎷洪梺鍛婄箓鐎氱兘宕曟惔锝囩<闁兼悂娼ч崫铏光偓娈垮枦椤曆囧煡婢跺á鐔兼煥鐎e灚缍屽┑鐘愁問閸犳銆冮崨瀛樺亱濠电姴娲ら弸浣肝旈敐鍛殲闁抽攱鍨块弻娑樷槈濮楀牆濮涢梺鐟板暱閸熸壆妲愰幒鏃傜<婵☆垰鎼~鎺戔攽閻橆偄浜炬繛鎾村焹閸嬫挻鎱ㄦ繝鍛仩缂侇喗鐟ч幑鍕Ω瑜滈崬鍫曟⒒娴e憡鍟為柤褰掔畺椤㈡牠宕堕埡鍌ゆ綗闂佺粯鍔曢幖顐ょ不閿濆鐓ラ柡鍐ㄥ€瑰▍鏇㈡煕濮椻偓娴滆泛顫忓ú顏咁棃婵炴番鍔岀紞濠傜暦閺囥垺鐒肩€广儱鎳愰崝锕€顪冮妶鍡楀潑闁稿鎸荤换娑氫焊閺嶃倕浜鹃柟棰佺濞堛劍绻濋悽闈浶g痪鏉跨Ч瀵煡骞撻幒婵堝數闁荤姾娅g亸銊╁礉閻旀悶浜滈柡鍐e亾閻㈩垽绻濋獮鍐ㄎ旈崘鈺佹瀭闂佸憡娲﹂崜娑⑺囬妷銉㈡斀闁绘劘灏欏﹢鎾煕婵犲啰绠撻柣锝囧厴椤㈡洟鍩涘顓熴仢妞ゃ垺妫冨畷銊╊敂閸涱収浼栭梻鍌氬€风粈渚€骞夐敍鍕床闁稿本澹曢崑鎾愁潩閸楃偛骞嬮悗瑙勬礃濞茬喖鐛崶顒佸亱闁割偁鍨归獮妤佺節瀵伴攱婢橀埀顒佹尵濞嗐垽鍨鹃弬銉︾亖濠殿喗銇涢崑鎾绘煛瀹€鈧崰鏍偘椤曗偓瀹曞綊顢欓崣銉﹀亝闂傚倷绀侀悿鍥涢崟顖€鍥垂椤愶絽寮块梺閫炲苯澧撮柡宀嬬到铻f繛鑼额嚙閺呴亶姊洪崨濠呭闁硅櫕锚椤繒绱掑Ο璇差€撻梺鎯х箳閹虫挾绮敓鐘斥拺闁告稑锕ラ埛鎰箾閼碱剙鏋涢柕鍡曠椤繃锛愬┑鍥ㄦ珝闂備胶绮崝蹇涘疾濠婂牊鍊跺〒姘e亾婵﹥妞藉Λ鍐ㄢ槈濮橆剦鏆俊鐐€х紓姘跺础閹惰棄鏄ユ繛鎴欏灩缁狅綁鏌i幇顔芥毄妞ゆ梹娲熷娲偂鎼存稑浠銈冨€曢崐鍨暦闂堟稈鏋庨柟鏉跨仛椤旀棃姊虹紒妯哄闁诡垰鑻埢鎾斥堪閸喓鍘搁悗鍏夊亾闁逞屽墴瀹曚即寮介鐐电暫闂佺粯鍨兼慨銈夊磻鐎n喗鐓曟い鎰剁悼缁犳牠鏌h箛鎾诲弰闁哄矉绲鹃幆鏃堝閳轰焦娅涢梻浣告憸婵敻鎮ч悩璇茬伋闁挎洖鍊归崐濠氭煢濡警妲洪柣锝嗘そ濮婃椽妫冨☉姘辩杽闂佺ǹ锕ラ悧鐘荤嵁閸℃稒鍊烽柣鎴炨缚閸橀亶姊洪幐搴㈩梿妞ゆ泦鍐惧殨閻犳亽鍔庣壕濂稿级閸稑濡块柛娆屽亾婵犳鍠栭敃锔惧垝椤栨粎绠旈柣鏃傚帶閻掑灚銇勯幒鍡椾壕鐎光偓閿濆牆鍔垫い锔芥尦閺岀喖鐛崹顔句紙濡ょ姷鍋炵敮锟犵嵁濮椻偓瀵爼骞嬪┑鍛闂傚倸鍊烽悞锕傛儑瑜版帒鍨傜憸鐗堝笒缁犵喖鏌ㄩ悢鍝勑㈢痪鎯х秺閺屾盯顢曢敐鍡欘槰闂佺粯鎸诲ú姗€濡甸崟顖氱疀妞ゆ柨銇欓姀銈嗙厱闁哄啠鍋撶紒顔芥崌瀵顓兼径瀣弳闁诲函缍嗘禍鐐村瀹€鍕拺闁告繂瀚﹢鎵磼鐎n偄鐏撮柛鈺冨仱楠炲鏁冮埀顒勭嵁閵忊€茬箚闁靛牆鎷戝妤呮煙椤曞棛绋诲ǎ鍥э躬閹瑩顢旈崟銊ヤ壕闁哄洨濮靛畷鏌ユ煕椤愮姴鍔氱痪鎯ф健閺岋綁濮€閳惰泛缍婇幏鎴︽偄閸濄儳顔曢梺鐟邦嚟閸嬬喖骞婇崟顖涚厱閹艰揪绲介弸娑㈡煛鐏炶濡奸柍瑙勫灴瀹曞崬顫滈崱姗堢磼濠电姵顔栭崳顖滃緤娴犲鍋嬮柟鎹愵嚙缁犳牗淇婇妶鍌氫壕闂佸磭绮幑鍥х暦瑜版帩鏁婇柣锝呭闁垰鈹戦敍鍕杭闁稿ǹ鍊濆畷锝夊礃椤旇偐鍝楅柡澶婄墑閸斿酣鍩炲鍛斀闁绘ê寮堕幖鎰磼閻樺灚鍤€闂囧鏌ㄥ┑鍡樺櫤闁瑰弶鎮傞弻娑樜熺紒妯衡偓鎰叏婵犲懏顏犵紒顔界懇楠炴劖鎯旈姀鈥愁伆闂傚倷鐒﹀鍧楀矗鎼淬劌绐楁慨妯垮煐閸ゅ秹寮堕崼娑樺妞も晝鍏橀幃妤呮晲鎼粹€茬爱闂佸綊顥撶划顖滄崲濞戞瑦缍囬柛鎾楀啫鐓傞梻浣侯攰濞呮洟鎮烽妸鈺佄﹂柟鐗堟緲缁犳娊鏌熺€涙ḿ绠樼憸鏉款槹娣囧﹪鎮欓鍕ㄥ亾閺嶎偅鏆滈柟鐑橆殔绾剧懓鈹戦悩宕囶暡闁稿孩顨嗙换娑㈠幢濡闉嶉梺缁樻尰閻熲晛顕i崼鏇為唶闁绘柨鍢叉慨銏ゆ⒑娴兼瑩妾紒顔芥崌瀵鍩勯崘鈺侇€撶紓浣割儏缁ㄩ亶宕戦幘璇查敜婵°倐鍋撻柦鍐枛閺屾洘绻涢悙顒佺彆闂佺ǹ顑呭Λ婵嬪蓟濞戞矮娌柛鎾椻偓濡插牆顪冮妶鍛寸崪闁瑰嚖鎷�
  • #define MY_DISP_HOR_RES 128
  • #define MY_DISP_VER_RES 160

修改刷屏函数

婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚敐澶婄闁挎繂妫Λ鍕⒑閸濆嫷鍎庣紒鑸靛哺瀵鈽夊Ο閿嬵潔濠殿喗顨呴悧濠囧极妤e啯鈷戦柛娑橈功閹冲啰绱掔紒姗堣€跨€殿喖顭烽弫鎰緞婵犲嫷鍚呴梻浣瑰缁诲倸螞椤撶倣娑㈠礋椤栨稈鎷洪梺鍛婄箓鐎氱兘宕曟惔锝囩<闁兼悂娼ч崫铏光偓娈垮枦椤曆囧煡婢跺á鐔兼煥鐎e灚缍屽┑鐘愁問閸犳銆冮崨瀛樺亱濠电姴娲ら弸浣肝旈敐鍛殲闁抽攱鍨块弻娑樷槈濮楀牆濮涢梺鐟板暱閸熸壆妲愰幒鏃傜<婵☆垰鎼~鎺戔攽閻橆偄浜炬繛鎾村焹閸嬫挻鎱ㄦ繝鍛仩缂侇喗鐟ч幑鍕Ω瑜滈崬鍫曟⒒娴e憡鍟為柤褰掔畺椤㈡牠宕堕埡鍌ゆ綗闂佺粯鍔曢幖顐ょ不閿濆鐓ラ柡鍐ㄥ€瑰▍鏇㈡煕濮椻偓娴滆泛顫忓ú顏咁棃婵炴番鍔岀紞濠傜暦閺囥垺鐒肩€广儱鎳愰崝锕€顪冮妶鍡楀潑闁稿鎸荤换娑氫焊閺嶃倕浜鹃柟棰佺濞堛劍绻濋悽闈浶g痪鏉跨Ч瀵煡骞撻幒婵堝數闁荤姾娅g亸銊╁礉閻旀悶浜滈柡鍐e亾閻㈩垽绻濋獮鍐ㄎ旈崘鈺佹瀭闂佸憡娲﹂崜娑⑺囬妷銉㈡斀闁绘劘灏欏﹢鎾煕婵犲啰绠撻柣锝囧厴椤㈡洟鍩涘顓熴仢妞ゃ垺妫冨畷銊╊敂閸涱収浼栭梻鍌氬€风粈渚€骞夐敍鍕床闁稿本澹曢崑鎾愁潩閸楃偛骞嬮悗瑙勬礃濞茬喖鐛崶顒佸亱闁割偁鍨归獮妤佺節瀵伴攱婢橀埀顒佹尵濞嗐垽鍨鹃弬銉︾亖濠殿喗銇涢崑鎾绘煛瀹€鈧崰鏍偘椤曗偓瀹曞綊顢欓崣銉﹀亝闂傚倷绀侀悿鍥涢崟顖€鍥垂椤愶絽寮块梺閫炲苯澧撮柡宀嬬到铻f繛鑼额嚙閺呴亶姊洪崨濠呭闁硅櫕锚椤繒绱掑Ο璇差€撻梺鎯х箳閹虫挾绮敓鐘斥拺闁告稑锕ラ埛鎰箾閼碱剙鏋涢柕鍡曠椤繃锛愬┑鍥ㄦ珝闂備胶绮崝蹇涘疾濠婂牊鍊跺〒姘e亾婵﹥妞藉Λ鍐ㄢ槈濮橆剦鏆俊鐐€х紓姘跺础閹惰棄鏄ユ繛鎴欏灩缁狅綁鏌i幇顔芥毄妞ゆ梹娲熷娲偂鎼存稑浠銈冨€曢崐鍨暦闂堟稈鏋庨柟鏉跨仛椤旀棃姊虹紒妯哄闁诡垰鑻埢鎾斥堪閸喓鍘搁悗鍏夊亾闁逞屽墴瀹曚即寮介鐐电暫闂佺粯鍨兼慨銈夊磻鐎n喗鐓曟い鎰剁悼缁犳牠鏌h箛鎾诲弰闁哄矉绲鹃幆鏃堝閳轰焦娅涢梻浣告憸婵敻鎮ч悩璇茬伋闁挎洖鍊归崐濠氭煢濡警妲洪柣锝嗘そ濮婃椽妫冨☉姘辩杽闂佺ǹ锕ラ悧鐘荤嵁閸℃稒鍊烽柣鎴炨缚閸橀亶姊洪幐搴㈩梿妞ゆ泦鍐惧殨閻犳亽鍔庣壕濂稿级閸稑濡块柛娆屽亾婵犳鍠栭敃锔惧垝椤栨粎绠旈柣鏃傚帶閻掑灚銇勯幒鍡椾壕鐎光偓閿濆牆鍔垫い锔芥尦閺岀喖鐛崹顔句紙濡ょ姷鍋炵敮锟犵嵁濮椻偓瀵爼骞嬪┑鍛闂傚倸鍊烽悞锕傛儑瑜版帒鍨傜憸鐗堝笒缁犵喖鏌ㄩ悢鍝勑㈢痪鎯х秺閺屾盯顢曢敐鍡欘槰闂佺粯鎸诲ú姗€濡甸崟顖氱疀妞ゆ柨銇欓姀銈嗙厱闁哄啠鍋撶紒顔芥崌瀵顓兼径瀣弳闁诲函缍嗘禍鐐村瀹€鍕拺闁告繂瀚﹢鎵磼鐎n偄鐏撮柛鈺冨仱楠炲鏁冮埀顒勭嵁閵忊€茬箚闁靛牆鎷戝妤呮煙椤曞棛绋诲ǎ鍥э躬閹瑩顢旈崟銊ヤ壕闁哄洨濮靛畷鏌ユ煕椤愮姴鍔氱痪鎯ф健閺岋綁濮€閳惰泛缍婇幏鎴︽偄閸濄儳顔曢梺鐟邦嚟閸嬬喖骞婇崟顖涚厱閹艰揪绲介弸娑㈡煛鐏炶濡奸柍瑙勫灴瀹曞崬顫滈崱姗堢磼濠电姵顔栭崳顖滃緤娴犲鍋嬮柟鎹愵嚙缁犳牗淇婇妶鍌氫壕闂佸磭绮幑鍥х暦瑜版帩鏁婇柣锝呭闁垰鈹戦敍鍕杭闁稿ǹ鍊濆畷锝夊礃椤旇偐鍝楅柡澶婄墑閸斿酣鍩炲鍛斀闁绘ê寮堕幖鎰磼閻樺灚鍤€闂囧鏌ㄥ┑鍡樺櫤闁瑰弶鎮傞弻娑樜熺紒妯衡偓鎰叏婵犲懏顏犵紒顔界懇楠炴劖鎯旈姀鈥愁伆闂傚倷鐒﹀鍧楀矗鎼淬劌绐楁慨妯垮煐閸ゅ秹寮堕崼娑樺妞も晝鍏橀幃妤呮晲鎼粹€茬爱闂佸綊顥撶划顖滄崲濞戞瑦缍囬柛鎾楀啫鐓傞梻浣侯攰濞呮洟鎮烽妸鈺佄﹂柟鐗堟緲缁犳娊鏌熺€涙ḿ绠樼憸鏉款槹娣囧﹪鎮欓鍕ㄥ亾閺嶎偅鏆滈柟鐑橆殔绾剧懓鈹戦悩宕囶暡闁稿孩顨嗙换娑㈠幢濡闉嶉梺缁樻尰閻熲晛顕i崼鏇為唶闁绘柨鍢叉慨銏ゆ⒑娴兼瑩妾紒顔芥崌瀵鍩勯崘鈺侇€撶紓浣割儏缁ㄩ亶宕戦幘璇查敜婵°倐鍋撻柦鍐枛閺屾洘绻涢悙顒佺彆闂佺ǹ顑呭Λ婵嬪蓟濞戞矮娌柛鎾椻偓濡插牆顪冮妶鍛寸崪闁瑰嚖鎷�
  • static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
  • {
  • if(disp_flush_enabled) {
  • /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
  • uint16_t x,y;
  • for(y = area->y1; y <= area->y2; y++) {
  • for(x = area->x1; x <= area->x2; x++) {
  • /*Put a pixel to the display. For example:*/
  • /*put_px(x, y, *color_p)*/
  • Gui_DrawPoint(x,y,lv_color_to16(*color_p));
  • color_p++;
  • }
  • }
  • }
  • /*IMPORTANT!!!
  • *Inform the graphics library that you are ready with the flushing*/
  • lv_disp_flush_ready(disp_drv);
  • }

紧接着我们编译一下就没有问题了,现在我们需要做的就是为lvgl添加时基,我是用的定时器6为lvgl添加的时基。我们写好定时器6的驱动时基代码如下:

婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚敐澶婄闁挎繂妫Λ鍕⒑閸濆嫷鍎庣紒鑸靛哺瀵鈽夊Ο閿嬵潔濠殿喗顨呴悧濠囧极妤e啯鈷戦柛娑橈功閹冲啰绱掔紒姗堣€跨€殿喖顭烽弫鎰緞婵犲嫷鍚呴梻浣瑰缁诲倸螞椤撶倣娑㈠礋椤栨稈鎷洪梺鍛婄箓鐎氱兘宕曟惔锝囩<闁兼悂娼ч崫铏光偓娈垮枦椤曆囧煡婢跺á鐔兼煥鐎e灚缍屽┑鐘愁問閸犳銆冮崨瀛樺亱濠电姴娲ら弸浣肝旈敐鍛殲闁抽攱鍨块弻娑樷槈濮楀牆濮涢梺鐟板暱閸熸壆妲愰幒鏃傜<婵☆垰鎼~鎺戔攽閻橆偄浜炬繛鎾村焹閸嬫挻鎱ㄦ繝鍛仩缂侇喗鐟ч幑鍕Ω瑜滈崬鍫曟⒒娴e憡鍟為柤褰掔畺椤㈡牠宕堕埡鍌ゆ綗闂佺粯鍔曢幖顐ょ不閿濆鐓ラ柡鍐ㄥ€瑰▍鏇㈡煕濮椻偓娴滆泛顫忓ú顏咁棃婵炴番鍔岀紞濠傜暦閺囥垺鐒肩€广儱鎳愰崝锕€顪冮妶鍡楀潑闁稿鎸荤换娑氫焊閺嶃倕浜鹃柟棰佺濞堛劍绻濋悽闈浶g痪鏉跨Ч瀵煡骞撻幒婵堝數闁荤姾娅g亸銊╁礉閻旀悶浜滈柡鍐e亾閻㈩垽绻濋獮鍐ㄎ旈崘鈺佹瀭闂佸憡娲﹂崜娑⑺囬妷銉㈡斀闁绘劘灏欏﹢鎾煕婵犲啰绠撻柣锝囧厴椤㈡洟鍩涘顓熴仢妞ゃ垺妫冨畷銊╊敂閸涱収浼栭梻鍌氬€风粈渚€骞夐敍鍕床闁稿本澹曢崑鎾愁潩閸楃偛骞嬮悗瑙勬礃濞茬喖鐛崶顒佸亱闁割偁鍨归獮妤佺節瀵伴攱婢橀埀顒佹尵濞嗐垽鍨鹃弬銉︾亖濠殿喗銇涢崑鎾绘煛瀹€鈧崰鏍偘椤曗偓瀹曞綊顢欓崣銉﹀亝闂傚倷绀侀悿鍥涢崟顖€鍥垂椤愶絽寮块梺閫炲苯澧撮柡宀嬬到铻f繛鑼额嚙閺呴亶姊洪崨濠呭闁硅櫕锚椤繒绱掑Ο璇差€撻梺鎯х箳閹虫挾绮敓鐘斥拺闁告稑锕ラ埛鎰箾閼碱剙鏋涢柕鍡曠椤繃锛愬┑鍥ㄦ珝闂備胶绮崝蹇涘疾濠婂牊鍊跺〒姘e亾婵﹥妞藉Λ鍐ㄢ槈濮橆剦鏆俊鐐€х紓姘跺础閹惰棄鏄ユ繛鎴欏灩缁狅綁鏌i幇顔芥毄妞ゆ梹娲熷娲偂鎼存稑浠銈冨€曢崐鍨暦闂堟稈鏋庨柟鏉跨仛椤旀棃姊虹紒妯哄闁诡垰鑻埢鎾斥堪閸喓鍘搁悗鍏夊亾闁逞屽墴瀹曚即寮介鐐电暫闂佺粯鍨兼慨銈夊磻鐎n喗鐓曟い鎰剁悼缁犳牠鏌h箛鎾诲弰闁哄矉绲鹃幆鏃堝閳轰焦娅涢梻浣告憸婵敻鎮ч悩璇茬伋闁挎洖鍊归崐濠氭煢濡警妲洪柣锝嗘そ濮婃椽妫冨☉姘辩杽闂佺ǹ锕ラ悧鐘荤嵁閸℃稒鍊烽柣鎴炨缚閸橀亶姊洪幐搴㈩梿妞ゆ泦鍐惧殨閻犳亽鍔庣壕濂稿级閸稑濡块柛娆屽亾婵犳鍠栭敃锔惧垝椤栨粎绠旈柣鏃傚帶閻掑灚銇勯幒鍡椾壕鐎光偓閿濆牆鍔垫い锔芥尦閺岀喖鐛崹顔句紙濡ょ姷鍋炵敮锟犵嵁濮椻偓瀵爼骞嬪┑鍛闂傚倸鍊烽悞锕傛儑瑜版帒鍨傜憸鐗堝笒缁犵喖鏌ㄩ悢鍝勑㈢痪鎯х秺閺屾盯顢曢敐鍡欘槰闂佺粯鎸诲ú姗€濡甸崟顖氱疀妞ゆ柨銇欓姀銈嗙厱闁哄啠鍋撶紒顔芥崌瀵顓兼径瀣弳闁诲函缍嗘禍鐐村瀹€鍕拺闁告繂瀚﹢鎵磼鐎n偄鐏撮柛鈺冨仱楠炲鏁冮埀顒勭嵁閵忊€茬箚闁靛牆鎷戝妤呮煙椤曞棛绋诲ǎ鍥э躬閹瑩顢旈崟銊ヤ壕闁哄洨濮靛畷鏌ユ煕椤愮姴鍔氱痪鎯ф健閺岋綁濮€閳惰泛缍婇幏鎴︽偄閸濄儳顔曢梺鐟邦嚟閸嬬喖骞婇崟顖涚厱閹艰揪绲介弸娑㈡煛鐏炶濡奸柍瑙勫灴瀹曞崬顫滈崱姗堢磼濠电姵顔栭崳顖滃緤娴犲鍋嬮柟鎹愵嚙缁犳牗淇婇妶鍌氫壕闂佸磭绮幑鍥х暦瑜版帩鏁婇柣锝呭闁垰鈹戦敍鍕杭闁稿ǹ鍊濆畷锝夊礃椤旇偐鍝楅柡澶婄墑閸斿酣鍩炲鍛斀闁绘ê寮堕幖鎰磼閻樺灚鍤€闂囧鏌ㄥ┑鍡樺櫤闁瑰弶鎮傞弻娑樜熺紒妯衡偓鎰叏婵犲懏顏犵紒顔界懇楠炴劖鎯旈姀鈥愁伆闂傚倷鐒﹀鍧楀矗鎼淬劌绐楁慨妯垮煐閸ゅ秹寮堕崼娑樺妞も晝鍏橀幃妤呮晲鎼粹€茬爱闂佸綊顥撶划顖滄崲濞戞瑦缍囬柛鎾楀啫鐓傞梻浣侯攰濞呮洟鎮烽妸鈺佄﹂柟鐗堟緲缁犳娊鏌熺€涙ḿ绠樼憸鏉款槹娣囧﹪鎮欓鍕ㄥ亾閺嶎偅鏆滈柟鐑橆殔绾剧懓鈹戦悩宕囶暡闁稿孩顨嗙换娑㈠幢濡闉嶉梺缁樻尰閻熲晛顕i崼鏇為唶闁绘柨鍢叉慨銏ゆ⒑娴兼瑩妾紒顔芥崌瀵鍩勯崘鈺侇€撶紓浣割儏缁ㄩ亶宕戦幘璇查敜婵°倐鍋撻柦鍐枛閺屾洘绻涢悙顒佺彆闂佺ǹ顑呭Λ婵嬪蓟濞戞矮娌柛鎾椻偓濡插牆顪冮妶鍛寸崪闁瑰嚖鎷�
  • #include "lvgl_timer.h"
  • #include "acm32g103_coreboard.h"
  • #include "lvgl.h"
  • TIM_HandleTypeDef TIM6_Handler;
  • //中断处理函数执行的内容
  • void HAL_TIM_Updeate_Event_Callback(TIM_HandleTypeDef *htim)
  • {
  • if (htim->Instance == TIM6)
  • {
  • HAL_IncTick();
  • lv_tick_inc(1);
  • }
  • }
  • void TIM6_MSP_Pre_Init(TIM_HandleTypeDef * htim)
  • {
  • HAL_TIMER_MSP_Init(&TIM6_Handler);
  • }
  • void TIM6_MSP_Post_Init(void)
  • {
  • /*
  • do nothing here
  • */
  • }
  • void TIM6_Init(void)
  • {
  • uint32_t timer_clock;
  • timer_clock = HAL_RCC_GetPCLK1Freq(); // TIM6 is in APB1
  • if (HAL_RCC_GetHCLKFreq() != timer_clock) // if hclk/pclk != 1, then timer clk = pclk * 2
  • {
  • timer_clock = timer_clock << 1;
  • }
  • TIM6_Handler.Instance = TIM6;
  • TIM6_Handler.Init.ARRPreLoadEn = TIM_ARR_PRELOAD_ENABLE;
  • TIM6_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  • TIM6_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
  • TIM6_Handler.Init.RepetitionCounter = 0;
  • TIM6_Handler.Init.Prescaler = (timer_clock/TIM_CLOCK_FREQ) - 1;
  • TIM6_Handler.Init.Period = (TIM_CLOCK_FREQ/1000)*1 - 1; // 1ms
  • TIM6_MSP_Pre_Init(&TIM6_Handler);
  • HAL_TIMER_Base_Init(&TIM6_Handler);
  • HAL_TIM_ENABLE_IT(&TIM6_Handler, TIMER_INT_EN_UPD);
  • TIM6_MSP_Post_Init();
  • HAL_TIMER_Base_Start(TIM6_Handler.Instance);
  • }

紧接着我们需要main函数的while中添加lvgl任务处理函数lv_task_handler();

 

这样lvgl就可以运行了。

我们编写一个简单的界面如下,界面编写的是3个lvgl按钮。

 

 

  4.上电测试

我们将写好的代码编译烧进板子,就可以看到我们的lvgl正常运行了。

效果图如下所示:

 

 

 

总结:通过本次成功移植lvgl,现在我们可以创造我们想要的界面。但是这是裸机移植lvgl,任务不是很好管理,下一期我们移植带操作系统的lvgl。

 

裸机lvgl.zip (16.81 MB, 下载次数: 6)

 

查看本帖全部内容,请登录或者注册

最新回复

大佬厉害,我也准备移植一波的,现在有参考案例,挺好  详情 回复 发表于 2024-1-18 15:31
点赞 关注(1)
 
 

回复
举报

7243

帖子

11

TA的资源

版主

沙发
 
太感楼主提供这么好的模版了,感谢感谢,最近您的连连中奖,我们可以好好向您学习了!

点评

哈哈,我们一起进步  详情 回复 发表于 2024-1-18 10:48
 
 
 

回复

7069

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 

裸机移植lvgl已经整的很不错了

 
 
 

回复

261

帖子

0

TA的资源

纯净的硅(初级)

4
 
lugl4313820 发表于 2024-1-18 07:48 太感楼主提供这么好的模版了,感谢感谢,最近您的连连中奖,我们可以好好向您学习了!

哈哈,我们一起进步


 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

5
 

大佬厉害,我也准备移植一波的,现在有参考案例,挺好


 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 2/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 4

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表