STM32移植 freeRTos+LVGL

本文详细介绍了如何在STM32平台上配置FreeRTOS时钟,选择外部晶振,以及如何移植LVGL库,包括添加源码、配置文件修改、FREERTOS钩子函数的使用和任务创建。特别提到,对于不带触屏的显示屏,只需关注核心步骤即可。

先配置freeRTOS

配置时钟   选用外部晶振

这里选用其他定时器,至于为什么我也不是很懂,好像说是跟稳定

 

 

配置FREERTOS

其他配置看着办

移植LVGL

先去gitee下载源码

        选择一个版本

开始移植


1、添加lvgl源码到工程文件中
把lvgl-8.0.2\src文件夹直接复制到新建的GUI文件夹里,这个src里面就是源码

把lvgl-8.0.2\examples\porting文件夹复制到新建的GUI文件夹里,这是移植用的接口

把lvgl-8.0.2目录下的lvgl.h、lv_conf_template.h、LICENCE.txt、README.md一共4个文件复制到新建的GUI文件夹里,后面两个可以不用,不影响移植。

搬运好了代码,我们得给文件改个名字,不然文件内部包含的头文件名字不一致把touch\lvgl目录下的lv_conf_template.h文件名字改成lv_conf.h

porting目录下所有文件名字的**_template**删了,改完之后的样子

2、在keil中添加.c文件和包含文件目录。
把GUI\src路径下的所有.c文件都添加到GUISRC分组,你没有听错,是所有.c文件,包括所有子目录,可以结合Ctrl+A快捷键全选之后再点击添加,提高效率。(这里添加的时候很容易出错,一定要细心)
把GUI\porting路径下的所有.c文件都添加到GUIPORTING分组
包含文件目录,这里补充一下前面添加定时器时忘记包含文件目录了,这里补上。

然后给lvgl心跳,这里要用到FREERTOS的钩子函数

用FREERTOS的configUSE_TICK_HOOK 给lvgl一个心跳,告诉lvgl过了一毫秒

void vApplicationTickHook(void)
{
   lv_tick_inc(1);
}

lv_port_disp.c、lv_port_disp.h、lv_port_indev.c、lv_port_indev.h四个文件的#if 0 都改成#if 1 ,这四个文件包含的头文件名字还需修改,具体看下图。这四个文件中的两个.h文件中,路径为#include "lvgl/lvgl.h"改成#include “lvgl.h”。

随带在lv_port_disp.h文件下添加初始化函数:void lv_port_disp_init(void);

随带在lv_port_indev.h文件下添加初始化函数:void lv_port_indev_init(void);

在lv_conf.h中定义好屏幕的水平像素和垂直像素大小,顺手把LV_COLOR_DEPTH 改成自己TFT的对应多少位的颜色(根据实际情况改,如果屏幕是32位色就不用改)并定义显示屏尺寸

修改LVGL显示底层接口,把你的打点函数丢进去。

把lv_port_disp.c的里面的example 2 和3都注释了,只留example1,点击编译,编译通过,警告不用管,大多是因为定义了函数但是没有使用而报警告,不影响。

然后主函数中

创建lvgl事务处理任务,最后上个互斥锁之类的,我这直接当临界区,效果应该一样的,反正我跑起来了。

 创建一个显示页面任务。

 

创建任务

OK差不多了。可以跑起来了。

另外,我的是不带触屏的显示屏,触屏功能就没加进来。想要的朋友可以参考

STM32移植LVGL(LittleVGL)-CSDN博客

<think>嗯,用户正在寻找基于STM32FreeRTOSLVGL驱动ST7789的电子宠物项目的源代码。首先,我需要回想一下相关的开源项目或者社区资源是否有这样的例子。记得GitHub、GitLab这样的平台可能会有类似的项目,但具体是否有完整的Tamagotchi项目呢?可能需要分解问题来看。 用户提到的技术栈是STM32FreeRTOSLVGL和ST7789,这些都是嵌入式开发中常用的组件。首先,我应该考虑如何将这些组件结合起来。比如,ST7789是显示屏的驱动,需要LVGL来渲染界面,而FreeRTOS负责任务调度,STM32作为主控。电子宠物的逻辑需要状态管理、用户输入处理、动画更新等。 接下来,用户可能需要一些示例代码或者项目结构作为参考。比如,是否有STM32LVGL移植示例?通常,LVGL官方仓库会有针对不同硬件的移植代码,包括STM32和ST7789的组合。另外,FreeRTOS的集成需要注意任务优先级、堆栈分配,避免内存不足,尤其是在同时处理LVGL和串口任务时,引用[2]中提到内存分配问题,可能导致串口出错,所以需要确保系统堆足够大。 另外,用户可能需要电子宠物的逻辑实现,比如状态机、动画处理、触摸或按钮输入。这部分可能需要自己编写,但可以参考已有的状态机设计模式。比如,宠物有不同的状态:饥饿、快乐、睡眠等,每个状态对应不同的动画和交互。 关于源代码,直接提供可能涉及版权问题,所以应该引导用户到合法的资源库,或者指导如何搭建项目框架。例如,先移植LVGL和ST7789驱动,再创建FreeRTOS任务处理LVGL刷新和用户输入,最后实现宠物逻辑。 用户可能遇到的挑战包括显示驱动的适配、LVGLFreeRTOS的集成、内存管理优化等。引用[3]提到使用Tick Hook给LVGL提供心跳,这可能需要在FreeRTOS配置中启用相关钩子函数,并正确设置时间基准。 需要提醒用户检查FreeRTOS的堆配置,如引用[2]中的例子,确保分配足够内存给任务和LVGL。同时,ST7789的初始化代码是否正确,SPI或并口的配置是否匹配硬件连接。 总结下来,回答应分步骤指导用户如何构建项目,提供关键代码片段,如FreeRTOS任务创建、LVGL初始化和ST7789驱动,并建议参考现有移植示例和开源项目。此外,强调调试过程中注意内存和任务优先级的问题,可能引用之前的经验如内存不足导致串口故障的情况。</think>根据您对STM32+FreeRTOS+LVGL驱动ST7789的电子宠物项目的需求,以下是分步实现方案: ### 一、硬件层配置 1. **ST7789驱动** ```c // 使用HAL库实现SPI通信 void ST7789_WriteCommand(uint8_t cmd) { HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY); } void ST7789_WriteData(uint8_t *buff, size_t buff_size) { HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_SET); HAL_SPI_Transmit(&hspi1, buff, buff_size, HAL_MAX_DELAY); } ``` ### 二、操作系统集成 2. **FreeRTOS任务配置** ```c #define LVGL_TASK_STACK 2048 #define GUI_TASK_PRIORITY (tskIDLE_PRIORITY + 2) void vTaskGUI(void *pvParameters) { lv_init(); st7789_init(); // 显示屏初始化 while(1) { lv_task_handler(); vTaskDelay(pdMS_TO_TICKS(5)); } } ``` ### 三、LVGL图形界面 3. **电子宠物动画实现** ```c lv_obj_t *pet_img = lv_img_create(lv_scr_act()); lv_img_set_src(pet_img, &idle_anim_01); // 引用动画帧序列 // 使用定时器更新动画 lv_anim_t a; lv_anim_init(&a); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_img_set_angle); lv_anim_set_values(&a, 0, 3600); lv_anim_set_time(&a, 2000); lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); lv_anim_start(&a); ``` ### 四、系统优化关键点 - 内存配置需满足: ```c // FreeRTOSConfig.h #define configTOTAL_HEAP_SIZE ((size_t)(30*1024)) // 至少30KB[^2] ``` - 使用Tick Hook提供时间基准: ```c void vApplicationTickHook(void) { lv_tick_inc(1); // 确保1ms精度[^3] } ``` ### 五、开源项目参考 推荐以下资源作为开发基础: 1. ST官方STM32Cube_FW_F1项目中的SPI示例 2. LVGL官方demo:https://github.com/lvgl/lv_port_stm32f103_disco 3. ST7789驱动参考:https://github.com/ananevilya/Arduino-ST7789-Library
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值