[活动] 【极海G32A1465测评】5、移植LVGL

[复制链接]
1540|4
 楼主| sujingliang 发表于 2024-12-18 19:41 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2024-12-18 19:50 编辑

记录一下用G32A1465移植LVGL的过程。

G32A1465的SRAM为128KB,地址被分成了2部分:
31.png

每部分大约60多kb,从资源上看可以运行下LVGL。注意要勾选IRAM2。

1、复制LVGL必要文件到Middlewares中

从硬盘找到不知道从什么地方下载的LVGL,将下面几个文件和目录拷贝到SDK下的Middlewares中。
32.png

2、将原文件和头文件加入工程
按照目录名建立如下工程文件夹,将对应目录及子目录下的*.c文件全部都加进来,
这一步工作量很大。

33.png
头文件也加上
34.png

3、lv_port_disp_templ.c
位于:Middlewares/lvgl/examples/porting

加入LCD初始化函数:
  1. static void disp_init(void)
  2. {
  3.     /*You code here*/
  4.         LCD_Init();
  5. }
配置2个缓存:
  1. void lv_port_disp_init(void)
  2. {
  3. static lv_disp_draw_buf_t draw_buf_dsc_2;
  4.     static lv_color_t buf_2_1[MY_DISP_HOR_RES * 32];                        /*A buffer for 10 rows*/
  5.     static lv_color_t buf_2_2[MY_DISP_HOR_RES * 32];                        /*An other buffer for 10 rows*/
  6.     lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 32);   /*Initialize the display buffer*/
  7. /*Set a display buffer*/
  8.     disp_drv.draw_buf = &draw_buf_dsc_2;
disp_flush调用区域填充函数:
  1. static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
  2. {
  3.         uint16_t *p=(uint16_t*)color_p;
  4.         uint16_t c=*p;
  5.     if(disp_flush_enabled) {
  6.                         LCD_Fill1(area->x1,area->y1,area->x2,area->y2,(uint16_t*)color_p);
  7.     }
  8.     lv_disp_flush_ready(disp_drv);
  9. }
区域填充函数
  1. void LCD_Fill1(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t* color)
  2. {         
  3.         uint32_t i,j;                        
  4.         uint16_t width=ex-sx+1;                 //得到填充的宽度
  5.         uint16_t height=ey-sy+1;                //高度
  6.         
  7.         int32_t num= (width) * (height) * 2;
  8.         LCD_SetWindows(sx,sy,ex,ey);//设置显示窗口
  9.         LCD_CS_CLR;
  10.         LCD_RS_SET;
  11.         SPI_WriteByte((uint8_t*)color,num);
  12.         }
SPI连续写数据函数:
  1. void SPI_WriteByte(uint8_t *spiTxBuf,uint16_t len)
  2. {
  3.         LPSPI_MasterTransferBlocking(LPSPI_1, spiTxBuf, NULL, len, SPI_TIMEOUT);
  4. }



4、配置一个定时器
timer config:
  1. LPITMR_USER_CHANNEL_CONFIG_T g_lpitmrChannelConfig =
  2. {
  3.     .timerMode = LPITMR_PERIODIC_COUNTER,
  4.     .periodUnits = LPIT_PERIOD_UNITS_MICROSECONDS,
  5.     .period = 799U,
  6.     .triggerSrc = LPITMR_TRIG_SRC_INTERNAL,
  7.     .triggerSelect = 0U,
  8.     .reloadOnTriggerEn = true,
  9.     .stopOnInterruptEn = true,
  10.     .startOnTriggerEn = true,
  11.     .channelChainEn = false,
  12.   
初始化定时器,
  1. void LPITMR_Initialize(void)
  2. {
  3.     LPITMR_DeInit(LPITMR_INSTANCE);
  4.     LPITMR_Init(LPITMR_INSTANCE, &g_lpitmrConfig);
  5.     LPITMR_ChannelInit(LPITMR_INSTANCE, LPITMR_CHANNEL1, &g_lpitmrChannelConfig);

  6.     LPITMR_StartTimerChannels(LPITMR_INSTANCE, LPITMR_CHANNEL1);

  7.     INT_SYS_InstallHandler(LPITMR_Ch1_IRQn, LPITMR_Irq, NULL);
  8.     INT_SYS_EnableIRQ(LPITMR_Ch1_IRQn);
  9. }
定时器中断处理,调用lv_tick_inc(1);
  1. void LPITMR_Irq(void)
  2. {
  3.     if(LPITMR_ReadInterruptFlagTimerChannels(LPITMR_INSTANCE, LPITMR_CHANNEL1_MASK))
  4.     {
  5.         /* Clear LPITMR channel1 interrupt flagure */
  6.         LPITMR_ClearInterruptFlagTimerChannels(LPITMR_INSTANCE, LPITMR_CHANNEL1_MASK);
  7. lv_tick_inc(1);
  8.     }
  9. }
5、main文件
#include "lv_conf.h"
#include "lvgl.h"
#include "lv_port_disp_template.h"
  1. lv_init();
  2. lv_port_disp_init();
  3. LPITMR_Initialize();        //定时器初始化
  4. lv_demo_widgets();   //调用demo

6、lv_conf.h

#define LV_COLOR_16_SWAP 1
为了适应LCD的配置,使能颜色交换

#define LV_MEM_SIZE (40U * 1024U)
LV_MEM_SIZE 配置大一点,widgets DEMO至少需要38KB


#define LV_MEM_ADR 0x1FFF1000
配置lv_mem地址从0x1FFF1000,这是LV管理内存的起始地址。
选这个地址是因为IRAM2起始0x1FFF0000,空出前面一部分给系统,所以选了0x1FFF1000,这样后面大约还有50多KB。
内存分配可以参见sct文件:
35.png

#define LV_BUILD_EXAMPLES 1
使能DEMO

#define LV_USE_DEMO_WIDGETS 1
运行WIDGETS demo

7、实验效果
2.jpg
tutieshi_480x270_5s (2).gif


风之呢喃 发表于 2024-12-19 09:51 | 显示全部楼层
LVGL需要占用多大的内存空间
lemonhub 发表于 2025-1-19 14:50 | 显示全部楼层
能不能提供一些参考代码
闪烁黎明 发表于 2025-1-21 09:14 | 显示全部楼层
必须要勾选IRAM2才行吗
 楼主| sujingliang 发表于 2025-1-21 13:01 | 显示全部楼层
闪烁黎明 发表于 2025-1-21 09:14
必须要勾选IRAM2才行吗

主要是开始只用IRAM1,编译的时候不通过。然后就想用IRAM2,顺便就勾上了,不勾不知道行不行,没试过
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

147

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部