Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
LCD
packages_软件包
驱动
5
缺少常用的LCD驱动软件包
发布于 2021-03-13 15:22:26 浏览:2083
订阅该版
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在显示屏中作为背光使用  ##### SDRAM配置 在使用显示屏时,用到了SRAM,SDRAM通过FMC接口,与STM32相连。关于FMC与SDRAM不做过多解释,在这仅仅讲解如何通过STM32CubeMX进行配置。SDRAM的配置如下图所示。需要特别注意的是Write recovery time选项,在正点原子中的数值是2。  在对SDRAM的参数选项配置完成后需要改变默认的I/O从而与阿波罗的开发板相对应。更改后的I/O如下图  ##### LTDC配置 RGBLCD用的是LTDC,LTDC除了自身外,还需要使能后对时钟进行配置。LTDC的参数配置如下(参数配置跟显示屏有关,可以在正点原子例程中找到对应参数)。    ##### DMA2D使能,设置时钟  只改写了部分显示函数,如有需要可自行根据响应格式修改,其中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
被浏览
2.1k
关于作者
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
stm32g030移植RT-Thread
2
CubeMX & RT-Thread Studio 联合开发说明
3
RT-Thread动态模块
4
RT-Thread项目助手v0.3 | Ubuntu与MacOS平台的RT-Thread Env
5
【FRA156测评DM-MCX】- 环境配置篇
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
rt-smart
RTC
FAL
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
Debug
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
lchnu
3
个答案
2
次被采纳
张世争
1
个答案
2
次被采纳
a1012112796
9
个答案
1
次被采纳
三世执戟
8
个答案
1
次被采纳
聚散无由
5
个答案
1
次被采纳
本月文章贡献
jinchanchan
9
篇文章
13
次点赞
ssdd45555
3
篇文章
2
次点赞
聚散无由
1
篇文章
4
次点赞
rvcore
1
篇文章
1
次点赞
lvdongchina
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部