ESP32 移植 AWTK(嵌入式GUI库)

这篇具有很好参考价值的文章主要介绍了ESP32 移植 AWTK(嵌入式GUI库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 前言:

最近了解到有一个叫AWTK的嵌入式GUI库,是ZLG(周立功)开发的一个开源免费可商用的嵌入式GUI库。手头上刚好有一个自己最近设计的ESP32测试板,型号是ESP32_WROOM_32,和一个0.96寸80x160的TFT屏,就想着能不能把这个AWTK库移植到ESP32上玩一下。于是,我又开始给自己挖坑了。

二、移植资料准备:

这次移植中,用的开发框架不是ESP-IDF,而是自己比较喜欢的ESP32 Arduino框架,开发平台用的是VScode+Platformio插件进行开发。

首先,当然是先要到github官网下载awtk库,链接如下:

AWTK库github下载链接

下载到awtk库后,只保留3rd、demos、res、src这4个文件夹,其中src和3rd文件夹中是awtk的核心代码,demos和res文件夹是为了移植后用于测试的demo需要用到的文件。

然后新建一个awtk文件夹,把这4个文件夹都拷贝到awtk文件夹中。然后在新建一个awtk-port的文件夹,用来存放移植需要用户修改的文件,最后在新建一个AWTK_GUI文件夹,把awtk文件夹和awtk-port文件夹都放到AWTK_GUI文件夹中,作为platformio的第三方扩展库放到lib文件夹中。如下图所示。

awtk,嵌入式,c语言,c++,单片机,嵌入式硬件,ui

在移植过程中,自己也发现很多问题,比如说awtk库编译时找不到头文件,后面自己通过翻看awtk库的文件才发现里面的头文件路径有些问题,就是有些文件中对头文件的路径表述不清,有一些是相对路径,但有些又不是。自己也是花了很长时间把所有文件中的头文件路径都改成相对路径,同时也删除和注释很多多余的文件,最终才编译成功的。

三、移植步骤:

1.平台初始化

平台初始化通常用于初始化平台相关的准备模块,比如AWTK的内存管理器。不过我初始化内存的方式是用系统自带的malloc来动态分配内存,没有是用静态数组来分配内存,代码如下:

/**
 * @method platform_prepare
 *
 * 平台准备函数。
 *
 * @return {ret_t} 返回RET_OK表示成功,否则表示失败。
 */
/* 给 AWTK 开辟一块大小为 TK_MEM_SIZE 的内存 s_mem */
#define TK_MEM_SIZE 32 * 1024
ret_t platform_prepare(void)
{
  /* 定义宏 HAS_STD_MALLOC 将使用系统标准 malloc 函数,建议使用系统自带的malloc */
#ifndef HAS_STD_MALLOC
  static uint8_t s_mem[TK_MEM_SIZE]; /* 此处以静态数组为例 */
  tk_mem_init(s_mem, sizeof(s_mem)); /* 初始化 AWTK 内存管理器 */
#endif

  return RET_OK;
}

2.实现时钟和睡眠的函数

时钟一般用来计算时间间隔,实现定时器和动画功能;睡眠一般用于 AWTK 主循环限制 GUI 帧率,代码如下:

/**
 * @method get_time_ms64
 * 获取当前时间(毫秒)。
 *
 * @return {uint64_t} 成功返回当前时间。
 */
uint64_t get_time_ms64(void)
{
  return (uint64_t)(esp_timer_get_time() / 1000ULL);
}

/**
 * @method sleep_ms
 *
 * 睡眠指定时间。
 *
 * @param {uint32_t} ms 睡眠时间(毫秒)。
 *
 * @return {void} 无。
 */
void sleep_ms(uint32_t ms)
{
  delay(ms);
}

3.LCD显示函数实现:

屏幕用的是TFT_eSPI库,TFT IC是ST7735,通信方式是用了SPI接口,屏幕点亮比较简单,在TFT_eSPI库中的User_Setup.h中把用到的IC的宏定义打开,修改SPI接口的引脚号即可,最后在main.c中初始化一下即可点亮。

其中为了让AWTK库可以调用点亮屏幕的接口函数,需要在TFT_eSPI库中的TFT_eSPI.cpp文件中添加以下两个函数,同时在TFT_eSPI.h中的类中声明这两个函数。这两个函数会在awtk-port文件夹中的lcd_esp32_raw.cpp被调用。

//移植AWTK需要在TFT_eSPI.cpp添加的两个函数
void TFT_eSPI::esp32_write_data_func(uint16_t dat)

{

  begin_tft_write();

  pushColor(dat);

  end_tft_write();

}

void TFT_eSPI::esp32_set_window_func(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye)

{

  begin_tft_write();

  setWindow(xs, ys, xe, ye);

  end_tft_write();

}

注意:

由于本次使用的屏幕是SPI接口的,使用的是寄存器方式去点亮屏幕的,所以只能使用片段式的Framebuffer的方式点亮,该方式不支持矢量画布vgcanvans,所以如果使用了扩展控件的话,如用到了环形进度条(progress circle)或者开关(Switch),将会出现环形进度条不显示,开关的圆角矩形消失的现象。

四、 GUI的设计:

GUI设计使用的是AWTK官方提供的AWTK_Designer来开发,用这个软件可以所见即所得设计GUI,还能模拟运行,非常方便。

五、GUI的部署到ESP32的方法:

只需把设计好的GUI先编译,再打包,当然模拟运行也可以打包,如下图所示:

awtk,嵌入式,c语言,c++,单片机,嵌入式硬件,ui

打包好后就可以到AWTK_Designer的工程目录里把res、src两个文件夹拷贝出来。其中src文件夹改名为demos文件夹,去分别替代自己ESP32工程目录里的res文件夹和demos文件夹,如下图所示:

awtk,嵌入式,c语言,c++,单片机,嵌入式硬件,ui

其中src文件夹里的main.c文件需要改为demo.h,同时内容换成如下代码:

#define DEMO_H

BEGIN_C_DECLS

#include "../src/tkc/types_def.h"
#include "../res/assets.inc"

ret_t application_init();
ret_t application_exit();

END_C_DECLS
#endif /* DEMO_H */

当然,也可以换成其他名字的头文件,这个头文件主要是为了对外声明,application_init,application_exit两个函数。

六、效果展示

awtk,嵌入式,c语言,c++,单片机,嵌入式硬件,ui

七、代码开源

为了方便大家更好的移植,这个ESP32移植AWTK的工程代码将会完全开源,当然这个工程代码也有不足,比如说外部输入设备还没有移植进去,大家可以继续看官网的AWTK移植文档去继续移植。

AWTK官网文档链接

AWTK移植源码github链接文章来源地址https://www.toymoban.com/news/detail-814943.html

到了这里,关于ESP32 移植 AWTK(嵌入式GUI库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通信工程毕设 基于ESP32的在线墨水屏桌面摆件 -物联网 单片机 嵌入式

    hr style=\\\" border:solid; width:100px; height:1px;\\\" color=#000000 size=1\\\" 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最

    2024年02月19日
    浏览(61)
  • 适合嵌入式开发的GUI(嵌入式学习)

    嵌入式开发中的GUI(图形用户界面)是指在嵌入式系统中实现图形化的用户界面,以便用户可以通过触摸屏、按钮、鼠标或其他输入设备与系统进行交互。 以下是一些常见的嵌入式GUI开发方法: 轻量级GUI库:一些轻量级的GUI库适用于嵌入式系统,例如uGFX、LittlevGL、Nanogui等。

    2024年02月09日
    浏览(68)
  • 嵌入式C语言基础(STM32)

    前言:一条混迹嵌入式3年的老咸鱼,想到自己第一次接触到stm32的库函数时,c语言稀碎,痛不欲生的场景,该文章为萌新指条明路。 位操作在嵌入式中常用于直接对芯片的寄存器进行操作,当时作为初学者的我看着一脸懵逼,至于为什么这样修改,下面好好分析一下。  一

    2024年02月02日
    浏览(58)
  • 嵌入式开发之linux内核移植

    目录  前言 一、下载内核源码 1.1 下载linux-3.0.1 1.2 解压源码文件 二、 内核添加yaffs2文件系统支持 2.1 下载yaffs2 2.2 内核添加yaffs2文件补丁 三、配置开发板 3.1 修改机器ID 3.2 添加开发板初始化文件 3.3 配置NandFalsh 3.3.1 添加NandFlash设备 3.3.2 添加NandFlash驱动 3.3 修改Kconfig(支持

    2024年02月07日
    浏览(104)
  • Nodejs移植到嵌入式ARM板方法

    Nodejs移植到嵌入式ARM板有3种方法: 在上位机虚拟机软件上安装ARM的交叉编译链,下载nodejs源码,使用交叉编译软件编译nodejs,得到ARM板上可执行的文件,并放到ARM板上,通过node xxx.js文件的方式执行。注意还需要移植依赖库到ARM板上。该方式适合小型的nodejs程序,例如一个小

    2024年02月04日
    浏览(40)
  • 嵌入式Linux下LVGL的移植与配置

    ​​​​​​ https://github.com/lvgl/lvgl git下载方式 git clone https://github.com/lvgl/lvgl.git 链接:https://pan.baidu.com/s/1jyqIennsQpv-RB4RyKvZyg?pwd=c68e  提取码:c68e 注意: 以下的配置均基于个人移植的sdk上修改. 解压sdk源码后修改Makefile文件,修改如下 直接修改编译器(编译器需要添加进系统的

    2024年02月13日
    浏览(61)
  • 使用GUI Guider工具开发嵌入式GUI应用 (3) - 使用label组件

    本节讲述在GUI Guider中,应用各种UI的基本元素,并顺利部署到MCU的过程。在GUI Guider中使用各LVGL的组件时,将会涉及到GUI Guider的操作,以及将某些组件额外生成的源码添加到Keil工程中。至于具体产品中的UI应用,可以是这些基本UI元素的组合使用,以实现更加丰富的显示效果

    2024年02月12日
    浏览(55)
  • 使用GUI Guider工具开发嵌入式GUI应用(4)-使用image组件

    在没有使用LVGL和GUI Guider的时候,我想做一个电子相册的小应用,需要在MCU工程中集成一个小型的文件系统和图像解码组件,例如 fatfs (http://elm-chan.org/fsw/ff/00index_e.html)组件和 tjpgdec (http://elm-chan.org/fsw/tjpgd/00index.html)组件。使用GUI Guider显示图片就不需要这么麻烦,可以使

    2024年02月13日
    浏览(62)
  • 嵌入式Linux底层系统开发 +系统移植+内核文件系统(基础)

    搭建交叉编译开发环境 bootloader的选择和移植 kernel的配置、编译、移植和调试 根文件系统的制作 前两个要点通常芯片厂家提供。后边两个要点是公司的工作重点。 学习方法:先整体后局部,层层推进 如何编译—如何添加命令和功能—如何定义自己的开发板。 移植的基本步

    2024年02月03日
    浏览(71)
  • MQTT协议版本Mosquitto移植到嵌入式arm平台

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智

    2024年02月06日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包