【兆易GD32H759I-EVAL】AWTK 移植
[复制链接]
本帖最后由 TL-LED 于 2024-6-17 10:01 编辑
学习移植AWTK到开发板。
一、AWTK
1.1、介绍
AWTK全称为Toolkit AnyWhere,是ZLG倾心打造的一套基于C语言开发的GUI框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的GUI引擎,支持跨平台同步开发,一次编程,到处编译,跨平台使用。
1.2、官网
官网地址:https://www.zlg.cn/index/pub/awtk.html
1.3、AWTK资源
二、移植
2.1、下载AWTK源码
下载地址:
2.2、项目中添加源码
移植需要一个可以驱动LCD屏幕的项目工程,我使用之前帖子驱动LCD屏幕的工程。
2.2.1、复制源码文件到工程
将AWTK源码复制项目midwares文件夹下
2.2.2、添加文件到项目工程
添加文件到项目工程,这部分比较费时间,可以参考官网的例程,官网有移植好的项目工程源代码
例程是将源代码添加到一个文件夹下,我是分类添加,其实是一样的,根据个人的习惯。
awtk-port文件,这个文件可以到官网移植好的项目工程中复制,驱动移植主要是在这里修改。
2.2.3、添加头文件路径
3.2.4、设置
添加HAS_AWTK_CONFIG和--gnu
去掉Use MicroLIB
三、修改代码
3.1、main_loop_gd32_raw.c
这里修改LCD驱动。
//main_loop_gd32_raw.c
#include "main.h"
#include "base/g2d.h"
#include "base/idle.h"
#include "base/timer.h"
#include "main_loop/main_loop_simple.h"
#include "lcd/lcd_mem_bgr565.h"
#include "lcd/lcd_mem_bgra8888.h"
extern uint8_t *online_fb_addr;
extern uint8_t *offline_fb_addr;
uint8_t platform_disaptch_input(main_loop_t* loop) {
int x = 0;
int y = 0;
static int prev_key = 0;
//待修改
return 0;
}
lcd_t* platform_create_lcd(wh_t w, wh_t h) {
return lcd_mem_bgr565_create_double_fb(w, h, online_fb_addr, offline_fb_addr);
}
#include "main_loop/main_loop_raw.inc"
LCD驱动方式详细的介绍可以参考官网的教程
有多种驱动方式,我这里使用双Framebuffer方式
3.2、platform.c
这里根据硬件的存储器来修改MEM。修改1ms的delay_1ms()函数。
#include "main.h"
#include "tkc/mem.h"
#include "base/timer.h"
#include "tkc/platform.h"
#include "platforms/common/sys_tick_common.inc"
uint64_t get_time_ms64() {
return tk_sys_tick_get_tick64();
}
void sleep_ms(uint32_t ms) {
delay_1ms(ms);
}
#define MEM2_ADDR (uint8_t*)0XC0000000 + 5 * 1024 * 1024
#define MEM2_MAX_SIZE 8 * 1024 * 1024
ret_t platform_prepare(void) {
tk_mem_init(MEM2_ADDR, MEM2_MAX_SIZE);
return RET_OK;
}
3.3、gd32h7xx_it.c
增加tk_sys_tick_inc(1)函数
#include "gd32h7xx_it.h"
#include "systick.h"
#include "FreeRTOS.h"
#include "task.h"
extern void tk_sys_tick_inc(uint32_t tick_period);
/*!
\brief this function handles SysTick exception
\param[in] none
\param[out] none
\retval none
*/
void SysTick_Handler(void)
{
delay_decrement();
tk_sys_tick_inc(1);
}
3.4、main.c
#include "main.h"
#include "FreeRTOS.h"
#include "base/g2d.h"
#include "tkc/mem.h"
#include "base/lcd.h"
#include "lcd/lcd_mem_bgr565.h"
#define FB_ADDR (uint8_t*)0XC0000000
uint8_t *online_fb_addr = (uint8_t *)(FB_ADDR);
uint8_t *offline_fb_addr = (uint8_t *)(FB_ADDR + (480 * 272 * 2));
static uint8_t* s_framebuffers[2];
void cache_enable(void);
extern int gui_app_start(int lcd_w, int lcd_h);
int main(void)
{
cache_enable();
systick_config();
init_usart(115200);
gd_eval_lcd_init();
return gui_app_start(480, 272);
}
void cache_enable(void)
{
/* enable i-cache */
SCB_EnableICache();
/* enable d-cache */
SCB_EnableDCache();
}
3.5、main.h
#ifndef __MAIN_H__
#define __MAIN_H__
#include "gd32h7xx.h"
#include "gd32h759i_eval.h"
#include "systick.h"
#include <stdio.h>
#include "stdlib.h"
#include "FreeRTOS.h"
#include "task.h"
#include "fun_task.h"
#include "led/led.h"
#include "usart/usart.h"
#include "gd32h759i_lcd_eval.h"
typedef signed char i8;
typedef signed short i16;
typedef signed int i32;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long long u64;
#endif
四、创建测试界面
4.1、下载AWTK Designer软件
需要官网注册领取激活码,后面安装软件使用时需要使用,这部分参考官网教程。
4.2、创建GUI项目工程
4.3、在项目添加组件
放置一些测组件
4.4、打包文件
点击上界面的打包选项,生成项目文件
将这些文件复制到项目工程文件下面,并添加到项目
添加前需要修改生成文件中的main.c->win_main.c,项目中有main.c这里要重新命名。
五、测试
编译项目后,下载程序到开发板,运行如下:
|