本帖最后由 Alden 于 2024-10-24 16:01 编辑
#申请原创# #技术资源#@21小跑堂LVGL简述:
LVGL(Light and Versatile Graphics Library)是一个开源的图形用户界面(GUI)库,专为嵌入式系统设计。它具有轻量、灵活和高效的特点,适用于资源受限的设备,如微控制器和小型单板计算机。LVGL 支持多种显示驱动和输入设备,能够创建丰富的图形界面,支持动画、主题和各种控件,如按钮、滑块、图表等。 LVGL 的主要特点包括: - 轻量级:设计旨在节省内存和处理能力,适合嵌入式系统使用。
- 高效渲染:支持多种图形硬件加速,能够提供流畅的用户体验。
- 主题支持:允许用户自定义界面的外观,提供多种主题选项。
- 易于使用:提供丰富的文档和示例,便于开发者快速上手。
- 跨平台:支持多种开发环境和操作系统,可以在不同的硬件平台上运行。
LVGL 适用于各种应用,包括家电、工业设备、智能手表和其他嵌入式产品。由于其开源特性,开发者可以自由修改和分发,根据自己的需求进行定制。
APM32F407 EVAL板 APM32F407 EVAL Board 评估板,是高性能 APM32F4xx 系列 MCU 完整演示和开发平台,包括了一个底板和两个核心板,两个核心板分别使用 APM32F407ZGT6(LQFP144)及 APM32F407IGT6(LQFP176)作为核心主控,两款 MCU 芯片基于 Arm® Cortex®-M4 内核,工作主频 168MHz。同时配套有对应的 SDK,可帮助开发者评估 APM32F4xx 系列 MCU 芯片性能或相关开发应用程序。 APM32F407 EVAL Board 评估板的LCD触摸屏接口可以支持野火4.3寸电容屏,16位8080时序,分辨率800*480 可以直接网上购买使用,但需注意这款电容屏有变更驱动的版本,驱动配置需要修改,移植LVGL前需要保证使用SDK例程能正常使用。
APM32F407 EVAL Board 评估板配套的SDK《APM32F4xx_EVAL_SDK》可以在极海官网上下载:https://www.geehy.com/design/hardware_detail/31 使用APM32F4xx_EVAL_SDK_V1.0-LVGL\Examples\LCD\LCD_TOUCH例程,先测试屏幕和触摸能正常使用。烧录到开发板中看到界面如下,触摸屏幕有反应。
然后就可以开始移植了。
首先是下载LVGL的源码,在github上下载:https://github.com/lvgl/lvgl/releases
这里选用的是LVGL-8.40版本,解压后复制这些文件到工程目录下
然后删掉examples中多余的文件保留porting
然后将lv_conf_template.h和porting里面带template的都改下名字。
然后就能在工程中,将这些文件和路径全部添加进去
src路径里的文件和文件夹非常多,需要有耐心的全部添加。
添加完成后可以编译验证,成功的话会有警告但不会有报错。那就可以进行下一步了。
如果有报错那就是有文件加漏了。
然后如上图修改lv_conf.h lv_port_disp.h lv_port_indev.h
这三个文件中的启用相关定义
修改lvgl.h的相对路径,这看实际文件怎么放的。
然后lv_port_disp.c文件中添加屏幕驱动文件的路径,修改屏幕的实际分辨率
选择创建缓存的方式,要3选1
关联画点函数,调用原本屏驱函数中的就行
屏幕显示部分就完成了,接下来是触摸屏的。
lv_port_indev.c文件中要把lv_port_indev_init(void)中只保留触摸部分的,其他的都屏蔽掉。
SDK中在中断中会将触摸向前的状态坐标都返回到结构体中,我们只需调用相关变量就行了。
主要主要的移植工作就完成了,接下来还要为LVGL添加心跳时基,让LVGL根据这个时间来进行任务。
需要使用到一个定时器中断产生1ms的时基。主频我是超频到200Mhz使用所以TIM2的时钟是100Mhz。
所以分频是100,周期值是1000
void TIM_init()
{
TMR_BaseConfig_T TMR_BaseConfigStruct;
/* Enable TMR1 Periph Clock */
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR2);
/* Config TMR1 */
TMR_BaseConfigStruct.clockDivision = TMR_CLOCK_DIV_1;
TMR_BaseConfigStruct.countMode = TMR_COUNTER_MODE_UP;
TMR_BaseConfigStruct.division = 100-1;
TMR_BaseConfigStruct.period = 1000-1;
TMR_BaseConfigStruct.repetitionCounter = 0;
TMR_ConfigTimeBase(TMR2, &TMR_BaseConfigStruct);
/* Enable TMR1 Interrupt */
TMR_EnableInterrupt(TMR2, TMR_INT_UPDATE);
NVIC_EnableIRQRequest(TMR2_IRQn, 0, 0);
TMR_Enable(TMR2);
}
在刚复制过来的demos文件夹中是有几个官方的例程可以测试效果我们只用将文件加入工程,开启使能和初始化后就能使用了。
具体可以看demos里的REMADE.md来操作。
然后就可以进行demo的测试了
LVGL的初始化只需要在原本屏幕初始化后添加LVGL的初始化就行了
lv_init(); // LVGL 初始化
lv_port_disp_init(); // 注册LVGL的显示任务
lv_port_indev_init(); // 注册LVGL的触屏检测任务
int main(void)
{
/** Horizontal */
lcdWidth = LCD_SIDE_LONG;
lcdHight = LCD_SIDE_SHORT;
/** Set system interrupt priority grouping */
NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_1);
/** Init delay function */
Delay_Init();
/** Init LED */
APM_EVAL_LEDInit(LED1);
APM_EVAL_LEDInit(LED2);
APM_EVAL_LEDInit(LED3);
TIM_init();
/** Init USART */
USART1_Init(115200);
/** Init LCD*/
LCD_GPIO_Init();
LCD_SMC_Init();
LCD_Reset();
LCD_ConfigRegister();
LCD_EnableBackLight();
LCD_ConfigScan(LCD_SCAN_MODE_3);
LCD_ClearScreen();
/** Display default UI*/
// Touch_DisplayInitUI();
/** Touch board init*/
TouchBoard_Init();
lv_init(); // LVGL 初始化
lv_port_disp_init(); // 注册LVGL的显示任务
lv_port_indev_init(); // 注册LVGL的触屏检测任务
/**
* The data of the ouch chip will be processed in
* the interrupt callback function TouchBoard_Process()
*/
lv_demo_widgets();
//lv_demo_benchmark_set_max_speed(true);
// lv_demo_benchmark();
// lv_demo_keypad_encoder();
while(1)
{
// Touch_EventHandle();
lv_task_handler();
}
}
lv_demo_widgets();的效果:
lv_demo_benchmark();是基准测试,能够测试全屏刷新的帧率
由于代码没怎么优化接口,也没用DMA,目前这个屏幕分辨率太高,所以刷新速度会比较慢。
有兴趣的可以再优化看看。
源码放在下面,平台附件大小限制需要改下名字再解压
APM32F4xx_EVAL_SDK_V1.0-LVGL1.zip
(10 MB)
APM32F4xx_EVAL_SDK_V1.0-LVGL2.zip
(10 MB)
APM32F4xx_EVAL_SDK_V1.0-LVGL3.zip
(10 MB)
APM32F4xx_EVAL_SDK_V1.0-LVGL4.zip
(10 MB)
APM32F4xx_EVAL_SDK_V1.0-LVGL5.zip
(2.75 MB)
|