HAL库移植LVGL到STM32F429用外置SDRAM+DMA2D显示(不带触摸)

   

目录

一、STM32Cubemx工程配置

  1、时钟配置为外部高速时钟。(先这样设置当开启LTDC+SDRAM还有DMA2D后会有变化直接自动生成就行)​编辑

2、配置下载端口,本章采用SWD做为下载端口。

3、SDRAM配置。(这里用的芯片是W9825G6KH-6,这些参数请根据你自己开发板接线和芯片参数配置)

4、配置LTDC+DMA2D。(这里请根据你自己屏幕的数据手册配置参数,这里可以看到时钟已经报错了,但不着急)

4、开启定时器TIM6。(方便给LVGL心跳)

5、生成文件。

二、移植LVGL。

1、github下载并裁剪

2、移植LVGL到KEIL(如果是网盘下的直接来到这一步裁剪不用看)

1、把你的lcd的驱动文件添加进来并先配置SDRAM。(不懂的可用去了解一下HAL库使用外部SDRAM),随后测试屏幕是否能被驱动。

2、移植LVGL

3、修改显示文件

4、修改配置文件lv_conf.h

5、测试lvgl

三、为LVGL添加心跳

四、工程文件 


序言

    本章采用STM32F429BIT6芯片,屏幕RGBLCD7寸分辨率为1024*600(带触摸不过本章并未使用),买回来专门学习LVGL。(第一次写这个不喜勿喷,有任何可用改进或者有问题的地方欢迎指正。)

一、STM32Cubemx工程配置

  1、时钟配置为外部高速时钟。(先这样设置当开启LTDC+SDRAM还有DMA2D后会有变化直接自动生成就行)

2、配置下载端口,本章采用SWD做为下载端口。

3、SDRAM配置。(这里用的芯片是W9825G6KH-6,这些参数请根据你自己开发板接线和芯片参数配置)

4、配置LTDC+DMA2D。(这里请根据你自己屏幕的数据手册配置参数,这里可以看到时钟已经报错了,但不着急)

根据你屏幕的接线配置其引脚。

配置屏幕背光

配置DMA2D

现在就可用去调整时钟了。

4、开启定时器TIM6。(方便给LVGL心跳)

主频为180MHZ,定时1ms所以是180-1和1000-1。一定要使能自动重装载。

5、生成文件。

图中圈出来的非常重要,不改的话即使你lvgl配置全都正确都会花屏。

二、移植LVGL。

本章采用LVGL8.3V版本。有两种下载方式:1、github下载。2、网盘链接

 github下载地址:GitHub - lvgl/lvgl at release/v8.3

网盘下载地址:(云盘文件是裁剪过的后续就只在GitHub下载里讲裁剪)

百度网盘链接:https://pan.baidu.com/s/1EamqtLo4nGAOhsh5eNvonA?pwd=1127 提取码:1127

1、github下载并裁剪

     去官网得到文件保留这几个文件并把lv_conf_template.h改为lv_conf.h,裁剪完成如下第二幅图。lv_conf.h是lvgl的重要文件

     裁剪并更改examples文件,只保留porting文件其他全都不要

如图所示:

修改porting文件内名称,把所有_template全部删掉。

至此文件就裁剪完了。

2、移植LVGL到KEIL(如果是网盘下的直接来到这一步裁剪不用看)

1、把你的lcd的驱动文件添加进来并先配置SDRAM。(不懂的可用去了解一下HAL库使用外部SDRAM),随后测试屏幕是否能被驱动。

SDRAM配置,要根据你的芯片来

//给sdram提供时钟
	FMC_SDRAM_CommandTypeDef COmmand;
	COmmand.CommandMode=FMC_SDRAM_CMD_CLK_ENABLE;
	COmmand.CommandTarget=FMC_SDRAM_CMD_TARGET_BANK1;
	COmmand.AutoRefreshNumber=1;
	COmmand.ModeRegisterDefinition=0;
  HAL_SDRAM_SendCommand(&hsdram1,&COmmand ,0XFFFF);
	//至少200us延迟
	HAL_Delay(1);
	//对SDRAM进行预充电
	COmmand.CommandMode=FMC_SDRAM_CMD_PALL ;
	COmmand.CommandTarget=FMC_SDRAM_CMD_TARGET_BANK1;
	COmmand.AutoRefreshNumber=1;
	COmmand.ModeRegisterDefinition=0;
  HAL_SDRAM_SendCommand(&hsdram1,&COmmand ,0xFFFF);
	//插入8个自动刷新周期
		COmmand.CommandMode=FMC_SDRAM_CMD_AUTOREFRESH_MODE;
	COmmand.CommandTarget=FMC_SDRAM_CMD_TARGET_BANK1;
	COmmand.AutoRefreshNumber=8;
	COmmand.ModeRegisterDefinition=0;
  HAL_SDRAM_SendCommand(&hsdram1,&COmmand ,0xFFFF);
	//配置编程SDRAM加载模式寄存
		COmmand.CommandMode=FMC_SDRAM_CMD_LOAD_MODE;
	COmmand.CommandTarget=FMC_SDRAM_CMD_TARGET_BANK1;
	COmmand.AutoRefreshNumber=1;
	COmmand.ModeRegisterDefinition=0x230;
  HAL_SDRAM_SendCommand(&hsdram1,&COmmand ,0xFFFF);
	//配置自动刷新周期 
	 HAL_SDRAM_ProgramRefreshRate(&hsdram1,683);
	

屏幕测试成功点亮

2、移植LVGL

把裁剪好的文件移植到工程文件

在keil中创建文件夹LVGL_src添加lvgl文件夹下所有.c文件包括子文件夹(数量用点多这里就不演示了)在LVGL_porting添加输入输出.c文件。(这里不添加.h,因为可用直接跳转,不想用跳转就加.h)

在LVGL中存放lvgl.h和lv_conf.h文件,然后添加头文件目录,最后编译查看是否报错,如果有报错首先先确定魔法棒里是否打勾 C99检查头文件路径 是否添加完成检查src里.c文件是否全部添加

编译没报错

3、修改显示文件

修改显示.c/h文件lv_port_disp.c和lv_port_disp.h

将里面的#if 0改为#if 1,俩文件里面都要改,将原本的#include "lv_port_disp_template.h"改为lv_port_disp.h,并修改你屏幕尺寸,添加屏幕驱动头文件

这里在第一行#if 0改为#if 1,在22行要把"lvgl/lvgl.h"改为"lvgl.h"

修改显示模式,把多的注释掉,本次采用双缓冲模式,可根据你自身情况考虑。其中0xC0000000是根据SDRAM来的要填写你自己的

    static lv_disp_draw_buf_t draw_buf_dsc_1;
    static lv_color_t buf_1[MY_DISP_HOR_RES * 400]  __attribute__((at(0xC0000000+1024*600*2)));                          /*A buffer for 10 rows*/
    lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, 1024* 600); //这里要改成屏幕大小  /*Initialize the display buffer*/

    /* Example for 2) */
    static lv_disp_draw_buf_t draw_buf_dsc_2;
    static lv_color_t buf_2_1[MY_DISP_HOR_RES * 400]__attribute__((at(0xC0000000+1024*600*2)));                           /*A buffer for 10 rows*/
    static lv_color_t buf_2_2[MY_DISP_HOR_RES * 400]__attribute__((at(0xC0000000+1024*600*4))); //因为上一个数组已经占了                         /*An other buffer for 10 rows*/
    lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, 1024* 600); //这里要改成屏幕大小  /*Initialize the display buffer*/

    /* Example for 3) also set disp_drv.full_refresh = 1 below*/
    static lv_disp_draw_buf_t draw_buf_dsc_3;
    static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES]__attribute__((at(0xC0000000+1024*600*2)));            /*A screen sized buffer*/
    static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES]__attribute__((at(0xC0000000+1024*600*4)));            /*Another screen sized buffer*/
    lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2,
                          1024* 600); //这里要改成屏幕大小、

采用哪种方式就把数字改几。

修改disp_flush()函数,添加你自己的填充DMA2D图片函数

4、修改配置文件lv_conf.h

这里配置阻塞模式的STM32的DMA2D,(如果lvgl开启DMA2D其画图必须为DMA2D),并添加宏定义STM32F4,(注意要用英文逗号隔开),这里代码优化别用Level3,屏幕会出现错误。

5、测试lvgl

添加头文件

#include "lvgl.h"                // 它为整个LVGL提供了更完整的头文件引用
#include "lv_port_disp.h"        // LVGL的显示支持

//初始化文件
//Lcd_init(); 我这里没有用这个直接生成的你有就要加上
lv_init();
lv_port_disp_init(); 

添加初始代码

	HAL_GPIO_WritePin(LTDC_BLK_GPIO_Port,LTDC_BLK_Pin,GPIO_PIN_SET);//打开背光
//  Dma2d_Fill(0,0,1024,600,RED);//填充屏幕测试
	lv_init();
	lv_port_disp_init();
    lv_obj_t *myBtn = lv_btn_create(lv_scr_act());                               // 创建按钮; 父对象:当前活动屏幕
    lv_obj_set_pos(myBtn, 10, 10);                                               // 设置坐标
    lv_obj_set_size(myBtn, 120, 50);                                             // 设置大小
   
    // 按钮上的文本
    lv_obj_t *label_btn = lv_label_create(myBtn);                                // 创建文本标签,父对象:上面的btn按钮
    lv_obj_align(label_btn, LV_ALIGN_CENTER, 0, 0);                              // 对齐于:父对象
    lv_label_set_text(label_btn, "button");                                        // 设置标签的文本
 
    // 独立的标签
    lv_obj_t *myLabel = lv_label_create(lv_scr_act());                           // 创建文本标签; 父对象:当前活动屏幕
    lv_label_set_text(myLabel, "Hello world!");                                  // 设置标签的文本
    lv_obj_align(myLabel, LV_ALIGN_CENTER, 0, 0);                                // 对齐于:父对象
    lv_obj_align_to(myBtn, myLabel, LV_ALIGN_OUT_TOP_MID, 0, 100);               // 对齐于:某对象

成功显示

三、为LVGL添加心跳

     启动TIM6定时器,添加到lvgl初始化下面。

HAL_TIM_Base_Start_IT(&htim6); //启动定时器
int a=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){

 lv_tick_inc(1);
 //不清楚是否正常可用加一个led

	a++;
	if(a>500)
	{
	a=0;
	HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
	}
}

四、工程文件 

网盘链接:链接:https://pan.baidu.com/s/1QiiNZnKfkr-JecdqgCENcA?pwd=1127 提取码:1127

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值