Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
LCD
packages_软件包
驱动
5
缺少常用的LCD驱动软件包
发布于 2021-03-13 15:22:26 浏览:1912
订阅该版
RTTStudio创建的工程现在是不是还没有lcd相关的驱动啊,对于开发板的LCD支持也只有一部分,我用的STM32F407的板子就没有,这款应该说是32里很主流的一款片子了吧 当然可能针对每款显示屏都开发驱动太过繁琐,所以能不能出一个LCD驱动开发的教程之类的,感觉rtt里留的显示驱动接口不是很明了(当然也说明我水平一般。。),但还是希望能有个稍微详细点的说明指导
查看更多
zhkag
2021-03-16
这家伙很懒,什么也没写!
我采用的是正点原子的F767 屏幕使用的是4.3寸的RGB屏,使用成功 我发现在stm32是有LCD设备的 在Kconfig文件中添加 ```c config BSP_USING_LCD bool "Enable LCD" select BSP_USING_LTDC//这是RGB屏中的,TFT屏可以不写 select BSP_USING_SDRAM//407应该使用BSP_USING_SRAM default n ``` 下面是我配置的一些过程需要根据你的实际情况改写,最后附上一些自己根据正点原子的LCD驱动改写的一些显示函数 #### CUBEMX设置 ##### 调试I/O配置 PB5在显示屏中作为背光使用 ![image-20210313164513522.png](https://oss-club.rt-thread.org/uploads/20210316/7811d19d885a86eb6caed80203cfb3df.png) ##### SDRAM配置 在使用显示屏时,用到了SRAM,SDRAM通过FMC接口,与STM32相连。关于FMC与SDRAM不做过多解释,在这仅仅讲解如何通过STM32CubeMX进行配置。SDRAM的配置如下图所示。需要特别注意的是Write recovery time选项,在正点原子中的数值是2。 ![image-20210313165157122.png](https://oss-club.rt-thread.org/uploads/20210316/55beb8a9a62a364aca98c546ec0b8ea1.png) 在对SDRAM的参数选项配置完成后需要改变默认的I/O从而与阿波罗的开发板相对应。更改后的I/O如下图 ![image-20210313165546488.png](https://oss-club.rt-thread.org/uploads/20210316/ab519e52959df7ca786cf63738274649.png) ##### LTDC配置 RGBLCD用的是LTDC,LTDC除了自身外,还需要使能后对时钟进行配置。LTDC的参数配置如下(参数配置跟显示屏有关,可以在正点原子例程中找到对应参数)。 ![image-20210313165756673.png](https://oss-club.rt-thread.org/uploads/20210316/dc2b27ea1187fd4edc55360c3fd16498.png) ![image-20210313165903889.png](https://oss-club.rt-thread.org/uploads/20210316/0ac8b7e81373bb4140298ff8ba1365d1.png) ![eeadfeca5eac6fdfca4361ae2907dbdd.png](https://oss-club.rt-thread.org/uploads/20210316/64489c7920dd864f167219771809b8f7.png) ##### DMA2D使能,设置时钟 ![image-20210313170819401.png](https://oss-club.rt-thread.org/uploads/20210316/5c8c6d20328d694297372ba00df276e1.png) 只改写了部分显示函数,如有需要可自行根据响应格式修改,其中font.h完全复制正点原子的未修改 ##### lcd.h ```c /* * @Author: Aurora-zk * @Date: 2021-03-11 10:29:32 * @LastEditors: Aurora-zk * @LastEditTime: 2021-03-13 17:53:06 * @contact: pk-ing@nyist.edu.cn * @FilePath: \stm32f767-atk-apollo-lcd\board\Custom_Module\lcd\lcd.h */ #ifndef __LCD_H #define __LCD_H #include "main.h" #include "stdlib.h" struct drv_lcd_device { struct rt_device parent; struct rt_device_graphic_info lcd_info; struct rt_semaphore lcd_lock; /* 0:front_buf is being used 1: back_buf is being used*/ rt_uint8_t cur_buf; rt_uint8_t *front_buf; rt_uint8_t *back_buf; }; struct lcd_dev { rt_uint16_t width; rt_uint16_t height; rt_uint8_t dir; rt_uint8_t *framebuffer; }; extern rt_uint16_t POINT_COLOR; extern rt_uint16_t BACK_COLOR; //显示方向定义,以屏幕PCB丝印方向为正方向 #define RtoL 0 //从右到左 #define UtoD 1 //从上到下 #define LtoR 2 //从左到右 #define DtoU 3 //从下到上 //画笔颜色 #define WHITE 0xFFFF #define BLACK 0x0000 #define BLUE 0x001F #define BRED 0XF81F #define GRED 0XFFE0 #define GBLUE 0X07FF #define RED 0xF800 #define MAGENTA 0xF81F #define GREEN 0x07E0 #define CYAN 0x7FFF #define YELLOW 0xFFE0 #define BROWN 0XBC40 //棕色 #define BRRED 0XFC07 //棕红色 #define GRAY 0X8430 //灰色 //GUI颜色 #define DARKBLUE 0X01CF //深蓝色 #define LIGHTBLUE 0X7D7C //浅蓝色 #define GRAYBLUE 0X5458 //灰蓝色 #define LIGHTGREEN 0X841F #define LGRAY 0XC618 #define LGRAYBLUE 0XA651 #define LBBLUE 0X2B12 void LCD_Update(void); void LCD_Display_Dir(rt_uint8_t dir); void LCD_Clear(rt_uint16_t color); void LCD_Fast_DrawPoint(rt_uint16_t x, rt_uint16_t y,rt_uint16_t color); void LCD_DrawPoint(rt_uint16_t x, rt_uint16_t y); void LCD_ShowChar(rt_uint16_t x,rt_uint16_t y,rt_uint8_t num,rt_uint8_t size,rt_uint8_t mode); void LCD_Draw_Circle(rt_uint16_t x0,rt_uint16_t y0,rt_uint8_t r); #endif ``` ##### lcd.c ```c /* * @Author: Aurora-zk * @Date: 2021-03-11 10:19:51 * @LastEditors: Aurora-zk * @LastEditTime: 2021-03-13 17:54:28 * @contact: pk-ing@nyist.edu.cn * @FilePath: \stm32f767-atk-apollo-lcd\board\Custom_Module\lcd\lcd.c */ #include "lcd.h" #include "font.h" #include
rt_uint16_t POINT_COLOR = 0x0000; rt_uint16_t BACK_COLOR = 0xFFFF; struct lcd_dev lcddev; struct drv_lcd_device *lcd; void LCD_Update(void) { lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL); } void LCD_Display_Dir(rt_uint8_t dir) { lcddev.dir = dir; lcddev.framebuffer = lcd->lcd_info.framebuffer; if (lcddev.dir == RtoL || lcddev.dir == LtoR){ lcddev.width = lcd->lcd_info.width; lcddev.height = lcd->lcd_info.height; } else if (lcddev.dir == UtoD || lcddev.dir == DtoU){ lcddev.width = lcd->lcd_info.height; lcddev.height = lcd->lcd_info.width; } } void LCD_Clear(rt_uint16_t color) { for (int i = 0; i < LCD_BUF_SIZE / 2; i++) { lcddev.framebuffer[2 * i] = color % 16; lcddev.framebuffer[2 * i + 1] = color / 16; } LCD_Update(); } void LCD_Fast_DrawPoint(rt_uint16_t x, rt_uint16_t y,rt_uint16_t color) { int i; if (lcddev.dir == RtoL){ i = lcddev.width * y + x; }else if (lcddev.dir == UtoD){ i = (lcddev.width - x - 1) * lcddev.height + y; }else if (lcddev.dir == LtoR){ i = (lcddev.height - y) * lcddev.width - x - 1; }else if (lcddev.dir == DtoU){ i = (x + 1) * lcddev.height - y - 1; } if (i > LCD_BUF_SIZE / 2){ return; } lcddev.framebuffer[2 * i] = color % 16; lcddev.framebuffer[2 * i + 1] = color / 16; } void LCD_DrawPoint(rt_uint16_t x, rt_uint16_t y) { LCD_Fast_DrawPoint(x, y, POINT_COLOR); } void LCD_ShowChar(rt_uint16_t x,rt_uint16_t y,rt_uint8_t num,rt_uint8_t size,rt_uint8_t mode) { rt_uint8_t temp,t1,t; rt_uint16_t y0=y; rt_uint8_t csize=(size/8+((size%8)?1:0))*(size/2); num=num-' '; for(t=0;t
=lcddev.height)return; if((y-y0)==size) { y=y0; x++; if(x>=lcddev.width)return; break; } } } } void LCD_Draw_Circle(rt_uint16_t x0,rt_uint16_t y0,rt_uint8_t r) { int a,b; int di; a=0;b=r; di=3-(r<<1); while(a<=b) { LCD_DrawPoint(x0+a,y0-b); LCD_DrawPoint(x0+b,y0-a); LCD_DrawPoint(x0+b,y0+a); LCD_DrawPoint(x0+a,y0+b); LCD_DrawPoint(x0-a,y0+b); LCD_DrawPoint(x0-b,y0+a); LCD_DrawPoint(x0-a,y0-b); LCD_DrawPoint(x0-b,y0-a); a++; if(di<0)di +=4*a+6; else { di+=10+4*(a-b); b--; } } } void lcd_test() { lcd = (struct drv_lcd_device *)rt_device_find("lcd"); LCD_Display_Dir(RtoL); LCD_Clear(WHITE); POINT_COLOR = BLUE; BACK_COLOR = WHITE; LCD_Draw_Circle(240,136,200); LCD_DrawPoint(1,1); LCD_ShowChar(240,136,'6',32,0); LCD_Update(); rt_thread_mdelay(1000); LCD_ShowChar(240,136,'7',32,1); LCD_Update(); LCD_Display_Dir(DtoU); rt_thread_mdelay(1000); LCD_DrawPoint(1,1); LCD_ShowChar(240,136,'?',32,0); LCD_Update(); } INIT_APP_EXPORT(lcd_test); ```
4
个回答
默认排序
按发布时间排序
tyustli
2021-03-15
这家伙很懒,什么也没写!
这个可以参考一下:https://blog.csdn.net/tyustli/article/details/113957217
StackYuan
认证专家
2021-03-15
这家伙很懒,什么也没写!
可能走8080的LCD屏需要自己动手,大部分走SPI的屏幕基本上不需要自己写驱动了吧
cxhxy12345
2021-03-15
这家伙很懒,什么也没写!
SPI本来就有底层的驱动写好的,每个厂家的芯片也有对应的驱动包提供。但你要在编写一个API接口对接底层的驱动,同时为上层的GUI提供一个接口。这样你就可以通过通用的GUI来绘制LCD显示界面了。但对不同的显示屏,需要修改的就是你的API函数。 建议你用PersimonUI,配合柿饼M3。全程用JS开发,简单快捷高效。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.9k
关于作者
BigAnt
这家伙很懒,什么也没写!
提问
5
回答
2
被采纳
0
关注TA
发私信
相关问题
1
更新软件包 没有自动下载软件包
2
点更新软件包后, 软件包并没有被下载
3
RTT加载软件包的机制是什么
4
mqtt软件包,不支持直接关闭?
5
sr04软件包排他性问题
6
有没有大神移植一个HX711称重芯片模块的软件包
7
【建议】软件包分类增加“算法”类
8
软件包ota_downloader的http_ota解析导致内存释放断言
9
RT-Thread Studio软件包
10
rc522 软件包 问题
推荐文章
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组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
a1012112796
13
个答案
1
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部