1、本次驱动的LCD为ILI9488使用板载的spi驱动,触摸屏为ADS7843使用spi3来驱动,选取的IO分别为如下:
开发板 LCD
SPI1-MOSI(PA7) SDI
SPI1-SCK(PA5) SCK
TFT_CS(PD14) CS
TFT_RST(PD15) RST
TFT_DC(PF12) DC
VDD BL(目前不使用调光,直接接高电平)
SPI3-SCK(PC10) TCLK
PC8 TCS
SPI3-MISO(PC11) TDO
SPI3-MOSIP(C12) TDI
PC9 TPEN(中断)
VDD VCC
GND GND
2、移植ILI9488驱动
这在我的这篇帖子里已经移植好,不再详述:https://bbs.eeworld.com.cn/thread-1231258-1-1.html
3、移植ADS7843驱动。
驱动的原理图如下:
其代码详见源码。
【LVGL移植】
- 下载lvgl源码,官方下载,。
- 下载好后,我们把lvgl文件,直接粘帖到工程的Middlewares止录下:
- 把文件夹的目录添加到工程里面:
< class="p" style="">
< class="p" style="">4、复制lv_port_disp_template.h/c、lv_port_indev_template.h/c到src目录下面,并且重命名为lv_port_disp.h/c、lv_port_indev.h/c。
5、打开lv_port_disp.h,把if 0修改为if 1,同时把文件的引用路径修改为#include “lvgl.h”
- 打开lv_port_disp.c,修改if 0,为if 1。添加lcd屏、的头文件引用,添加hspi1、touch、lcd等的变量的扩展声明。
- 在函数lv_port_disp_init中定义宽的参数,以及刷新缓存的方式
- 修改disp_flush函数为内容如下:
- 在disp_init函数中,加入LCD屏初始化,设置屏有横竖类型,同时修改电阻屏的横竖:
- 重命名lvgl目录下的lvgl_conf_template.h为lvgl_conf.h。
- 打开lvgl_conf.h,修改if 0为if 1,打开代码。
- 为lvgl添加freertos的tick心跳包,在第88行左右,找到#define LV_TICK_CUSTOM,把他修改为1,同时修改内容如下,使得lvgl的心跳包为freertos来提供:
< class="p" style="">#define LV_TICK_CUSTOM 1
< class="p" style="">#if LV_TICK_CUSTOM
< class="p" style="">#define LV_TICK_CUSTOM_INCLUDE "FreeRTOS.h" /*Header for the system time function*/
< class="p" style="">#define LV_TICK_CUSTOM_SYS_TIME_EXPR (xTaskGetTickCount()) /*Expression evaluating to current system time in ms*/
< class="p" style="">/*If using lvgl as ESP32 component*/
< class="p" style="">// #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h"
< class="p" style="">// #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL))
< class="p" style="">#endif /*LV_TICK_CUSTOM*/
- 打开lv_port_indev.h 修改if 0为 if 1打开代码。
- 打开lv_port_indev.c,修改if 0 为if 1, 打开代码,同时添加touch.h的头文件引用:
- 修改touchpad_read函数内容如下:
/*Will be called by the library to read the touchpad*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
static lv_coord_t last_x = 0;
static lv_coord_t last_y = 0;
TP_Scan(0);
if(tp_dev.sta&TP_PRES_DOWN)
{
last_x = tp_dev.x;
last_y = tp_dev.y;
data->point.x = last_x;
data->point.y = last_y;
data->state = LV_INDEV_STATE_PR;
}
else
{
data->point.x = last_x;
data->point.y = last_y;
data->state = LV_INDEV_STATE_REL;
}
}
到此代码的移植全部完成,编译后有些错误提示,可以根据提示来添加头文件的引用等。
【测试代码】
- 在main.c中,我们需要先添加lcd的初始化与电阻屏的初化与较准。
- 在app_freertos.c文件中,我们在任务中添加一个LED的控制程序,添加一个LED及一个开关部件来实现对板载LED红灯的控制。添加一个label标签,用于展示当前的时间,开启一个定时器,在定时器回调函数中刷定时间显示。
【总结】
基于LVGL的移植历经一个星期才完成任务。下面谈谈这项目工程的一些经验与心得。
- STM32U5A5拥有大的flash与大内存,编写lvgl时不需要考虑内存是否足够的情况。
- Stm32CubeIDE提供了强大的编程工具,基础的组件基于图形化的工具配置,减少了开发者的复杂的寄存器的配置。生成基础工程非常之方便。国家厂家比如雅特力、TI等也有图形化的配置工程,但是相比stm32cubeIDE还是没有这么全面与方便。
- Stm32cubeIDE的FreeRTOS的移植也是有软件包,虽然在stm32U5下面没有默认的包,但是可以经过手工安装来实现对freeRTOS的简单配置,使得移植工作也是非常的快捷方便。
- 在LVGL的移植工作中,相比keil的移植,也是有相当大的优势,keil中,需要手工添加非常多的.c文件,与头文件的引用,在stm32cubeIDE中只需要把外部的文件夹拷贝进目录就行了,简单的添加编译的路径与工程里就行了。
附工程源代码:
U5A5ZQ_tft.zip
(12.48 MB, 下载次数: 3)
|