LVGL移植到AT403

本文探讨了在资源受限的嵌入式系统中,如何优化GUI性能并整合RTOS,通过DMA加速数据传输,利用双缓冲提升刷新效率,以及在TFT18位模式下动态内存管理的实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考虑到GUI一般比较吃内存,使用403,本芯片可以配置开启最大224KB SRAM。

和其它开源软件类似,移植源码,移植接口,加几个头文件基本上就OK了。

这个GUI最简单的是只要移植刷位图就可以。

代码可以优化不少,直接使用DMA可以快速的发送一些列连续的数据。测试SPI 50M处理480x320.

效果还行。

加入RTOS后刷屏可以加入信号量,使用中断唤醒刷新任务,高效率实现刷屏。

配置刷多少行。如果内存够直接开两个显存,效果最完美,内存不大不小,可以适当配置。

内存耗费:60*320*2*2 = 75K(显示缓冲区) 64KB动态内存池。

由于我使用的是TFT是18位模式,所以开辟了一个大内存作为动态内存分配池。

实际使用可以适当减小。设置行数也是一样。

调用LVGL最基础的调用 lv_init();

	// 定义风格
	static lv_style_t lv_style_list;
	//LV_SYMBOL_HOME
	lv_style_init(&lv_style_list);
	
	// 声明引用外部目标函数
	extern lv_font_t myFont;
	// 给style重新定向字体
    lv_style_set_text_font(&lv_style_list, LV_STATE_DEFAULT, &myFont);
	// 定时空间
	lv_obj_t * bar1 = lv_bar_create(lv_scr_act(), NULL);
	lv_obj_set_size(bar1, 200, 20);
	lv_obj_align(bar1, NULL, LV_ALIGN_CENTER, 0, 0);
	lv_bar_set_anim_time(bar1, 1000);
	lv_bar_set_value(bar1, 50, LV_ANIM_ON);
	// 创建标签空间
	label = lv_label_create(lv_scr_act(), NULL);
	// 装载新的style 给标签。
	lv_obj_add_style(label, LV_OBJ_PART_MAIN, &lv_style_list);

 

 

### 移植 LVGL 图形库到 AT32F403A 微控制器 #### 1. 配置硬件环境 为了成功移植 LVGLAT32F403A,首先需要确保硬件外设的正确配置。类似于 STM32 的 RCC 外部高速晶振 (HSE) 设置,在 AT32F403A 上也需要启用高精度时钟源来支持稳定的系统运行[^2]。 ```c // 启用 HSE 并设置为主时钟源 RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; // 使用 HSE 作为主时钟 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); ``` #### 2. 初始化显示驱动 LVGL 要求底层提供一个帧缓冲区以及相应的刷新机制。对于 AT32F403A,可以通过 SPI 或 I2C 接口连接显示屏模块,并实现 `lv_disp_flush` 和 `lv_indev_read` 函数以适配具体的硬件接口[^1]。 ```c void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { uint16_t x_start = area->x1; uint16_t y_start = area->y1; uint16_t w = (area->x2 - area->x1 + 1); uint16_t h = (area->y2 - area->y1 + 1); lcd_set_address(x_start, y_start, x_start + w - 1, y_start + h - 1); // 自定义 LCD 地址设置函数 lcd_write_data(color_p, w * h * sizeof(lv_color_t)); // 自定义数据写入函数 lv_disp_flush_ready(disp); } ``` #### 3. 创建并修改配置文件 将 LVGL 提供的模板头文件复制至项目目录中,并重命名为 `lv_conf.h`。此步骤与 STM32 开发流程一致[^3]: ```bash cp lvgl/lv_conf_template.h ./lv_conf.h ``` 编辑该文件以调整图形库的行为参数,例如屏幕分辨率、颜色深度等选项。 #### 4. 主循环初始化 最后一步是在主程序中启动 LVGL 的任务调度器。这通常涉及调用 `lv_task_handler()` 来处理 GUI 更新逻辑。 ```c int main(void) { HAL_Init(); SystemClock_Config(); // 显示屏和触摸屏初始化代码... lv_init(); // 初始化 LVGL 库 lv_disp_drv_register(&disp_drv); // 注册显示器驱动 lv_indev_drv_register(&indev_drv); // 注册输入设备驱动 while (1) { lv_task_handler(); // 执行 LVGL 任务处理器 HAL_Delay(5); // 延迟时间可根据具体需求调整 } } ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值