Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
FSMC_FMC_外扩总线
LittlevGL_LVGL
移植 LVGL STM32F407VGT6 8bit FSMC TFT-LCD
发布于 2022-05-09 10:16:45 浏览:4333
订阅该版
[tocm] 我的板子是这样的,MCU是STM32F407VGT6 ![tb_image_share_1652025345850_edit_224568266930835.png](https://oss-club.rt-thread.org/uploads/20220509/8251f64db14ca44708806781791c4275.png.webp) 我的TFT-LCD 是这样的,驱动是ili9486,320x480,8bit并口 ![tb_image_share_1652025279385_edit_224580031517292.png](https://oss-club.rt-thread.org/uploads/20220509/ddce3db838fb15d771e2f724ebfc3000.png.webp) 组合到一起是这样的 ![IMG_20220508_235640.jpg](https://oss-club.rt-thread.org/uploads/20220509/80cd7f3f49823465b04d5e52d7213b7d.jpg.webp) LCD 找卖家要的驱动 ![图片3.png](https://oss-club.rt-thread.org/uploads/20220509/90bbb681178e343624f7e465b77162ff.png) ### **第一步** 第一次移植,不确定问题会在哪发生,所以 Keil + STM32CubeMX 先裸机驱动LCD,验证代码的正确性,减少问题出在LCD这边的可能性。 ### **第二步** 裸机没问题,使用RT-Thread Studio新建工程。 ![图片1.png](https://oss-club.rt-thread.org/uploads/20220509/f923596385f1433fa033ef8927a51bbd.png.webp) 在RT-Thread Studio 里,双击 CubeMX Settings,打开CubeMX进行硬件配置 ![图片2.png](https://oss-club.rt-thread.org/uploads/20220509/1dbfd0119ce8262ff55ead0812d70722.png) 下面是我的配置,Timing的参数先保持CubeMX生成的默认值就好,后面可以慢慢调,调不好LCD没显示的,或者不稳定,不利于移植 ![图片4.png](https://oss-club.rt-thread.org/uploads/20220509/ea4f9de23f2d3a40e325d173a43613dd.png.webp) 时钟、串口、FSMC,设置完,File 菜单,save一下,然后右上角生成 CODE,完事关闭CubeMX。编译一下,应该没有错误。 ### **第三步** 到 https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32f407-atk-explorer/applications/ 下载整个lvgl文件夹,复制到我们工程的applications 文件夹下; 到 https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32f407-atk-explorer/board/ports 下载drv_lcd.c/drv_lcd.h 复制到我们工程的drivers 文件夹下; 还有我们的LCD驱动,建个ili9486文件夹,放到 drivers 文件夹下。 然后我们右键我们的工程,属性->C/C++常规->路径和符号->包含->GNU C,将我们的lvgl、ili9486、lvgl/demo 文件夹加入。 这步总之就是将以上文件(夹)加入工程并确保能够被找到,怎么加,个人随便! ![图片5.png](https://oss-club.rt-thread.org/uploads/20220509/ad8518b8da34bc826c5ccb550163b562.png.webp) ### **第四步** 编辑 drv_lcd.h ```c #define LCD_W 320 //LCD水平宽 #define LCD_H 480 //LCD垂直高 #define LCD_ADDR_BASE 0x60000000 //FSMC地址,命令RAM地址 #define LCD_REGSELECT_BIT 16 #define LCD_ADDR_DATA (LCD_ADDR_BASE + (1 << (LCD_REGSELECT_BIT + 2)) - 2) //数据RAM地址 #define LCD_ADDR_REG LCD_ADDR_BASE //为了方便记忆,改个名 void lcd_fill_array(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, void *pcolor); ``` 编辑 drv_lcd.c 保留 ```c static struct drv_lcd_device _lcd; ``` 以上,及 ```c void lcd_fill_array(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, void *pcolor) {//……} static rt_err_t drv_lcd_init(struct rt_device *device){//……} struct rt_device_graphic_ops fsmc_lcd_ops = {//……} ``` 以下的内容,其它都可以删掉,注意定义的一些结构体,后面少了再加。 ```c static rt_err_t drv_lcd_init(struct rt_device *device) { __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); extern void MX_FSMC_Init(void);//CubeMX生成的,图方便把static去掉了 MX_FSMC_Init(); rt_thread_mdelay(50); ili9486_Init();//驱动程序提供的初始化函数 return RT_EOK; } void lcd_fill_array(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, void *pcolor) { rt_uint16_t *pixel = RT_NULL; pixel = (rt_uint16_t *)pcolor; ili9486_DrawRGBImage(x_start, y_start, x_end-x_start+1, y_end-y_start+1, pixel); } ``` 向给定区域填充内容,内容由 *pcolor 指向,LVGL好像就靠它绘图的。 注意,为社么要 +1 ,因为 3到5,有5-3+1个端点,分别是3,4,5号端点,LCD填充的是点。 ```c struct rt_device_graphic_ops fsmc_lcd_ops = { RT_NULL, RT_NULL, RT_NULL, RT_NULL, RT_NULL}; ``` 直接使用RT_NULL填充,在LVGL当前我没发现有用的地方,有用到参照源文件加就好。 ```c static rt_err_t drv_lcd_control(struct rt_device *device, int cmd, void *args) { struct drv_lcd_device *lcd = LCD_DEVICE(device); switch (cmd) { case RTGRAPHIC_CTRL_GET_INFO: { struct rt_device_graphic_info *info = (struct rt_device_graphic_info *) args; RT_ASSERT(info != RT_NULL); //this needs to be replaced by the customer info->pixel_format = lcd->lcd_info.pixel_format; info->bits_per_pixel = lcd->lcd_info.bits_per_pixel; info->width = LCD_W;//自己LCD的水平宽度 info->height = LCD_H;//自己LCD的垂直高度 } break; } return RT_EOK; } ``` 后面没有需要改的,最后的lcd_fill,需要的话可以用来测试,但要实现LCD_Clear函数,使用驱动提供的 ili9486_FillRect 函数实现一下。 ```c void LCD_Clear(uint16_t color) { ili9486_FillRect(0, 0, LCD_W, LCD_H, color); } ``` 编辑lv_conf.h 具体意义不说了,论坛教程很多,就是注意自己LCD的色彩深度、宽高…… ```c #define LV_COLOR_16_SWAP 0 #define LV_COLOR_DEPTH 16 #define LV_USE_PERF_MONITOR 1 #include
#define LV_HOR_RES_MAX 320 //LCD的水平宽 #define LV_VER_RES_MAX 480 //LCD的垂直高 #define LV_USE_DEMO_RTT_MUSIC 1 #define LV_DEMO_RTT_MUSIC_AUTO_PLAY 1 #define LV_FONT_MONTSERRAT_12 1 #define LV_FONT_MONTSERRAT_16 1 ``` 编辑lv_port_disp.c 这个文件很关键,(个人看法,大佬可以打个脸)本质就是 LVGL 库提供给显示驱动的接口,要完成移植,就的实现这里面的接口。下面是我的实现。 ```c #define MY_DISP_HOR_RES LCD_W //我显示器每行LCD_W个点 static lv_disp_draw_buf_t disp_buf_dsc_2; //可以查看移植模板 static lv_disp_drv_t disp_drv; //注意缓存大了编译会提示RAM超限的,下面是我更具自己应用的实际取的 //每个缓存一次缓存20行,每行[MY_DISP_HOR_RES个点 lv_color_t buf_2_1[MY_DISP_HOR_RES * 20]; //定义了2块缓存 lv_color_t buf_2_2[MY_DISP_HOR_RES * 20]; //定义了2块缓存 //刷新回调函数 static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { //主要就是lcd_fill_array函数的实现,在我们的drv_lcd.c 里面实现的 //画图就靠它 lcd_fill_array(area->x1, area->y1, area->x2, area->y2, color_p); lv_disp_flush_ready(disp_drv); } void lv_port_disp_init(void) { lv_disp_draw_buf_init(&disp_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 10); lv_disp_drv_init(&disp_drv); disp_drv.hor_res = LCD_W; //LCD的水平宽度 disp_drv.ver_res = LCD_H; //LCD的垂直高度 disp_drv.draw_buf = &disp_buf_dsc_2; disp_drv.flush_cb = disp_flush; //回调函数 lv_disp_drv_register(&disp_drv); } ``` lv_port_indev.h/c个人不涉及,忽略,如编译有问题,请酌情处理! ### **第五步** 双击打开RT-Thread Setting,软件包->多媒体包->LVGL,勾选LVGL及player demo就好。 ![图片6.png](https://oss-club.rt-thread.org/uploads/20220509/f019afa4fb7660116332589be128a73e.png) 保存,编译,下载,移植完毕。 不会用编辑器,有点乱!
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
ppacctv
这家伙很懒,什么也没写!
文章
1
回答
1
被采纳
0
关注TA
发私信
相关文章
1
LittlevGL + DMA2D 显示图案扭曲
2
LittleVGL2RTT软件包还有在维护吗,测试遇到一些问题求解
3
使用littlevgl2rtt软件包实例运行不成功,emwin正常
4
关于littlevgl2rtt软件包刷频慢的解决方案?
5
移植了littlevGUI之后,用动态 线程去跑例程会卡死
6
lvgl的字体、图片文件如何升级?
7
qemu-vexpress-a9bsp下的littvgl工程可以实现触屏操作吗?
8
LVGL控件刷新死机问题
9
在lvgl上设置一个时间显示的label,一段时间后所有控件消失。
10
littlevgl2rtt和littlevgl的pc模拟器源码不兼容吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部